根据我对阅读文档的理解,elasticsearch的工作原理是它计算术语频率*各个术语频率。它将文本转换为某种术语频率词典,其中还包括这些术语最频繁出现的位置的索引。
我想做的不是存储文本,而是存储每一行数据的词频。当我仅上传全文时,搜索效果很好,但在包含10百万密尔页面的完整比例解决方案中,搜索效果不佳。如果文本内容不相关,仅存储术语频率会不会更有效?
编辑:数据的匿名性也很重要,因此我不希望将完整的句子和段落存储在外部。
答案 0 :(得分:1)
出于您的目的,您可以在文本字段中为术语频率实现术语向量。请阅读文档here。 然后,您可以对术语向量使用批量查询,即mtermvector- doc here和python api doc。它适用于ID列表。例如,如果您具有与“天空”匹配的所有文档ID的列表,则可以按照以下方式进行操作:
from elasticsearch import Elasticsearch
es = Elasticsearch()
index = "abc"
my_doc_type ="your_doc_type"
ids = []
result = es.search(index="abc", doc_type= my_doc_type body={"query": {"term": {"my_field": "sky"}}})
for res in in result['hits']['hits']:
ids.append(res['ids'])
for doc in es.mtermvectors(index=index,doc_type=doc_type,body=dict(ids=ids,parameters=dict(term_statistics=True,field_statistics=True,fields=fields)))['docs']:
fields = doc['term_vectors']
terms = field['terms']
tf = vec["term_freq"]
df = vec["doc_freq"]