Добавить фильтр в ElasticSearch Query
Я пытаюсь создать запрос, где пользователь может искать документы ES, где поле бренда равно некоторой строке. Вот запрос, который у меня сейчас есть, который работает, но не имеет фильтрации. Я использую эластичные поисковые рельсы с Ruby on Rails.
@products = Product.search(
query:{
function_score:{
query: {
multi_match: {
fields: ['brand^5', '_all'],
query: "#{query}",
fuzziness: "AUTO"
}
},
field_value_factor:{
field: "popularity",
modifier: "log1p"
}
}
}).page(page).per(25)
Я статически назначил название бренда фильтру для целей тестирования. В этом случае пользователь должен видеть результаты для своего ключевого слова поиска, где название бренда - "NordicTrack".
query:{
function_score:{
query: {
multi_match: {
fields: ['brand^5', '_all'],
query: "#{query}",
fuzziness: "AUTO"
}
},
filter: {
term: {"brand":"NordicTrack"}
},
field_value_factor:{
field: "popularity",
modifier: "log1p"
}
}
}
).page(page).per(25)
Этот запрос дает мне следующую ошибку:
[400] {"error":{"root_cause":[{"type":"parsing_exception","reason":"no [query] registered for [filter]","line":1,"col":139}],"type":"parsing_exception","reason":"no [query] registered for [filter]","line":1,"col":139},"status":400}
Я не уверен, почему это не работает. Любая помощь будет оценена!
2 ответа
Я не уверен, что Elasticsearch-rails с Ruby on Rails анализирует Query. Но я попробовал ниже запрос в Кибане:
GET test/testt/_search
{
"query": {
"filter": {
"term": {
"brand": "NordicTrack"
}
}
}
}
что несколько похоже на вашу часть запроса, которая дает вам ошибку, и я тоже получил ту же ошибку. Но когда я обертываю термин запрос с помощью запроса bool, он возвращает желаемые результаты. Запрос:
GET test/_search
{
"query": {
"bool": {
"filter": {
"term": {
"brand": "NordicTrack"
}
}
}
}
}
Дать ему шанс.
Попробуйте использовать отфильтрованный запрос следующим образом:
query: {
function_score: {
query: {
filtered: {
query: {
multi_match: {
fields: ['brand^5', '_all'],
query: "#{query}",
fuzziness: "AUTO"
}
},
filter: {
term: {
brand: "NordicTrack"
}
}
}
},
field_value_factor:{
field: "popularity",
modifier: "log1p"
}
}
}