#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:
Возможно, я, возможно, слишком упрощаю это, но вы могли бы заставить элементы в поле «места» появляться только после определенных слов, таких как «в».