ES按名称查询数据时,相同名称的数据评分不同问题

由于Elasticsearch的分片存储特性,查询时相同名称的数据评分可能不同。解决方法包括与产品团队沟通确保数据均匀分布,或者在查询时使用dfs_query_then_fetch方式统一计算评分,但后者可能影响性能。

问题原因:es索引是分片存储的,查询计算评分的时候,是每个分片单独计算的,所以会出现相同名称的人员评分不同的问题、

解决方案:

1、与产品沟通,当数据量足够大时,每个分片数据近似相同,则各个分片计算出来的评分会很相近

2、查询的时候增加查询条件(dfs_query_then_fetch),不让各个分片单独计算得分,而是统一计算,这样会有一定的性能影响,官方文档也不建议这么做https://www.elastic.co/guide/en/elasticsearch/guide/2.x/relevance-is-broken.html

searchRequest.searchType("dfs_query_then_fetch");
PUT /test2
{
 "settings": {
   "number_of_shards": 5,
   "number_of_replicas": 1
 }, 
  "mappings": {
    "test2": {
      "dynamic_templates": [
        {
          "notanalyzed": {
            "match": "*",
            "match_mapping_type": "string",
            "mapping": {
              "type": "text",
                "analyzer": "ik_max_word",
              "search_analyzer": "ik_smart"
            }
          }
        }
      ]
    }
  }
}

POST /test2/_bulk
{"index":{"_index":"test2","_type":"test2","_id":"d483a79610b943f9892f479e1e4df8081"}}
{"mediaTag":"美国,英国,船"}
{"index":{"_index":"test2","_type":"test2","_id":"d483a79610b943f9892f479e1e4df8082"}}
{"mediaTag":"美国,英国"}
{"index":{"_index":"test2","_type":"test2","_id":"d0ce8c0651024ff5b1114ec263384a7c2"}}
{"mediaTag":"美国,英国,士大夫,船"}
{"index":{"_index":"test2","_type":"test2","_id":"d0ce8c0651024ff5b1114ec263384a7c1"}}
{"mediaTag":"美国,英国,士大夫"}
{"index":{"_index":"test2","_type":"test2","_id":"40fa46a395674f0fab4dcac45d0be2cd3"}}
{"mediaTag":"美国,船"}
{"index":{"_index":"test2","_type":"test2","_id":"25854d6cdd3b424e9ac43f0efd29afd04"}}
{"mediaTag":"英国,船,士大夫"}

GET /test2/_search?search_type=dfs_query_then_fetch
{
  "query": {
    "bool": {
      "must": [
        {"match": {
          "mediaTag": "英国,船"
        }}
      ]
    
    }
    
  }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值