【问题标题】:Elasticsearch query hits missing documents by search afterElasticsearch 查询通过搜索命中丢失的文档
【发布时间】:2020-08-07 21:16:11
【问题描述】:

我在查询elasticsearch 6.8 时遇到了一点问题。我在文档中有 createdAt 信息,我使用 createdAt 信息进行搜索

我的查询是:

{
  "from": 0,
  "size": 2500,
  "query": {
    "bool": {
      "filter": [
        {
          "bool": {
            "should": [
              {
                "bool": {
                  "must_not": [
                    {
                      "exists": {
                        "field": "uni",
                        "boost": 1
                      }
                    }
                  ],
                  "adjust_pure_negative": true,
                  "boost": 1
                }
              },
              {
                "match": {
                  "uni": {
                    "query": "false",
                    "operator": "OR",
                    "prefix_length": 0,
                    "max_expansions": 50,
                    "fuzzy_transpositions": true,
                    "lenient": false,
                    "zero_terms_query": "NONE",
                    "auto_generate_synonyms_phrase_query": true,
                    "boost": 1
                  }
                }
              }
            ],
            "adjust_pure_negative": true,
            "minimum_should_match": "1",
            "boost": 1
          }
        },
        {
          "exists": {
            "field": "pt",
            "boost": 1
          }
        }
      ],
      "should": [
        {
          "bool": {
            "must_not": [
              {
                "exists": {
                  "field": "del",
                  "boost": 1
                }
              }
            ],
            "adjust_pure_negative": true,
            "boost": 1
          }
        },
        {
          "match": {
            "del": {
              "query": false,
              "operator": "OR",
              "prefix_length": 0,
              "max_expansions": 50,
              "fuzzy_transpositions": true,
              "lenient": false,
              "zero_terms_query": "NONE",
              "auto_generate_synonyms_phrase_query": true,
              "boost": 1
            }
          }
        }
      ],
      "adjust_pure_negative": true,
      "minimum_should_match": "1",
      "boost": 1
    }
  },
  "_source": {
    "includes": [
      "did",
      "ca"
    ],
    "excludes": []
  },
  "sort": [
    {
      "ca": {
        "order": "asc"
      }
    }
  ],
  "search_after": [
    1596545647769
  ]
}

我有一个 100k 文档,但这样我会遇到 99.996 个文档,问题是 totalHits 显示 100.000 但是当我在 kibana 上查询时,它给了我最后一批缺少 4 个文档。例如,我将我的文档作为 2500 个文档批次获取,在最后一个文档中,它应该是从 97.500 到 100.000,但它给了我 99.996。

当我使用包含 2500 个文档批次的搜索滚动 API 进行相同查询时,它给了我 100.000 个文档。

注意:如果我使用搜索滚动,我使用滚动键才能继续。如果我之后使用搜索,我将使用 createdAt 信息来获取下一个文档。 什么会导致这个问题?

【问题讨论】:

  • 是否有任何文档可能包含与 ca 字段完全相同的值?如果是,解决方案就是在 sort 子句中使用另一个 tie break 字段,以便两个具有相同 ca 的文档仍然可以正确排序。
  • 是的,你是对的。我使用 tieBreakerId + createdAt 击中了完成的文档。非常感谢。如果您能够添加评论,我可以接受作为答案。

标签: elasticsearch elasticsearch-query


【解决方案1】:

如果有任何文档可能包含与 ca 字段完全相同的值,那么解决方案是简单地在 sort 子句中使用另一个决胜局字段,以便两个具有相同 ca 的文档值仍然可以正确排序。

像这样:

  "sort": [
    {
      "ca": {
        "order": "asc"
      }
    },
    {
      "tie_breaker_field": {
        "order": "asc"
      }
    }
  ],

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-02-03
    • 2016-08-02
    • 2021-08-27
    • 2015-01-04
    • 2015-12-11
    • 2017-04-02
    • 1970-01-01
    相关资源
    最近更新 更多