Elasticsearch 不确定我是否需要使用 bool 查询
Elasticsearch not sure if i need to use a bool query
我正在为我的 Laravel 应用程序使用 ES,我不确定是否需要使用 bool 查询。
在我的查询中我需要做的:
"title" 字段的全文搜索
检查 "price" 字段是否在 1 - 9999 之间的过滤器
检查 "status" 字段是否等于 1 的过滤器。
所以我需要对上面的东西进行 bool 查询吗?将标题和状态设置为(必须),将价格设置为(应该)
或者我可以简单地做类似的事情:
'filtered' => [
'filter' => [
['term' => [ 'status' => 1] ],
[ 'range' => [
'price' => [
'gte' => 1,
'lte' => 99999,
]
]
],
'query' => [
'match' => Input::get('query', ''),
],
],
],
或更新:
'filtered' => [
'query' => [
'match' => ['title' => Input::get('query')]
],
'filter'=> [
'bool' => [
'must' => [
['term' => [ 'active' => 1] ],
[ 'range' => [
'price' => [
'gte' => 1,
'lte' => 99999,
]
]
]
]
]
],
],
您的设置(理论上)是正确的,但语法有点偏差。先说理论:
查询用于确定评分和相关性。查询基本上决定了文档的排名和它们返回的顺序。
过滤器是简单的 inclusion/exclusion 标准。如果文档与过滤器匹配,则会包含在结果中。如果不匹配……则不包括在内。由于过滤器不执行任何评分,因此它们速度相当快(并且可以轻松缓存)。
因此,对简单的 inclusion/exclusion 条件使用过滤器。并对需要影响分数的任何内容使用查询(如全文搜索)。
这意味着您的查询完全正确。但语法需要一些调整:
'filtered' => [
'filter' => [
'bool' => [
'must' => [
['term' => [ 'status' => 1] ],
[
'range' => [
'price' => [
'gte' => 1,
'lte' => 99999,
]
]
]
]
]
],
'query' => [
'match' => [
'title' => Input::get('query', '')
]
]
]
基本上,filtered
查询的 filter
子句接受单个过滤器。由于您需要定义两个过滤器(term
和 range
),因此您需要使用复合 bool
过滤器将它们组合在一起。否则,您的语法是正确的。
此外,您忘记了 match
查询中的 'title' 字段
注意:我不确定 laravel 在 ES 集成方面如何工作,但您可能也需要将整个内容放在 query
块中。
我正在为我的 Laravel 应用程序使用 ES,我不确定是否需要使用 bool 查询。
在我的查询中我需要做的:
"title" 字段的全文搜索
检查 "price" 字段是否在 1 - 9999 之间的过滤器
检查 "status" 字段是否等于 1 的过滤器。
所以我需要对上面的东西进行 bool 查询吗?将标题和状态设置为(必须),将价格设置为(应该)
或者我可以简单地做类似的事情:
'filtered' => [
'filter' => [
['term' => [ 'status' => 1] ],
[ 'range' => [
'price' => [
'gte' => 1,
'lte' => 99999,
]
]
],
'query' => [
'match' => Input::get('query', ''),
],
],
],
或更新:
'filtered' => [
'query' => [
'match' => ['title' => Input::get('query')]
],
'filter'=> [
'bool' => [
'must' => [
['term' => [ 'active' => 1] ],
[ 'range' => [
'price' => [
'gte' => 1,
'lte' => 99999,
]
]
]
]
]
],
],
您的设置(理论上)是正确的,但语法有点偏差。先说理论:
查询用于确定评分和相关性。查询基本上决定了文档的排名和它们返回的顺序。
过滤器是简单的 inclusion/exclusion 标准。如果文档与过滤器匹配,则会包含在结果中。如果不匹配……则不包括在内。由于过滤器不执行任何评分,因此它们速度相当快(并且可以轻松缓存)。
因此,对简单的 inclusion/exclusion 条件使用过滤器。并对需要影响分数的任何内容使用查询(如全文搜索)。
这意味着您的查询完全正确。但语法需要一些调整:
'filtered' => [
'filter' => [
'bool' => [
'must' => [
['term' => [ 'status' => 1] ],
[
'range' => [
'price' => [
'gte' => 1,
'lte' => 99999,
]
]
]
]
]
],
'query' => [
'match' => [
'title' => Input::get('query', '')
]
]
]
基本上,filtered
查询的 filter
子句接受单个过滤器。由于您需要定义两个过滤器(term
和 range
),因此您需要使用复合 bool
过滤器将它们组合在一起。否则,您的语法是正确的。
此外,您忘记了 match
查询中的 'title' 字段
注意:我不确定 laravel 在 ES 集成方面如何工作,但您可能也需要将整个内容放在 query
块中。