Как получить частоту термина в упругом поиске с помощью Python? - PullRequest
0 голосов
/ 29 апреля 2018

Мне нужно найти частоту присутствующего термина во всех соответствующих документах, которые имеют этот термин, например: «небо». Например: если в 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 = термин% 20vector #asticsearch.Elasticsearch.termvectors

Но когда я попытался реализовать это:

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

Я получаю ошибку:

поднять HTTP_EXCEPTIONS.get (код_состояния, ошибка транспорта) (код_состояния, сообщение об ошибке, дополнительная_информация) asticsearch.exceptions.RequestError: TransportError (400, u'parsing_exception ', u'Неизвестный ключ для START_OBJECT в [терминах векторов].')

Ответы [ 2 ]

0 голосов
/ 30 апреля 2018

В своих целях я никогда не использую termvector, потому что я получаю статистику после другой обработки, поэтому я использую mtermvector. Это то же самое, что и termvector, но оно работает со списком идентификаторов. Если у вас есть список всех идентификаторов ваших документов, которые соответствуют «небу», вы можете действовать следующим образом:

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"]
0 голосов
/ 29 апреля 2018

посмотрите на эту страницу -> 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
}

«поля» должны содержать названия ваших полей в документе («текст», «полное имя» или что-то в этом роде). и этот запрос возвращает статистику для всех слов. Я не уверен, что вы можете получить статистику для выбранного слова

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...