ES[7.6.x]学习笔记(九)搜索 (2)

只有5条记录,我们新建一个查询语句,如下:

POST /ik_index/_search { "query":{ "bool":{ "must":[ { "match":{ "desc":"香蕉好吃" } } ] } }, "from":0, "size":10, }

我们查询的条件是desc字段满足香蕉好吃,由于我们使用的ik分词器,查询条件香蕉好吃会被分词为香蕉和好吃,但是5的数据的desc中都有好吃字段,所有5条数据都会被查询出来,我们执行一下,看看结果:

_index _type _id ▲_score id title desc
ik_index   _doc   2   0.98773474   1   香蕉   香蕉真好吃  
ik_index   _doc   1   0.98773474   1   香蕉   香蕉真好吃  
ik_index   _doc   3   0.08929447   1   橘子   橘子真好吃  
ik_index   _doc   4   0.08929447   1   桃子   桃子真好吃  
ik_index   _doc   fEsN-HEBZl0Dh1ayKWZb   0.07893815   1   苹果   苹果真好吃  

哈哈,5条数据全部查询出来了,和我们的预期是一样的,但是,我们需要注意一点的是_score字段,它们的分数是不一样的,我们的查询条件是香蕉好吃,所以既包含香蕉又包含好吃的数据分数高,我们看到分数到了0.98,而另外3条数据只匹配了好吃,所以分数只有0.7,0.8。

Boosting Query

这个查询比较有意思,它有两个关键词positive和negative,positive是“正”,所有满足positive条件的数据都会被查询出来,negative是“负”,满足negative条件的数据并不会被过滤掉,而是会扣减分数。那么扣减分数要扣减多少呢?这里边有另外一个字段negative_boost,这个字段是得分的系数,它的分数在0~1之间,满足了negative条件的数据,它们的分数会乘以这个系数,比如这个系数是0.5,原来100分的数据如果满足了negative条件,它的分数会乘以0.5,变成50分。我们看看下面的例子,

POST /ik_index/_search { "query": { "boosting": { "positive": { "term": { "desc": "好吃" } }, "negative": { "term": { "desc": "香蕉" } }, "negative_boost": 0.5 } } }

positive条件是好吃,只要desc中有“好吃”的数据都会被查询出来,而negative的条件是香蕉,只要desc中包含“香蕉”的数据都会被扣减分数,扣减多少分数呢?它的得分将会变为原分数*0.5。我们执行一下,看看效果,

index type _id score _source.id source.title source.desc
ik_index   _doc   3   0.08929447   1   橘子   橘子真好吃  
ik_index   _doc   4   0.08929447   1   桃子   桃子真好吃  
ik_index   _doc   fEsN-HEBZl0Dh1ayKWZb   0.07893815   1   苹果   苹果真好吃  
ik_index   _doc   2   0.044647235   1   香蕉   香蕉真好吃  
ik_index   _doc   1   0.044647235   1   香蕉   香蕉真好吃  

我们可以看到前3条数据的分数都在0.09左右,而后两条的数据在0.044左右,很显然,后两条数据中的desc包含香蕉,它们的得分会乘以0.5的系数,所以分数只有前面数据的分数的一半。

全文检索

在前面几节的内容中,我们介绍过,只有字段的类型是text,才会使用全文检索,全文检索会使用到分析器,在我们的ik_index索引中,title和desc字段都是text类型,所以,这两个字段的搜索都会使用到ik中文分词器。全文检索比起前面的组合检索要简单一点,当然,在ES的官方文档中,全文检索中的内容还是挺多的,在这里我们只介绍一个标准的全文检索。

我们看看下面的语句,

POST /ik_index/_search { "query": { "match": { "desc": { "query": "苹果" } } } }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyfgwf.html