zoukankan      html  css  js  c++  java
  • 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值作为随机字符串,这样可以保证同一个搜索条件的请求的返回结果和排序一致。

  • 相关阅读:
    Json对象与Json字符串互转(4种转换方式)
    Web.config配置文件详解
    jQuery BlockUI Plugin Demo 6(Options)
    jQuery BlockUI Plugin Demo 5(Simple Modal Dialog Example)
    jQuery BlockUI Plugin Demo 4(Element Blocking Examples)
    jQuery BlockUI Plugin Demo 3(Page Blocking Examples)
    jQuery BlockUI Plugin Demo 2
    <configSections> 位置引起的错误
    关于jQuery的cookies插件2.2.0版设置过期时间的说明
    jQuery插件—获取URL参数
  • 原文地址:https://www.cnblogs.com/junjiang3/p/9929864.html
Copyright © 2011-2022 走看看