弹性搜索query_string包括未查询的术语

时间:2016-07-24 11:41:42

标签: php elasticsearch laravel-5

我是Elastic Search的新手,但现在已经暂时解决了这个问题:

我想要实现的是一个带有大量分组复选框的过滤搜索(动态提取),例如一组:

  • 年级(8-12),
  • 具有唯一ID的元数据标签(很多),
  • 课程提纲(目前只有两个),
  • 年等。

我目前拥有的代码(尚未包括所有字段):

$query = Contribute::searchByQuery(["query"=> ["query_string"=> ["query"=> "(grade=>'12' OR '10') AND (syllabus=>'IEB') AND (meta_data=>'1')"]]], null, null, $paginate, $page);

然而,我遇到的问题是,这会使一行与以下值匹配:

  • id == 1(来自meta_data => 1 ???),教学大纲== IEB(足够公平),年级== 11(为什么?),meta_data == 1(足够公平)
  • id == 17,教学大纲== IEB(足够公平),年级== 9(为什么),meta_data == 3(为什么?)
  • 然后似乎也包含了所有正确的行

解决方案(由于元数据可能会扩展到数千个唯一ID,因此不可行)正在向所有其他现有术语添加NOT:

$query = Contribute::searchByQuery(["query"=> ["query_string"=> ["query"=> "(grade=>'12' OR '10' NOT '8' NOT '9' NOT '11') AND (syllabus=>'IEB' NOT 'DOE') AND (meta_data=>'1' NOT '2' NOT '3' NOT '4' etc etc etc.)"]]], null, null, $paginate, $page);

所以问题是,如何排除默认情况下未指定的任何条款?目前他们只是包括自己。以比第二段代码更简单的方式,我必须明确添加我不想要的内容。

顺便说一句,我是根据用户选择构建这些查询的,因此它不像这些示例那样是静态的。此外,我发现进行数据库检查以查看未包含的条款,以添加到查询中是没有意义的。不是弹性搜索的重点,以避免进行数据库查询吗?

1 个答案:

答案 0 :(得分:1)

您将PHP代码的语法=>与Lucene query string syntax混合在一起。

(grade=>'12' OR '10') AND (syllabus=>'IEB') AND (meta_data=>'1')

应改为:

(grade:12 OR grade:10) AND (syllabus:IEB) AND (meta_data:1)

请注意,我删除了不必要的引号(当您有空格时,它们通常只是必需的)并将=>替换为:。我还修复了grade=>'12' OR '10'以正确查看等级。没有它,'10'没有与之关联的字段,因此会查看_all field,就像这样:

(grade:12 OR _all:10) AND (syllabus:IEB) AND (meta_data:1)