我正在使用ES作为我的Laravel应用程序,我需要进行一个只包含过滤器的搜索查询,而不是"文本搜索"但我不确定如何写它。
我必须使用match_all ,例如:
$query = [
'filtered' => [
'query' => [
'match_all' => []
],
'filter'=> [
'bool' => [
'must' => [
[ 'range' => [
'price' => [
'lte' => 9000
]
]
],
],
]
],
],
];
或者像这样:
$query = [
'filtered' => [
'filter'=> [
'bool' => [
'must' => [
[ 'range' => [
'price' => [
'lte' => 9000
]
]
],
],
]
],
],
];
我想要的是仅使用过滤的bool查询而不进行文本搜索。
答案 0 :(得分:1)
实际上,如果未在筛选查询中指定query
部分,则默认使用match_all查询。引用doc:
如果未指定查询,则默认为match_all查询。这个 意味着过滤的查询可以用于包装过滤器,所以 它可以在预期的任何地方使用。
您的第二个查询应该完成这项工作:过滤器必须包含在要使用的filtered
(doc)或constant_score
(doc)个查询中。
如果评分部分对您没用,您可以坚持filtered
查询。
最后一件事:您不必将过滤器嵌套在bool
过滤器中,除非您想将其与其他(s)过滤器结合使用。在您的演示案例中,您可以直接写:
$query = [
'filtered' => [
'filter'=> [
'range' => [
'price' => [
'lte' => 9000
]
]
]
]
];
希望这会有所帮助:)
答案 1 :(得分:1)
它实际上完全相同,因为如果未在子句中指定查询,则默认使用match_all查询。
在查询上下文中,如果您需要使用没有查询的过滤器(例如,匹配收件箱中的所有电子邮件),您可以省略查询:
GET /_search
{
"query": {
"filtered": {
"filter": { "term": { "folder": "inbox" }}
}
}
}
如果未指定查询,则默认使用match_all查询,因此前面的查询等效于以下内容:
GET /_search
{
"query": {
"filtered": {
"query": { "match_all": {}},
"filter": { "term": { "folder": "inbox" }}
}
}
}
在此处查看官方文档:http://www.elastic.co/guide/en/elasticsearch/guide/current/_combining_queries_with_filters.html