我是Elasticsearch的新手,想为许多句子建立索引以有效地对其进行搜索。 最初,我尝试批量添加索引,但是这对我来说不起作用,所以现在我使用以下(python)代码逐个添加句子:
c = pycurl.Curl()
add_document(c, 'myIndexName', 'someJsonString', 99)
def add_document(c, index_name, js, _id):
c.setopt(c.POST, 1)
c.setopt(c.URL, 'localhost:9200/%s/sentence/%i' % (index_name, _id))
c.setopt(c.POSTFIELDS, json.dumps(js))
c.perform()
我在增加id的地方,一个json输入字符串的例子是:
{"sentence_id": 2, "article_name": "Kegelschnitt", "paragraph_id": 1, "plaintext": "Ein Kegelschnitt ist der zweidimensionale Sonderfall einer Quadrik .", "postags": "Ein/ART Kegelschnitt/NN ist/VAFIN der/ART zweidimensionale/ADJA Sonderfall/NN einer/ART Quadrik/NE ./$."}
到目前为止一切正常,似乎可以正常工作。我怀疑使它以批量导入的方式工作会更有效率,但是由于这是一次性的过程,因此效率不是我的主要考虑。 我使用此查询(在命令行上)以获取索引概述:
curl 'localhost:9200/_cat/indices?v'
哪个给我(用于相关索引)
health status index pri rep docs.count docs.deleted store.size pri.store.size
yellow open wiki_dump_jan2019 5 1 795502 276551 528.1mb 528.1mb
类似地,查询:
curl -XGET 'localhost:9200/wiki_dump_jan2019/sentence/_count?pretty' -H 'Content-Type: application/json' -d '{"query": {"match_all": {}}}'
返回
{
"count" : 795502,
"_shards" : {
"total" : 5,
"successful" : 5,
"failed" : 0
}
}
告诉我索引中有795.502句话。
我的问题是,我总共进行了超过2300万次插入。我意识到可能会有一些重复的句子,但是对此进行了检查,发现了超过2100万个独特的句子。我的python代码执行得很好,没有错误,我检查了elasticsearch日志,但没有发现任何警报。我不确定从索引中删除docs.delete的数量(276.551,请参见上文),但是我知道这可能与重新索引,重复项有关,并且不一定是问题(在任何情况下,情况下,文档和docs.deleted的总数仍远低于我的句子数)。
我唯一能找到的(接近我的问题)是这篇文章:elasticsearch stops indexing new documents after a while, using Tire,但是以下查询:
curl -XGET 'localhost:9200/_nodes/stats/process?filter_path=**.max_file_descriptors'
返回:
{"nodes":{"hoOAMZoCTkOgirg6_aIkUQ":{"process":{"max_file_descr^Ctors":65536}}}}
因此,据我了解,安装后它默认为最大值,这不应该成为问题。
有人能对此有所了解吗?
更新:好的,我想我是个愚蠢的人。我的问题是我在添加/插入过程中使用了句子ID作为索引ID。这个句子ID来自一个特定的文档,因此索引中文档(句子)的最大nr将是最高的句子ID(数据集中最长的文档显然包含795502个句子)。它只会覆盖每个文档之后的所有条目...对不起,浪费您的时间,如果您阅读本文。不是弹性搜索问题;我的python代码中的错误(上面显示的功能之外)。