Резюме: я пытаюсь понять, почему два запроса, которые кажутся очень похожими по сложности, сильно отличаются по скорости выполнения.
Я использую 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
}
}
}