在Elasticsearch中存储令牌频率,而不是存储文本

时间:2019-03-04 12:43:09

标签: python elasticsearch tokenize word-frequency

根据我对阅读文档的理解,elasticsearch的工作原理是它计算术语频率*各个术语频率。它将文本转换为某种术语频率词典,其中还包括这些术语最频繁出现的位置的索引。

我想做的不是存储文本,而是存储每一行​​数据的词频。当我仅上传全文时,搜索效果很好,但在包含10百万密尔页面的完整比例解决方案中,搜索效果不佳。如果文本内容不相关,仅存储术语频率会不会更有效?

编辑:数据的匿名性也很重要,因此我不希望将完整的句子和段落存储在外部。

1 个答案:

答案 0 :(得分:1)

出于您的目的,您可以在文本字段中为术语频率实现术语向量。请阅读文档here。 然后,您可以对术语向量使用批量查询,即mtermvector- doc herepython 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"]