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"
                }
            }
        }
    }
}


 

猜你喜欢

转载自www.cnblogs.com/MRLL/p/12692950.html
今日推荐