【问题标题】:How to retrieve frequency of a term in elastic search using python?如何使用python在弹性搜索中检索术语的频率?
【发布时间】:2021-03-19 01:46:59
【问题描述】:

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

“天是蓝的。天是蓝的。”

而doc2有一句话,

“飞机在天上飞”。

那么术语“天空”的总频率应该是 3。我找到了这里提到的术语向量: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', u'Unknown key for a START_OBJECT in [term vectors].')

【问题讨论】:

    标签: python elasticsearch


    【解决方案1】:

    出于我的目的,我从不使用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"]
    

    【讨论】:

    • fields=fields 是什么意思?
    • @AmoghMishra 抱歉,我的代码复制速度太快了。 Fields 是我想要返回的所有字段的 var。我已将该列表传递给 mtermvector 方法的字段参数。您可以在文档elasticsearch-py.readthedocs.io/en/master/… 中阅读得更好
    • 什么是vec["term_freq"] 和vec["doc_freq"]?你之前初始化了吗?
    【解决方案2】:

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

    示例:

    PUT /twitter/_doc/1
    {
      "fullname" : "John Doe",
      "text" : "twitter test test test "
    }
    
    PUT /twitter/_doc/2
    {
      "fullname" : "Jane Doe",
      "text" : "Another twitter test ..."
    }
    GET /twitter/_doc/1/_termvectors
    {
      "fields" : ["text"],
      "offsets" : true,
      "payloads" : true,
      "positions" : true,
      "term_statistics" : true,
      "field_statistics" : true
    }
    

    "fields" 应该包含文档中字段的名称("text"、"fullname" 或类似的东西)。这个请求返回所有单词的统计信息。我不确定您是否可以获得所选单词的统计信息

    【讨论】:

      猜你喜欢
      • 2014-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多