es搜索排序不正确
沿用该文章里的数据https://www.cnblogs.com/MRLL/p/12691763.html
查询时发现,一模一样的name,但是相关度不一样
GET /z_test/doc/_search { "explain": false, "query": { "match_phrase": { "name": "测试" } } }
结果
{ "took" : 5, "timed_out" : false, "_shards" : { "total" : 5, "successful" : 5, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : 5, "max_score" : 0.5753642, "hits" : [ { "_index" : "z_test", "_type" : "doc", "_id" : "D4eQcnEBf_xjEc-wO9P0", "_score" : 0.5753642, "_source" : { "name" : "测试123" } }, { "_index" : "z_test", "_type" : "doc", "_id" : "2oeLcnEBf_xjEc-wFNK2", "_score" : 0.5753642, "_source" : { "name" : "测试" } }, { "_index" : "z_test", "_type" : "doc", "_id" : "_analyze", "_score" : 0.45840853, "_source" : { "name" : "测试" } }, { "_index" : "z_test", "_type" : "doc", "_id" : "qHeKcnEBvg5mZsCPxwX1", "_score" : 0.3672113, "_source" : { "name" : "测试" } }, { "_index" : "z_test", "_type" : "doc", "_id" : "AVSTcnEBjEFwhOIJHS0S", "_score" : 0.33573607, "_source" : { "name" : "测试1" } } ] } }
查询文档后得知,在相关度分值的计算中有个属性为逆向文档频率,意思为该搜索字段在整个索引的文档里出现的频率,出现的越多所占分值权重越低
参照该文章https://blog.csdn.net/paditang/article/details/79098830
解决办法为用以下查询
GET /z_test/doc/_search?search_type=dfs_query_then_fetch { "explain": false, "query": { "match": { "name": {"query": "测试"} } } }
dfs_query_then_fetch意为使用全局的文档信息打分
默认查询参数为query then fetch
- 发送查询到每个shard
- 找到所有匹配的文档,并使用本地的Term/Document Frequency信息进行打分
- 对结果构建一个优先队列(排序,标页等)
- 返回关于结果的元数据到请求节点。注意,实际文档还没有发送,只是分数
- 来自所有shard的分数合并起来,并在请求节点上进行排序,文档被按照查询要求进行选择
- 最终,实际文档从他们各自所在的独立的shard上检索出来
- 结果被返回给用户
dfs_query_then_fetch
- 预查询每个shard,询问Term和Document frequency
- 发送查询到每隔shard
- 找到所有匹配的文档,并使用全局的Term/Document Frequency信息进行打分
- 对结果构建一个优先队列(排序,标页等)
- 返回关于结果的元数据到请求节点。注意,实际文档还没有发送,只是分数
- 来自所有shard的分数合并起来,并在请求节点上进行排序,文档被按照查询要求进行选择
- 最终,实际文档从他们各自所在的独立的shard上检索出来
- 结果被返回给用户
延伸:
词频:查询字段出现的越多分数越高,如果不在意词在某个字段中出现的频次,而只在意是否出现过,则可以在字段映射中禁用词频统计:
PUT /my_index { "mappings": { "doc": { "properties": { "name": { "type": "string", "index_options": "docs" } } } } }