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 子句接受单个过滤器。由于您需要定义两个过滤器(termrange),因此您需要使用复合 bool 过滤器将它们组合在一起。否则,您的语法是正确的。

此外,您忘记了 match 查询中的 'title' 字段

注意:我不确定 laravel 在 ES 集成方面如何工作,但您可能也需要将整个内容放在 query 块中。