Elasticsearch: можно ли с его помощью избежать написания собственного NLP? (например, заново изобрести колесо)

#elasticsearch

#elasticsearch

Вопрос:

Вот упрощенный пример того, чего я пытаюсь достичь — я уверен, что это довольно стандартная вещь, и я надеюсь, что кто-нибудь сможет указать мне правильное направление шаблона, метода, способа сделать это без повторного изобретения колеса.

 PUT /test/vendors/1
{
  "type": "clinic",
  "name": "ENT of Boston",
  "place": "Boston"  
}

PUT /test/vendors/2
{
  "type": "law firm",
  "name": "Ambulance Chasers Inc.",
  "place": "Boston"  

}
  

Допустим, я хочу поддерживать подобные запросы:

 "Ambulance Chasers"
"Law Firm in Boston"
  

Я могу запустить поиск следующим образом:

 GET /test/_search
{
  "query": {
    "multi_match" : {
      "query":    "Law Firm in Boston", 
      "fields": [ "type", "place", "name" ],
      "type": "most_fields"
    }
  }
}
  

дело в том, что это также помогло бы мне, ENT Of Boston потому что у него есть Boston в названии, хотя это явно не то, что я ищу.

Я знаю, что могу написать свой собственный код для анализа строки поиска перед ее отправкой в Elasticsearch и принудительно Boston выполнять поиск только в поле place в документах. Я могу сделать это со всеми полями и выдать поисковый запрос super pin-pointer именно для того, что нужно пользователю. Но есть ли более простой способ справиться с чем-то подобным, чего мне не хватает?

Думаю, я спрашиваю, есть ли способ, которым Elasticseaarch может позволить мне точно настроить и «понять», что я ищу, не заставляя меня глубоко погружаться в обработку естественного языка в моем собственном коде и заново изобретать колесо.

Комментарии:

1. Возможно, Rosette могла бы здесь помочь: rosette.com/elastic/#identity-resolution

Ответ №1:

«Поиск» Elasticsearch основан исключительно на поиске по ключевым словам.

Однако вы получаете некоторый NLP, например, для извлечения или сбора данных, извлечения требуемой информации, токенизации, удаления стоп-слов (все это выполняется анализатором), вычисления подобия (с использованием tf-idf и модели векторного пространства).

Дальнейший процесс NLP состоит в разработке модели, обучении этой модели, классификации текстовых данных и т.д., Для чего, я не думаю, что у Elasticsearch есть движок, который может это сделать (Есть реализация под названием MLT (больше похоже на это), но я не уверен, как это работает (еще не читал ее)).

Что вы можете сделать, так это использовать elasticsearch в качестве исходного кода для вашего движка NLP, если вы в конечном итоге создадите его, опять же, для чего вам не нужно реализовывать базовые этапы, упомянутые выше.

Вы можете заглянуть в этот блог, который довольно интересен.

Несмотря на все сказанное и сделанное, глядя на ваш вариант использования, я пришел к следующему запросу. Я знаю, что это не точное решение, но оно дало бы результат, который вы ищете.

 POST <your_index_name>/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "multi_match": {
            "query": "law",
            "fields": [ "type", "place", "name"],
            "type": "most_fields"
          }
        },
        {
          "multi_match": {
            "query": "firm",
            "fields": [ "type", "place", "name"],
            "type": "most_fields"
          }
        },
        {
          "multi_match": {
            "query": "boston",
            "fields": [ "type", "place", "name"],
            "type": "most_fields"
          }
        }
      ]
    }
  }
} 
  

То, что я сделал, это просто создал предложение must для каждого слова, используя запрос, который вы опубликовали. Это гарантирует вам, что в конечном итоге вы не получите желаемых результатов.

Дайте мне знать, если это поможет!

Комментарии:

1. Спасибо @Kamal, обязательно посмотрю на это.

Ответ №2:

Возможно, я, возможно, слишком упрощаю это, но вы могли бы заставить элементы в поле «места» появляться только после определенных слов, таких как «в».