Подтвердить что ты не робот

Как искать термин и соответствовать логическому состоянию

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

http://localhost:9200/index_name/type_name/_search?q=test

Мои документы выглядят так:

{
    "isbn":"9780307414922",
    "name":"Dark of the Night",
    "adult":false
}

Вот мое лучшее предположение о том, как добиться того, что я пытаюсь сделать.

{
    "query_string": {
        "default_field": "_all",
         "query": "test"
    },
    "from": 0,
    "size": 20,
    "terms": {
        "adult": true
    }
}

Однако это приводит к "Parse Failure [Нет парсера для элемента [query_string]]];}]"

Я использую эластичный поиск 0.20.5.

Как я могу сопоставить документы, содержащие поисковый запрос, способом "? q = test" и фильтровать по свойству взрослого документа?

Спасибо заранее.

4b9b3361

Ответ 1

Ваше предложение adult == true должно быть частью query - вы не можете передать в term предложение как параметр верхнего уровня на search.

Таким образом, вы можете добавить его в запрос в качестве предложения запроса, и в этом случае вам нужно присоединиться к предложениям запроса с помощью запроса bool следующим образом:

curl -XGET 'http://127.0.0.1:9200/_all/_search?pretty=1'  -d '
{
   "query" : {
      "bool" : {
         "must" : [
            {
               "query_string" : {
                  "query" : "test"
               }
            },
            {
               "term" : {
                  "adult" : true
               }
            }
         ]
      }
   },
   "from" : 0,
   "size" : 20
}
'

Действительно, хотя предложения запроса должны использоваться для:

  • полнотекстовый поиск
  • которые влияют на оценку релевантности

Однако ваше предложение adult == true не используется для изменения релевантности и не требует полнотекстового поиска. Это больше ответ yes/no, другими словами, он лучше применяется в качестве предложения фильтра.

Это означает, что вам нужно заключить полный текстовый запрос (_all содержит test) в предложение запроса, которое принимает как запрос, так и фильтр: запрос filtered:

curl -XGET 'http://127.0.0.1:9200/_all/_search?pretty=1'  -d '
{
   "query" : {
      "filtered" : {
         "filter" : {
            "term" : {
               "adult" : true
            }
         },
         "query" : {
            "query_string" : {
               "query" : "test"
            }
         }
      }
   },
   "from" : 0,
   "size" : 20
}
'

Фильтры обычно быстрее, потому что:

  • им не нужно забивать документы, просто включать или исключать их
  • они могут быть кэшированы и повторно использованы