Нечеткий запрос ElasticSearch - программирование
Подтвердить что ты не робот

Нечеткий запрос 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 для получения нечеткого соответствия?

4b9b3361

Ответ 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.