Elasticsearch: Можно ли его использовать, чтобы не писать свой собственный НЛП?(например, заново изобрести колесо) - PullRequest
7 голосов
/ 14 марта 2019

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

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 искать только в поле места в документах. Я могу сделать это для всех полей и выдать супер-пин-указатель поискового запроса ТОЧНО, что нужно пользователю. Но есть ли более простой способ справиться с чем-то подобным, чего мне не хватает?

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

Ответы [ 3 ]

3 голосов
/ 14 марта 2019

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

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

Дальнейший процесс НЛП состоит из разработки модели, обучения этой модели, классификации текстовых данных и т. Д. Я не думаю, что в Elasticsearch есть механизм, который может это сделать (Существует реализация, называемая MLT (More Like This) но я не уверен, как это работает (еще не читал)) .

То, что вы можете сделать, это использоватьasticsearch в качестве источника для вашего механизма НЛП, если вы в конечном итоге создадите его, опять же, для которого вам не нужно реализовывать базовые этапы, как указано выше.

Выможете проверить этот блог , что довольно интересно.

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

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 для каждого слова, используя отправленный вами запрос.Это гарантирует, что вы не получите нежелательных результатов, которые ищете.

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

0 голосов
/ 22 марта 2019

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

0 голосов
/ 14 марта 2019

Это не совсем понятно, но если я хорошо понимаю, вам нужен запрос bool, который объединяет поле поиска по месту для значения Boston и multi_search для двух других полей:

{
  "query" : {
    "bool" : {
      "filter": [{
        "match": {
          "place": "Boston"
        }
      }],
     "must":[{
        "multi_match" : {
  "query":    "Law Firm", 
  "fields": [ "type", "name" ],
  "type": "most_fields"
          }
      }]
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...