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