Php Elasticsearch不确定是否需要使用布尔查询
我正在为我的Laravel应用程序使用ES,我不确定是否需要使用布尔查询 在我的查询中,我需要执行以下操作: “标题”字段的全文搜索 检查“价格”字段是否在1到9999之间的筛选器 检查“状态”字段是否等于1的筛选器 那么我需要对上面的内容进行布尔查询吗?将标题和状态设置为(必须),将价格设置为(应该) 或者我可以做一些简单的事情,比如:Php Elasticsearch不确定是否需要使用布尔查询,php,mysql,search,laravel,
elasticsearch,Php,Mysql,Search,Laravel,
elasticsearch,我正在为我的Laravel应用程序使用ES,我不确定是否需要使用布尔查询 在我的查询中,我需要执行以下操作: “标题”字段的全文搜索 检查“价格”字段是否在1到9999之间的筛选器 检查“状态”字段是否等于1的筛选器 那么我需要对上面的内容进行布尔查询吗?将标题和状态设置为(必须),将价格设置为(应该) 或者我可以做一些简单的事情,比如: 'filtered' => [ 'filter' => [ ['term' => [ 'status' =>
'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,
]
]
]
]
]
],
],
您的设置(理论上)是正确的,但语法有点不正确。首先是理论:
查询用于确定评分和相关性。查询基本上决定了文档的排名和返回顺序
过滤器是简单的包含/排除标准。如果文档与筛选器匹配,则结果中将包含。如果不匹配,则不包括在内。由于过滤器不执行任何评分,因此它们的速度要快得多(并且可以轻松缓存)
因此,对简单的包含/排除标准使用过滤器。并对需要影响分数的任何内容使用查询(如全文搜索)
这意味着您的查询完全正确。但是语法需要一些调整:
'filtered' => [
'filter' => [
'bool' => [
'must' => [
['term' => [ 'status' => 1] ],
[
'range' => [
'price' => [
'gte' => 1,
'lte' => 99999,
]
]
]
]
]
],
'query' => [
'match' => [
'title' => Input::get('query', '')
]
]
]
基本上,filtered
查询的filter
子句接受单个筛选器。由于需要定义两个过滤器(术语和范围),因此需要使用复合bool
过滤器将它们组合在一起。否则,您的语法是正确的
另外,您忘记了match
查询中的“title”字段
注意:我不确定laravel在ES集成方面是如何工作的,但您可能也需要将整个内容放入查询块中。谢谢@Zach,如果您有时间查看,我还更新了第二个查询。它工作得非常完美,我只是想确保在“最佳实践”以及“过滤”包装整个查询之后编写它。它仍然可以正常工作,但现在确定这是否是您更新的查询在我看来很好的最佳方式!这个设置——一个过滤+查询/过滤部分——绝对是做事情的理想、最佳实践方式!我不得不问,因为我看到很多人要么把quey->match-text放在“过滤”框内,要么把一些放在过滤框外。像我的和你的:)