Поиск в двух полях на эластичном поиске с кибаной - PullRequest
0 голосов
/ 12 сентября 2018

Предполагая, что у меня есть индекс с двумя полями: title и loc, я хотел бы найти в этих двух полях и получить «лучшее» совпадение. Итак, если у меня есть три предмета:

{"title": "castle", "loc": "something"},
{"title": "something castle something", "loc": "something,pontivy,something"},
{"title": "something else", "loc": "something"}

... Я хотел бы получить второй, который имеет "castle" в title и "pontivy" в loc. Я попытался упростить пример и основу, это немного сложнее. Итак, я попробовал этот запрос, но он кажется не точным (это чувство, которое не очень легко объяснить):

GET merimee/_search/?
{
  "query": {
    "multi_match" : {
      "query":    "castle pontivy", 
      "fields": [ "title", "loc" ] 
    }
  }
}

Это правильный способ поиска в различных полях и получить тот, который соответствует во всех полях?

Не уверен, что мой вопрос достаточно ясен, я могу отредактировать, если потребуется.

РЕДАКТИРОВАТЬ:

История такова: пользователь вводит "castle pontivy", и я хочу получить "лучший" результат для этого запроса, который является вторым, поскольку он содержит "castle" в "title" и "pontivy" в "loc" , Другими словами, я хочу получить результат, который имеет лучший результат в обоих полях.

Ответы [ 2 ]

0 голосов
/ 13 сентября 2018

Как и в других опубликованных предложениях, вы можете использовать запрос bool, но он может не работать для вашего варианта использования, поскольку у вас есть одно поле поиска, которое вы хотите запросить по нескольким полям.

Я рекомендую посмотретьв запросе Simple Query String, так как это, скорее всего, даст вам функциональность, которую вы ищете.См .: https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-simple-query-string-query.html

Итак, вы можете сделать что-то похожее на это:

{
  "query": {
    "simple_query_string" : {
        "query": "castle pontivy",
        "fields": ["title", "loc"],
        "default_operator": "and"
    }
  }
}

Так что мы попытаемся дать вам лучшие документы, которые соответствуют обоим терминам в любом из этих полей.Здесь оператор по умолчанию установлен как AND, потому что в противном случае это OR, которое может не дать ожидаемых результатов.

Стоит поэкспериментировать с другими вариантами, доступными и для этого типа запроса.Вы также можете изучить использование запроса Query String, поскольку он обеспечивает большую гибкость, но термин Simple Query String работает очень хорошо для большинства случаев.

0 голосов
/ 12 сентября 2018

Это можно сделать, используя тип запроса bool, а затем сопоставив поля.

  GET _search
  {
   "query": 
    {
     "bool": {"must": [{"match": {"title": "castle"}},{"match": {"loc": "pontivy"}}]
    }
   }
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...