Elasticsearch: JSON, чтобы получить частоту указанного термина c - PullRequest
0 голосов
/ 11 февраля 2020

Я думаю, что это простое приложение, но я не могу найти рецепт в inte rnet.

Можете ли вы предложить JSON запрос для отправки через python в экземпляр Elasticsearch, который бы вернуть частоту определенного c члена в определенном поле?

Я полагаю, что это возможно при некоторой настройке API-интерфейса Term Vector, но это не так просто.

Я бы не против получить как абсолютную частоту, так и номер документа, содержащего термин.

Ответы [ 2 ]

1 голос
/ 11 февраля 2020

Если у вас есть идентификаторы, вы можете использовать Multivectors API https://www.elastic.co/guide/en/elasticsearch/reference/6.8/docs-multi-termvectors.html

curl -X POST "localhost:9200/index/type/_mtermvectors?pretty" -H 'Content-Type: application/json' -d' 
{
    "ids" : ["your_document_id1","your_document_id2"],      
    "parameters": {
        "fields": [
                "your_field"       
        ],
        "term_statistics": true
    }
}
'

Вы можете даже передать искусственный документ с условиями, которые вы хотите проанализировать. Как указано здесь (https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-termvectors.html), убедитесь, что для term_statistics установлено значение true, чтобы вы могли получать эту информацию по своему индексу:

  • общая частота терминов (как часто термин встречается во всех документах)
  • частота документов (количество документов, содержащих текущий термин)
0 голосов
/ 12 февраля 2020

На самом деле существует простое решение, которое выглядит так:

from elasticsearch import Elasticsearch as ES
from copy import deepcopy as copy
import sys

_field = sys.argv[1]
_terms = sys.argv[2:]

_timeout = 60
_gate    = 'some.gate.org/'
_index   = 'some_index'
_client  = ES([_gate],scheme='http',port=80,timeout=_timeout) #or however to get connection

_body= {"doc": {_field: None}, "term_statistics" : True, "field_statistics" : True, "positions": False, "offsets": False}

for term in terms_:
    body   = copy(_body); body["doc"][_field] = term
    result = _client.termvectors(index=_index,body=body)
    print 'documents with', term, ':', result['term_vectors'][_field]['terms'][term]['doc_freq']
    print 'frequency of  ', term, ':', result['term_vectors'][_field]['terms'][term]['ttf']
...