Почему фонетический поиск намного медленнее, чем обычный запрос на совпадение - PullRequest
0 голосов
/ 08 февраля 2019

Резюме: я пытаюсь понять, почему два запроса, которые кажутся очень похожими по сложности, сильно отличаются по скорости выполнения.

Я использую Elastic Search 6.4, и у меня есть поле имени, которое яхотел бы использовать фонетические запросы для.

В качестве примера я профилировал фонетический запрос для поискового термина "Mario" и обнаружил, что Lucene в фоновом режиме выполняет это как SynonymQuery:

        "type": "SynonymQuery",
        "description": "Synonym(person.firstName.phonetic:mYrio person.firstName.phonetic:mari person.firstName.phonetic:mario person.firstName.phonetic:mori person.firstName.phonetic:morio)",

и это занимает около 200 мсек для индекса с ~ 15 миллионами записей.

Поскольку мне казалось, что мой единственный поисковый термин преобразуется в 5 синонимов, я подумал: «Что если я найдуте же 5 терминов без фонетики? Будет ли это так же медленно? "или, другими словами, «не фонетическая часть делает его медленным, а тот факт, что он должен искать несколько синонимов?»

Но оказывается, что я запрашиваю поле без фонетики для «mario mYrio»mari mori morio "это приведет к BooleanQuery (с одним запросом к термину для синонима как дочерний):

        "type": "BooleanQuery",
        "description": "person.firstName:mario person.firstName:mYrio person.firstName:mari person.firstName:mori person.firstName:morio",

, который занимает только 1/10 времени.Обратите внимание: я знаю и понимаю, что эти два запроса дают разные результаты.Я не пытаюсь симулировать фонетический поиск со вторым запросом.я просто хотел посмотреть, будет ли он также медленным, потому что это был запрос с аналогичной сложностью.

для кого-то вроде меня, который только недавно начал использовать Elastic Search, эти два запроса выглядят очень похожими всложность (поиск по 5 терминам с оператором ИЛИ), и я не могу понять, почему одно намного медленнее другого.

Любое понимание будет высоко ценится!

Заранее спасибо!

Относительно Марио

PS: я понял, что это, вероятно, поможет, если я включу два запроса, которые я использовал в этом примере:

первый запрос (фонетический):

{
  "profile": true,
  "size": 1,
  "timeout": "10s",
  "query": {
    "bool": {
      "should": [
        {
          "match": {
            "person.firstName.phonetic": {
              "query": "mario",
              "operator": "OR",
              "prefix_length": 0,
              "max_expansions": 50,
              "fuzzy_transpositions": true,
              "lenient": false,
              "zero_terms_query": "NONE",
              "auto_generate_synonyms_phrase_query": true,
              "boost": 1
            }
          }
        }
      ],
      "adjust_pure_negative": true,
      "boost": 1
    }
  }
}

второй запрос (не фонетический):

{
  "profile": true,
  "size": 1,
  "timeout": "10s",
  "query": {
    "bool": {
      "should": [
        {
          "match": {
            "person.firstName": {
              "query": "mario myrio mari mori morio",
              "operator": "OR",
              "fuzziness": "0",
              "prefix_length": 3,
              "max_expansions": 50,
              "fuzzy_transpositions": true,
              "lenient": false,
              "zero_terms_query": "NONE",
              "auto_generate_synonyms_phrase_query": true,
              "boost": 1
            }
          }
        }
      ],
      "adjust_pure_negative": true,
      "boost": 1
    }
  }
}

1 Ответ

0 голосов
/ 08 февраля 2019

Я бы сказал, что совершенно ясно, в чем разница между этими двумя процессами - rewrite, расширяющим термин mario и существующими синонимами.Этот процесс в основном требует от вас обработки через SynonymGraphFilter, который, как мне кажется, считывает данные о синонимах с диска, что замедляет работу.

В случае логического запроса совпадение проходит по другой цепочке анализатора (что, я считаю,все тот же фонетический, но без синонимов)

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