如何使用python在弹性搜索中检索术语的频率?

时间:2018-04-29 11:03:04

标签: python elasticsearch

我必须在具有该术语的所有匹配文档中找到当前术语的频率,例如:“sky”。例如:如果doc1有一个句子,

  

“天空是蓝色的。天空是蓝色的。”

和doc2有一个句子,

  

“飞机在天空中飞翔”。

然后术语“天空”的总频率应为3.我发现这里提到的termvectors:https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-termvectors.html 它是Python API,http://elasticsearch-py.readthedocs.io/en/master/api.html?highlight=term%20vector#elasticsearch.Elasticsearch.termvectors

但是当我尝试实施它时:

es.search(index="abc", body={"from":0, "size":0,"term vectors":{"fields":["sky"],"field_statistics":"true"}})

我收到错误:

  

引发HTTP_EXCEPTIONS.get(status_code,TransportError)(status_code,error_message,additional_info)   elasticsearch.exceptions.RequestError:TransportError(400,u'parsing_exception',[术语向量]中START_OBJECT的u'Unknown键。)

2 个答案:

答案 0 :(得分:0)

查看此页面 - > https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-termvectors.html#_behaviour

示例:

(hammer)

“fields”应包含文档中字段的名称(“text”,“fullname”或类似内容)。此请求返回所有单词的统计信息。我不确定您是否可以获取所选单词的统计信息

答案 1 :(得分:0)

出于我的目的,我从不使用termvector,因为我在其他处理后检索统计信息,因此我使用mtermvector。它与termvector相同,但它适用于ID列表。如果您有一份符合" sky"的文件的所有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": {"field":  "sky"}}})     

for res in result['hits']['hits']:
    ids.append(res['_id'])




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"]