ElasticSearch, мульти-совпадение с фильтром?
У меня есть запрос с несколькими совпадениями в ES и вы хотите добавить фильтр.
{
"multi_match" : {
"query" : "this is a test",
"fields" : [ "subject^2", "message" ]
}
}
Каков синтаксис для добавления этого фильтра?
Я пробовал:
{
"multi_match" => {
"query" => "list",
"fields" => [ "username" ]
},
"filter" => {
"term" => { "username" => "slimkicker"}
}
}
Ответы
Ответ 1
В зависимости от того, что вам нужно, вы должны установить фильтр в правильном положении. У вас есть два варианта:
Используйте фильтр верхнего уровня и применяйте его только к результатам поиска, но не к фасетам
{
"query" : {
"multi_match" : {
"query" : "this is a test",
"fields" : [ "subject^2", "message" ]
}
},
"filter" : {
"term" : { "username": "slimkicker" }
}
}
Используйте отфильтрованный запрос и примените фильтр как к результатам поиска, так и к фасетам
{
"query" : {
"filtered" : {
"query" : {
"multi_match" : {
"query" : "this is a test",
"fields" : [ "subject^2", "message" ]
}
},
"filter" : {
"term" : { "username": "slimkicker" }
}
}
}
}
Ответ 2
С Elasticsearch 5 синтаксис изменил на использование запроса bool, например.
{
"from" : 0,
"size" : 10,
"sort" : "publishDate",
"query": {
"bool": {
"must" : {
"multi_match" : {
"query": "wedding",
"type": "most_fields",
"fields": [ "title", "text" ]
}
},
"filter": {
"term": {
"locale": "english"
}
}
}
}
}
Документацию можно найти здесь.
Ответ 3
В соответствии с новой документацией Elasticsearch, формат немного изменился, теперь вы должны использовать bool
и must
и можете применять filter
отдельно от запроса следующим образом,
{
'index' : 'users',
'type' : 'users',
'body' : {
"query" : {
"bool" : {
"must" : {
'multi_match' : {
'fields' : {'source^1', 'first_name^5', 'last_name^4', 'email^3', 'postcode^2', 'telephone', 'address', 'alternate_address'
},
'query' : 'Shahrukh Anwar',
},
},
"filter" : {
"term" : {
'assigned_to' : 125
}
}
}
}
}
}
Ответ 4
Попробуйте это:
[
"index" => 'shop_1', //index_name,
"type" => 'shop', //type_name,
"from" => 0, //offset
"size" => 30, //limit
"body" => [
"query" => [
"bool" => [
"must" => [
"match" => [
"category" => 'men' // results must contain 'men' in category field
]
]
]
],
"_source" => [ // fields to retrieve
"id",
"product_id",
"item_title",
"item_slug",
"item_sku"
],
"sort" => [
[
"_score" => [
"order" => "desc" // order by score desc
]
]
]
],
];