Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Elasticsearch不确定是否需要使用布尔查询_Php_Mysql_Search_Laravel_<img Src="//i.stack.imgur.com/RUiNP.png" Height="16" Width="18" Alt="" Class="sponsor Tag Img">elasticsearch - Fatal编程技术网 elasticsearch,Php,Mysql,Search,Laravel,elasticsearch" /> elasticsearch,Php,Mysql,Search,Laravel,elasticsearch" />

Php Elasticsearch不确定是否需要使用布尔查询

Php Elasticsearch不确定是否需要使用布尔查询,php,mysql,search,laravel,elasticsearch,Php,Mysql,Search,Laravel,elasticsearch,我正在为我的Laravel应用程序使用ES,我不确定是否需要使用布尔查询 在我的查询中,我需要执行以下操作: “标题”字段的全文搜索 检查“价格”字段是否在1到9999之间的筛选器 检查“状态”字段是否等于1的筛选器 那么我需要对上面的内容进行布尔查询吗?将标题和状态设置为(必须),将价格设置为(应该) 或者我可以做一些简单的事情,比如: 'filtered' => [ 'filter' => [ ['term' => [ 'status' =>

我正在为我的Laravel应用程序使用ES,我不确定是否需要使用布尔查询

在我的查询中,我需要执行以下操作:

“标题”字段的全文搜索

检查“价格”字段是否在1到9999之间的筛选器

检查“状态”字段是否等于1的筛选器

那么我需要对上面的内容进行布尔查询吗?将标题和状态设置为(必须),将价格设置为(应该)

或者我可以做一些简单的事情,比如:

 '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放在“过滤”框内,要么把一些放在过滤框外。像我的和你的:)