Получение общей частоты терминов по всему индексу (Elasticsearch)
Я пытаюсь вычислить общее количество раз, когда конкретный термин встречается по всему индексу (частота сбора терминов). Я попытался сделать это с помощью терминов векторов, однако это ограничено одним документом. Даже в случае терминов, которые существуют в указанном документе, ответ, как представляется, максимально на определенном уровне doc_count (в пределах field_statistics), что заставляет меня сомневаться в его точности.
Запрос:
http://myip:9200/clinicaltrials/trial/AVmk-ky6XMskTDwIwpih/_termvectors?term_statistics=true
Идентификатор документа, который здесь используется, называется "AVmk-ky6XMskTDwIwpih", хотя термин статистика не должен быть специфичным для документа.
Отклик:
Вот что я получаю для термина "рак" для одного из полей:
"cancer" : {
"doc_freq" : 5297,
"ttf" : 10587,
"term_freq" : 1,
"tokens" : [
{
"position" : 15,
"start_offset" : 115,
"end_offset" : 121
}
]
},
Если я суммирую ttf для всех полей, я получу 18915. Тем не менее, фактическая общая частота терминов для "рака" на самом деле составляет 542829. Это заставляет меня полагать, что это ограничивает stats term_vector подмножеством документов в индексе.
Любой совет здесь будет принята с благодарностью.
2 ответа
Причина различий в подсчете заключается в том, что векторы терминов не являются точными, если в рассматриваемом индексе нет одного шарда. Для индексов с несколькими шардами документы распределяются по всему шарду, поэтому возвращаемая частота - не общая, а от случайно выбранного шарда.
Таким образом, возвращаемая частота является относительной мерой, а не абсолютной величиной, которую вы ожидаете. см. раздел "Поведение". Чтобы проверить это, вы можете создать отдельный индекс шарда и запросить частоту (он должен дать вам фактический итог).
Я полагаю, что вам нужно повернуть term_statistics в true в соответствии с документацией эластичного поиска:
Статистика терминов Если установить для term_statistics значение true (по умолчанию false), будет возвращено
общая частота терминов (как часто термин встречается во всех документах)
периодичность документов (количество документов, содержащих текущий термин)
По умолчанию эти значения не возвращаются, поскольку статистика терминов может серьезно повлиять на производительность.
Вы пробовали просто использовать COUNT API? https://www.elastic.co/guide/en/elasticsearch/reference/7.6/search-count.html
Он может возвращать количество совпадений для запроса. Так что что-то вроде этого может сработать.
GET /my_index/_count
{
"query" : {"match": {"my_field": "my_keyword"}
}