Ответ 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
}
'
Фильтры обычно быстрее, потому что:
- им не нужно забивать документы, просто включать или исключать их
- они могут быть кэшированы и повторно использованы