我想在一个字段中搜索“ vision”项目,但是通过在DSL中使用match / match_phrace / term,我只得到了“ vision A”,“ vision B”,“ xx版本”,“ vision”等结果。
我想要的是精确匹配“视觉”应该获得最高分,而包含“视觉”的项目应该排在精确匹配之后。排名应该是:
vision > vision A > vision B > xx version
我检查了Elasticsearch匹配精确术语其中识别出将“索引”更改为“not_analyzed”即可实现精确匹配。但是在我的情况下,不仅需要完全匹配,还需要包含匹配。
在这种情况下我该怎么办?谢谢!
您可以做到的是在q bool/should查询中包含一些约束以控制排名。
bool/should
{ "query": { "bool": { "must": { "match": { "name": "vision" <--- match on vision } }, "should": [ { "term": { "name.keyword": { <--- boost exact matches on keyword field (i.e. "vision") "value": "vision", "boost": 3 } } }, { "prefix": { "name.keyword": { <--- boost prefix matches on keyword field (i.e. "vision A" and "vision B" "value": "vision", "boost": 2 } } } ] } } }
vision
name
name.keyword
keyword
not_analyzed
string