19.理解slop
主要知识点:
- slop的含义(内在原理)
- slop的用法
一、slop的含义是什么?
query string(搜索文本)中的几个term,要经过几次移动才能与一个document匹配,这个移动的次数,就是slop
举例如下:一个query string经过几次移动之后可以匹配到一个document,然后设置slop
假如有如下一句话:hello world, java is very good, spark is also very good.
用java spark进行match phrase去搜索是搜不到这句话的。
下面是java spark的移动过程。
java is very good spark is
java spark
java --> spark
java --> spark
java --> spark
这里的slop,就是3,因为java spark这个短语,spark移动了3次,就可以跟一个doc匹配上了(这个正序的话可以简单理解成他们之间有多少个单词)
这种情况下把slop设置的是3就可以搜索到结果,"slop": 3表示这个搜索请求中最多只允许3次移动,但是如果slop设置的是2,spark最多只允许移动2次,此时跟doc是匹配不上的,那个doc是不会作为结果返回的。
二、slop的用法
GET /forum/article/_search
{
"query": {
"match_phrase": {
"content": {
"query": "spark data",
"slop": 3
}
}
}
}
那如果是倒序的情况呢,也就是说如果搜索spark,java时的移动次数是多少呢,经过测试最小的移动次数是5,也就是只有把 slop 设置为5才能返回这条结果。
GET /forum/article/_search
{
"query": {
"match_phrase": {
"content": {
"query": "data spark",
"slop": 5
}
}
}
}
slop=5的原因如下,以下是移动过程,spark,java要交换位置就要移动2次,所以3+2=5次。
spark is best big data
data spark
--> data/spark
spark <--data
spark --> data
spark --> data
spark --> data
,
三、relevance score测试
GET /forum/article/_search
{
"query": {
"match_phrase": {
"content": {
"query": "java best",
"slop": 15
}
}
}
}
执行结果(部分):
"_id": "2",
"_score": 0.65380025,
"content": "i think java is the best programming language",
"
}
},
{
"_index": "forum",
"_type": "article",
"_id": "5",
"_score": 0.07111243,
"content": "spark is best big data solution based on scala ,an programming language similar to java spark",
从上可以看出:slop搜索下,关键词离的越近,relevance score就会越高。和match_query比较也可以看出这两种搜索方法对应的两个文档的分数差距也不一样,match_phrase搜索时两文档分数差距较大,这是由于match_phrase加入了位置计分的原因。
最后说明:加了slop的phrase match,就是proximity match,近似匹配