Вы можете использовать функцию doc-termvectors эластичного поиска, чтобы получить статистику терминов и их количество. Таким образом, вы можете хранить свой документ, используя сопоставление, и получать статистику термина префикса при запросе. Конечно, этот подход предоставляет вам статистику по терминам для каждого документа результатов, поэтому вам придется объединять ее для всех ваших результатов.
Вот пример для сопоставления, индексированного документа и запроса doc-termvectors
. Вы также можете использовать токенайзер edge-ngram для получения статистики по префиксным терминам.
Mapping :
PUT /my-index
{
"mappings": {
"doc": {
"properties": {
"main_text": {
"type": "text",
"fielddata": true,
"term_vector": "with_positions_offsets_payloads",
"store": true
}
}
}
}
}
Указатель документа :
POST /my-index/doc/1
{
"main_text": "foo bar foo"
}
Получить тервекторы :
POST /my-index/doc/1/_termvectors
Результаты
...
"terms": {
...
"foo": {
"term_freq": 2,
"tokens": [
{
"position": 0,
"start_offset": 0,
"end_offset": 3
},
{
"position": 2,
"start_offset": 8,
"end_offset": 11
}
]
}
...
Редактировать
Если вы хотите получить termvectors
для нескольких документов, вы можете использовать конечную точку _mtermvectors . Он предоставит вам статистику для нескольких документов. Однако он не будет учитывать частоты терминов для всех документов, что, как я понимаю, ваш вопрос, что вы хотите. В качестве решения вы можете сохранить результаты termvectors
в своем эластичном (либо в том же индексе, либо в отдельном), а затем использовать агрегацию для подсчета общего числа терминов.
POST /my-index/doc/_mtermvectors
{
"ids": [
"1",
"2"
],
"parameters": {
"fields": [
"main_text"
],
"term_statistics": true
}
}
Редактировать
Тогда я думаю, что решение состоит в том, чтобы вызвать termvectors
для всех документов и сохранить результаты, то есть все термины и подтермы в другом индексе. Объединяя результаты на основе ваших поисковых запросов, вы получите желаемые результаты.