我将超过3800万个文档(文本字符串)加载到我本地机器上的Elasticsearch索引中。我希望计算每个字符串的长度,并将该值作为 meta数据添加到索引中。
我是否应该在将文档加载到Elasticsearch之前计算字符串长度作为 meta数据?或者,我是否可以在加载之后用计算值更新元数据?
我对Elasticsearch/Kibana比较陌生,这些问题是因为下面的Python实验而产生的:
1.字符串列表形式的数据
mylist = ['string_1', 'string_2',..., 'string_N']
L = [len(s) for s in mylist] # this computation takes about 1 minute on my machine
选项1的缺点是我没有利用Elasticsearch,并且'mylist'占用了很大的内存块。
1.作为Elasticsearch索引的数据,其中'mylist'中的每个字符串都被加载到字段'text'中。
from haystack.document_store.elasticsearch import ElasticsearchDocumentStore
document_store = ElasticsearchDocumentStore(host='localhost', username='', password='', index='myindex')
docs = document_store.get_all_documents_generator()
L = [len(d.text) for d in docs] # this computation takes about 6 minutes on my machine
选项2的缺点是计算时间长,优点是generator()释放了内存,计算时间长,这就是为什么我认为将字符串长度(和其他分析)作为 meta数据存储在Elasticsearch中是一个好的解决方案。
还有其他的选择吗?我错过了什么?
1条答案
按热度按时间b1payxdu1#
如果您想存储整个文档的大小,我建议安装
mapper-size
plugin,它将在_size
字段中存储源文档的大小。如果只想存储源文档的特定字段的大小,则需要采取不同的操作。
我的建议是创建一个ingest pipeline,在索引之前处理每个文档,然后在第一次索引文档时或加载文档后都可以使用这个摄取管道,我将向您展示如何操作。
首先,使用
script
processor创建摄取管道,它将把text
字段中的字符串大小存储在另一个名为textLength
的字段中。因此,如果您已经将文档加载到Elasticsearch中,并希望使用其中一个字段的长度来丰富每个文档,则可以在事后使用Update by Query API来完成,如下所示:
当文档第一次被索引时,也可以在索引时利用摄取管道,只需在索引查询中引用管道,如下所示:
这两种选择都可以,试一试,然后选择最适合你需要的一种。