• Elasticsearch搜索结果返回不一致问题


    一、背景

    这周在使用Elasticsearch搜索的时候遇到一个,对于同一个搜索请求,会出现top50返回结果和排序不一致的问题。那么为什么会出现这样的问题?

    后来通过百度和google,发现这是因为Elastcisearch的分布式搜索特性导致。Elasticsearch在搜索时,会循环的选择主分片和其副本中的一个来计算和返回搜索结果,而由于主分片和副本中相关统计信息的不同,从而导致了同一个搜索串的评分的不一致,进而导致排序不一样。而造成这种主分片和副本统计信息不一致的具体原因,是因为文档删除时造成的,具体可以参考官方给出的解释:https://www.elastic.co/guide/en/elasticsearch/reference/current/consistent-scoring.html

    二、解决办法

    针对上述问题,Elasticsearch官方也给出了解决方案(https://www.elastic.co/guide/en/elasticsearch/guide/2.x/_search_options.html#_preference),即在搜索时设置preference特性。如下:

    SearchRequestBuilder builder = client.prepareSearch(offLin.index)
    .setTypes(offLin.type)
    .setQuery(queryBuilder)
    .setFetchSource(fetchFields, null)
    .setSize(limit)
    .setPreference("_primary_first");

    那么preference可以取哪些值,每个值的含义是什么呢,可以参考下面解释:

    (1)randomizeacross shards:随机选择分片或其副本查询数据,es的默认方式。

    (2)_local:优先在本地节点上的分片查询数据然后再去其他节点上的分片查询,本地节点没有IO问题但有可能造成负载不均问题。

    (3)_primary:搜索只在主分片执行搜索请求,副本不参与搜索;性能会打折扣,达不到性能的水平扩展。

    (4)_primary_first:优先在主分片执行,如果主分片挂掉,会在副本执行请求。

    (5)_only_node:123 :只在123这个节点执行搜索。

    (6)_prefer_node:123:搜索请求优先在节点123执行。

    (7)_shards:1,2:搜索只在分片2、3执行,可以与_primary参数一起使用如:_shards:2,3;_primary

    (8)随机字符串:指定一个随机字符串,可以保证同样的请求,被分配到同样的副本上面,从而保证同一请求结果的稳定性。我遇到的问题就可以使用这种方式,把搜索串的hash值作为随机字符串,这样可以保证同一个搜索条件的请求的返回结果和排序一致。

  • 相关阅读:
    HtmlAgilityPack
    随笔-20150513
    过滤掉html 标签
    json转换
    第28月第3天 c语言读写文件
    第27月第28天 iOS bundle
    第27月第27天 https
    第27月第25天 clang -rewrite-objc main.m
    第27月第24天 git pull fetch
    第27月第18天 epoll lt et
  • 原文地址:https://www.cnblogs.com/junjiang3/p/9929864.html
Copyright © 2020-2023  润新知