Нечеткий запрос ElasticSearch
Я новичок в ElasticSearch и сейчас изучаю его возможности. Один из них меня интересует - "Нечеткий запрос", который я тестирую и имею проблемы. Вероятно, это фиктивный вопрос, поэтому я предполагаю, что тот, кто уже использовал эту функцию, быстро найдет ответ, по крайней мере, я надеюсь.:)
Кстати, я чувствую, что это может быть связано не только с ElasticSearch, но, возможно, напрямую с Lucene.
Начните с нового индекса с именем "first index", в котором я храню объект "label" со значением "американский футбол". Это запрос, который я использую.
bash-3.2$ curl -XPOST 'http://localhost:9200/firstindex/node/?pretty=true' -d '{
"node" : {
"label" : "american football"
}
}
'
Это результат, который я получаю.
{
"ok" : true,
"_index" : "firstindex",
"_type" : "node",
"_id" : "6TXNrLSESYepXPpFWjpl1A",
"_version" : 1
}
Пока все хорошо, теперь я хочу найти эту запись, используя нечеткий запрос. Это я посылаю:
bash-3.2$ curl -XGET 'http://localhost:9200/firstindex/node/_search?pretty=true' -d '{
"query" : {
"fuzzy" : {
"label" : {
"value" : "american football",
"boost" : 1.0,
"min_similarity" : 0.0,
"prefix_length" : 0
}
}
}
}
'
И вот в результате я получаю
{
"took" : 15,
"timed_out" : false,
"_shards" : {
"total" : 5,
"successful" : 5,
"failed" : 0
},
"hits" : {
"total" : 0,
"max_score" : null,
"hits" : [ ]
}
}
Как вы можете видеть, никакого удара нет. Но теперь, когда я немного уменьшаю значение моего запроса от "Американский футбол" до "Американский footb", как это:
bash-3.2$ curl -XGET 'http://localhost:9200/firstindex/node/_search?pretty=true' -d ' {
"query" : {
"fuzzy" : {
"label" : {
"value" : "american footb",
"boost" : 1.0,
"min_similarity" : 0.0,
"prefix_length" : 0
}
}
}
}
'
Затем я получаю правильный удар по моей записи, поэтому результат:
{
"took" : 0,
"timed_out" : false,
"_shards" : {
"total" : 5,
"successful" : 5,
"failed" : 0
},
"hits" : {
"total" : 1,
"max_score" : 0.19178301,
"hits" : [ {
"_index" : "firstindex",
"_type" : "node",
"_id" : "6TXNrLSESYepXPpFWjpl1A",
"_score" : 0.19178301, "_source" : {
"node" : {
"label" : "american football"
}
}
} ]
}
}
Итак, у меня есть несколько вопросов, связанных с этим тестом:
-
Почему я не получил никакого результата при выполнении запроса со значением, полностью равным моей единственной записи "Американский футбол"
-
Связано ли это с тем, что у меня многословное значение?
-
Есть ли способ получить оценку "подобия" в моем результате запроса, чтобы я мог лучше понять, как найти правильный порог для моих нечетких запросов.
-
Существует страница, посвященная Fuzzy Query на веб-сайте ElasticSearch, но я не уверен, что в ней перечислены все потенциальные параметры, которые я могу использовать для нечеткого запроса. Можно ли найти такой исчерпывающий список?
-
Тот же вопрос для других запросов на самом деле.
-
Есть ли разница между Fuzzy Query и Query String Query с использованием синтаксиса lucene для получения нечеткого соответствия?
Ответы
Ответ 1
1.
Нечеткий запрос работает на терминах. Он не может обрабатывать фразы, потому что он не анализирует текст. Итак, в вашем примере elasticsearch пытается сопоставить термин "американский футбол" с термином "американец" и с термином "футбол". Матч между условиями основан на расстоянии Левенштейна, который используется для расчета оценки подобия. Поскольку у вас есть min_similarity = 0.0, любой термин должен соответствовать любому термину, если расстояние редактирования меньше размера наименьшего члена. В вашем случае термин "американский футбол" имеет размер 17, а термин "американец" имеет размер 8. Расстояние между этими двумя членами равно 9, которое больше размера наименьшего члена 8. Таким образом, это срок отклоняется. Расстояние редактирования "Американская лапка" и "Американский" - 6. Это в основном термин "американец" с 6 дополнениями в конце. Вот почему он дает результаты. С min_similarity = 0.0 почти все, что будет с расстоянием редактирования 7 или меньше. Например, вы даже получите результаты при поиске "aqqqqqq".
2.
Да, как я объяснил выше, это несколько связано с многословными значениями. Если вы хотите найти несколько терминов, посмотрите Fuzzy Like This Query и параметр fuzziness Текстовый запрос
4 и 5.
Обычно лучшим источником информации после elasticsearch.org является исходный код elasticsearch.