Выполнение нечеткого поиска по фразе на самом деле является поиском по «близости». Вместо измерения расстояния Левенштейна между буквами близость между терминами в запросе.
Ваш запрос должен возвращать результаты, если это:
"query" : "john wane~1"
Подробнее о различиях см. здесь: http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl-query-string-query.html#_fuzziness
Редактировать:
Вот конкретный пример отдыха:
Создайте несколько документов
curl -XPUT "http://localhost:9200/test/test/1" -d'
{
"message" : "My best friend is John Wayne, who is yours?"
}'
curl -XPUT "http://localhost:9200/test/test/2" -d'
{
"message" : "My best friend is John Marion Wayne, who is yours?"
}'
curl -XPUT "http://localhost:9200/test/test/3" -d'
{
"message" : "My best friend is John Marion Mitchell Wayne, who is yours?"
}'
Пример наивного запроса, не фраза:
curl -XGET "http://localhost:9200/_search" -d'
{
"query" : {
"query_string": {
"query": "john AND wane~1"
}
}
}'
Как сделать фразовый запрос с span. Обратите внимание, что термины написаны в нижнем регистре, поскольку термин запрос не анализируется. Кроме того, вы можете отрегулировать наклон диапазона, чтобы контролировать, насколько близко друг к другу должен быть каждый член.
curl -XGET "http://localhost:9200/_search" -d'
{
"query" : {
"span_near" : {
"clauses" : [
{ "span_term" : { "message" : "john" } },
{ "span_term" : { "message" : "wayne" } }
],
"slop" : 0,
"in_order" : true
}
}
}'
А теперь вот реальная сделка именно то, что вы ищете.
curl -XGET "http://localhost:9200/_search" -d'
{
"query" : {
"span_near" : {
"clauses" : [
{
"span_multi" : {
"match" : {
"fuzzy" : {
"message" : {
"value" : "john",
"fuzziness" : "1"
}
}
}
}
},
{
"span_multi" : {
"match" : {
"fuzzy" : {
"message" : {
"value" : "wane",
"fuzziness" : "1"
}
}
}
}
}
],
"slop" : 0,
"in_order" : true
}
}
}'
person
ppearcy
schedule
21.06.2014