【ES】学习6-多字段搜索1
本系列的笔记都来自:https://elasticsearch.cn/book/elasticsearch_definitive_guide_2.x/multi-field-search.html
下面的语句通过boost提高了title和author的权重。如果不加boost字段,则title,author,bool会各占1/3的权重。
GET /_search { "query": { "bool": { "should": [ { "match": { "title": { "query": "War and Peace", "boost": 2 }}}, { "match": { "author": { "query": "Leo Tolstoy", "boost": 2 }}}, { "bool": { "should": [ { "match": { "translator": "Constance Garnett" }}, { "match": { "translator": "Louise Maude" }} ] }} ] } } }
最佳字段:指评分时选择多个查询子条件中得到的最高分,而不是做加权平均。用dis_max实现。
{ "query": { "dis_max": { "queries": [ { "match": { "title": "Brown fox" }}, { "match": { "body": "Brown fox" }} ] } } }
如果一个文档的title字段有brown fox,但body字段没有,该文档会得到更高的分数。
而title和body各有一个brown的文档则会得到较低的分数。
如果不用dis_max,则结果会反过来。因为默认的方式对分数做了加权平均,第一个文档的分数会被没有匹配的body拖累。
tie_breaker:中和dis_max和bool
tie_breaker
参数提供了一种 dis_max
和 bool
之间的折中选择,它的评分方式如下:
- 获得最佳匹配语句的评分
_score
。 - 将其他匹配语句的评分结果与
tie_breaker
相乘。 - 对以上评分求和并规范化。
有了 tie_breaker
,会考虑所有匹配语句,但最佳匹配语句依然占最终结果里的很大一部分。
{ "query": { "dis_max": { "queries": [ { "match": { "title": "Quick pets" }}, { "match": { "body": "Quick pets" }} ], "tie_breaker": 0.3 } } }
multi_match:多个字段匹配相同字符串,有best_fields
、 most_fields
和 cross_fields
(最佳字段、多数字段、跨字段)等模式。
{ "multi_match": { "query": "Quick brown fox", "type": "best_fields", #默认值,可不填 "fields": [ "title", "body" ], "tie_breaker": 0.3, "minimum_should_match": "30%" } }
该语句等价于:
{ "dis_max": { "queries": [ { "match": { "title": { "query": "Quick brown fox", "minimum_should_match": "30%" } } }, { "match": { "body": { "query": "Quick brown fox", "minimum_should_match": "30%" } } }, ], "tie_breaker": 0.3 } }
字段名称可以模糊匹配:
{ "multi_match": { "query": "Quick brown fox", "fields": "*_title" } }
单个字段权重提升:
{ "multi_match": { "query": "Quick brown fox", "fields": [ "*_title", "chapter_title^2" ] } }
chapter_title
这个字段的 boost
值为 2
,而其他两个字段 book_title
和 section_title
字段的默认 boost 值为 1
。