ElasticSearch按ID列表随列表大小增加而丢失的文档

时间:2019-07-31 18:33:23

标签: elasticsearch pyelasticsearch

我正在通过一长串ID查询ElasticSearch。我通常将此列表分解为大块,然后使用列表的子集执行查询,然后汇总结果。当我按比例增加列表的大小时,ES似乎缺少文档。对于1000个id的窗口,它将丢失49个文档。对于2000个ID的窗口,它将丢失93个文档。请注意,我不是在更改列表,而只是在更改窗口大小,从而更改要遍历整个列表的查询数。当我手动创建一个不返回任何内容的ID列表,然后在同一查询上使用“ this”列表时,我得到了结果。我知道这些ID实际上存在于ES中,因为当窗口大小为1时,我会得到所有结果,也就是说,我对每个查询都点击一次ES。有没有人遇到过这样的问题?知道什么会导致这种情况吗?

我还尝试过使用scan方法获得相似的结果。

在我的案例中,ES中的对象具有一个称为passage的嵌套字段,其中包含其他字段,例如idother_field

我的代码:

es = Elasticsearch([f'{os.getenv("ES_HOST")}'],
                   http_auth=(f'{os.getenv("ES_USERNAME")}', f'{os.getenv("ES_PASSWORD")}'),
                   port=f'{os.getenv("ES_PORT")}')
results_dict = {}
window = 1
start = 0
end = 0
with tqdm(total=len(passage_ids), desc="Processing ES passage results...") as pbar:
    for _ in range(start, len(passage_ids), window):
        end = start + window if start + window < len(passage_ids) else len(passage_ids)
        subset_passage_ids = passage_ids[start:end]
        query_dict = {
                    "_source": [
                        "_id",
                        "court.id",
                        "court.level",
                        "court.federal"
                    ],
                    "query": {
                        "nested": {
                            "path": "passages",
                            "query": {
                                "terms": {
                                    "passages.id": subset_passage_ids
                                }
                            },
                            "inner_hits": {
                                "_source": [
                                    "passages.id",
                                    "passages.body"
                                ]
                            }
                        }
                    },
                    "size": window
                }
        res = es.search(index='INDEX_NAME', body=query_dict)
        print("Got %d Hits:" % res['hits']['total']['value'])
        # res = elasticsearch.helpers.scan(es,
        #                                  index='INDEX_NAME',
        #                                  query=query_dict,
        #                                  preserve_order=True
        #                                  )
        for q in res['hits']['hits']:
            <DO SOME PROCESSING>

        pbar.update(end - start)
        start = end

我想不出任何原因无法一次性获得所有结果。 在消耗整个window列表之后,我根据passage_ids的大小10262列表passage_ids变化了一些统计信息。

w: window_size
d: documents not retrieved

w = 1
d = (10262-10262) = 0
d/w = 0

w = 2
d = (10262-10262) = 0
d/w

w = 150
d = (10262-10252) = 10
d/w = 0.07

w = 500
d = (10262-10241) = 21
d/w = 0.04

w = 1000
d = (10262-10213) = 49
d/w = 0.05

w = 2000
d = (10262-10169) = 93
d/w = 0.05

w = 3000
d = (10262-10124) = 138
d/w = 0.05

w = 5000
d = (10262-10041) = 221
d/w = 0.04

0 个答案:

没有答案