Elasticsearch: получить частоту фраз в заданном документе

Данные испытаний:

curl -XPUT 'localhost:9200/customer/external/1?pretty' -d '{ "body": "this is a test" }'
curl -XPUT 'localhost:9200/customer/external/2?pretty' -d '{ "body": "and this is another test" }'
curl -XPUT 'localhost:9200/customer/external/2?pretty' -d '{ "body": "this thing is a test" }'

Моя цель - получить частоту фразы в документе.

Я знаю, как получить частоту терминов в документе:

curl -g "http://localhost:9200/customer/external/1/_termvectors?pretty" -d'
{
        "fields": ["body"],
        "term_statistics" : true
}'

И я знаю, как посчитать документы, содержащие заданную фразу (с запросом match_phrase или span_near):

curl -g "http://localhost:9200/customer/_count?pretty" -d'
{
  "query": {
    "match_phrase": {
      "body" : "this is"
      }
    }    
}'

Как я могу получить доступ к частоте фразы?


person Gilles Cuyaubere    schedule 04.10.2017    source источник
comment
Судя по этому обсуждению, похоже, что это невозможно, по крайней мере, на уровне ES: discuss.elastic.co/t/   -  person chilladx    schedule 04.10.2017
comment
Я нашел это обсуждение, но, насколько я понимаю, нет способа получить сумму частот фраз для всех документов, что на самом деле не то, что мне нужно. Вернее фраза freq для одного документа. Я неправильно истолковываю?   -  person Gilles Cuyaubere    schedule 04.10.2017
comment
нам нужна эта статистика для разработки нашей собственной модели оценки, поэтому я думаю, что это статистика для каждого документа, вычисленная во время запроса.   -  person chilladx    schedule 04.10.2017
comment
Да, я ищу статистику по документам. Любая идея о том, как я мог получить его?   -  person Gilles Cuyaubere    schedule 04.10.2017
comment
Насколько велики эти фразы? Если он имеет определенную длину, вы можете использовать черепицу и генерировать все комбинации N-грамм во время индексации. Затем вы можете посмотреть частоты этих токенов.   -  person drjz    schedule 04.10.2017
comment
Нет фиксированного количества слов, но я могу сгенерировать черепицу максимальной длины фразы, а затем использовать фильтры токенов слова в списке фраз, с которыми я хочу сопоставить.   -  person Gilles Cuyaubere    schedule 05.10.2017


Ответы (1)


Вы можете использовать термвекторы. Как написано в документации.

Редактировать возвращаемые значения

Можно запросить три типа значений: информацию о термине, статистику термина и статистику поля. По умолчанию для всех полей возвращается вся информация о терминах и статистика по полям, но не статистика по терминам. Изменить информацию о термине

term frequency in the field (always returned)
term positions (positions : true)
start and end offsets (offsets : true)
term payloads (payloads : true), as base64 encoded bytes

вы должны достичь частоты термина - в примере вы можете видеть, что в документе есть частота для john doe. Обратите внимание, что termvector дублирует занятое место на диске для поля, к которому он применяется.

person Lupanoide    schedule 04.10.2017
comment
Да, но мне нужно, чтобы моя фраза считалась токеном, чтобы получить ее частоту. В приведенном вами примере используется анализатор ключевых слов. Следуя комментарию @drjz, я попытаюсь реализовать собственный анализатор (с черепицей) перед использованием термвекторов. - person Gilles Cuyaubere; 05.10.2017
comment
@Gilles Cuyaubere Нет, абсолютно. Поле вектора термина работает только с текстовым полем, но не с ключевыми словами. Как я предложил вчера, давайте посмотрим на этот пример elastic .co/guide/en/elasticsearch/reference/5.4/ И анализатор запросов per_field с Джоном Доу - person Lupanoide; 05.10.2017
comment
В примере анализатора per_field выбран анализатор ключевых слов elastic.co/guide/en/elasticsearch/reference/5.4/. Таким образом, частота токена John Doe в документе John Doe равна 1. Если мы вернемся к моему примеру, это даст мне частоту этого теста в этом тесте, когда я на самом деле ищу частоту этого в этом тест. - person Gilles Cuyaubere; 05.10.2017
comment
Нет, ты не понимаешь уловки. Если вы хорошо прочитали пример, есть отображение поля fullname. Это не ключевое слово, это текст! но если вам нужна статистика о последовательности слов, например, в вашем случае, вам нужно запрашивать, не разбивая их по пространству, поэтому вы используете токенизатор ключевых слов в качестве анализатора поиска - это не токенизатор поля, как вы сказали! - это не индексный анализатор. Таким образом, вы можете генерировать черепицу только в анализаторах индексов, а запрашивать частоту последовательности слов как одиночный токен в поисковом анализаторе. Обращать внимание! - person Lupanoide; 05.10.2017
comment
Если вы запросите это в конечной точке termvector без использования ключевого слова в качестве анализатора поиска, он вернет в выходной статистике для этого и статистику для is. - person Lupanoide; 05.10.2017