抽取最高分 Disjunctive Max Score
DELETE /demo
PUT /demo/_doc/1
{
"title": "Quick brown rabbits",
"body": "Brown rabbits are commonly seen."
}
PUT /demo/_doc/2
{
"title": "Keeping pets healthy",
"body": "My quick brown fox eats rabbits on a regular basis."
}
doc2 的 body 同时出现了 brown fox
, 理应更匹配, 但是他的 title 中没有任何匹配. should 含有多个条件, 导致最后归总的时候, doc2 的得分不占优势.
针对这种情况, 应该选 doc2 中 body 属性的值来跟其他文档比较, 即, 取最优得分.
GET /demo/_search
{
"query": {
"bool": {
"should": [
{
"match": {
"title": "brown fox"
}
},
{
"match": {
"body": "brown fox"
}
}
]
}
}
}
只看最高分的属性:
GET /demo/_search
{
"query": {
"dis_max": {
"queries": [
{
"match": {
"title": "brown fox"
}
},
{
"match": {
"body": "brown fox"
}
}
]
}
}
}
只看最高分有点过于武断, 如果还需要适当考虑非最高分的属性的影响, 可调这两个参数:
"dis_max": {
"boost": 1.2,
"tie_breaker": 0.1,
-
boost
用来调整最高分属性影响; -
tie_breaker
用来调整非最高分属性的影响;
以上检索被归纳到 multi_match
下:
GET /demo/_search
{
"query": {
"multi_match": {
"query": "brown fox",
"fields": ["*"]
}
}
}
multi_match type | purpose |
---|---|
best_fields |
默认值. 各属性分别检索, 算分只选最高分. 相当于 dis_max
|
most_fields |
各属性分别检索, 算分加总. 相当于 bool: {should: []}
|
phrase phrase_prefix
|
使用短语检索规则的 best_fields
|
cross_fields |
类似于在 _all 上检索 |
https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-multi-match-query.html
https://www.elastic.co/guide/cn/elasticsearch/guide/current/_cross_fields_queries.html