Поиск префикса с подсчетом частоты - PullRequest
0 голосов
/ 01 ноября 2018

В тот момент, когда я индексирую текст, я сохраняю частоту каждого слова в базе данных. Это прекрасно работает, так как все поиски основаны на целых словах, и все возможные поиски известны. Но теперь я хочу добавить опцию поиска префикса (поиск части слова). Я могу получить результаты / попадания из поиска по префиксу сasticsearch, используя это:

GET /my_index/address/_search
{
    "query": {
        "prefix": {
            "main_text": "word_part"
        }
    }
}

см .: https://www.elastic.co/guide/en/elasticsearch/guide/current/prefix-query.html

Это мое текущее отображение:

{
    "my-index":{
        "mappings":{
            "doc":{
                "properties":{
                    "keycounter":{
                        "properties":{
                            "counter": {"type":"integer"},
                            "keyword":{"type":"keyword"}
                         }
                    },
                    "main_text":{
                        "type":"text", 
                        "fielddata":true
                    },
                    "main_text_keycounter":{
                        "properties":{
                            "counter":{
                                "type":"long"
                            },
                            "keyword":{
                                "type":"text", 
                                "fields":{
                                    "keyword":{
                                        "type":"keyword",
                                        "ignore_above":256
                                    }
                                }
                            }
                        }
                    },
                    "time_written":{
                        "type":"date"
                    },
                    "translated_text":{
                        "type":"text",
                        "fielddata":true
                    },
                }
            }
        }
    }
}

Но я не хочу считать частоту для каждого результата, который я получаю, поскольку он будет стоить O (N) для каждого текста. Есть ли какой-нибудь умный способ сохранить / получить подсчет частоты из этого типа поиска с использованиемasticsearch?

Ответы [ 2 ]

0 голосов
/ 13 ноября 2018

Вы можете использовать функцию 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 для всех документов и сохранить результаты, то есть все термины и подтермы в другом индексе. Объединяя результаты на основе ваших поисковых запросов, вы получите желаемые результаты.

0 голосов
/ 13 ноября 2018

Взгляните на этот ответ , предлагающий использовать датчик конечного состояния для ускорения поиска префикса для подсказки завершения . Выглядит довольно аккуратно и заявлено, что эквивалентно использованию Trie

...