我是Elastic Search的新手,但现在已经暂时解决了这个问题:
我想要实现的是一个带有大量分组复选框的过滤搜索(动态提取),例如一组:
我目前拥有的代码(尚未包括所有字段):
$query = Contribute::searchByQuery(["query"=> ["query_string"=> ["query"=> "(grade=>'12' OR '10') AND (syllabus=>'IEB') AND (meta_data=>'1')"]]], null, null, $paginate, $page);
然而,我遇到的问题是,这会使一行与以下值匹配:
解决方案(由于元数据可能会扩展到数千个唯一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);
所以问题是,如何排除默认情况下未指定的任何条款?目前他们只是包括自己。以比第二段代码更简单的方式,我必须明确添加我不想要的内容。
顺便说一句,我是根据用户选择构建这些查询的,因此它不像这些示例那样是静态的。此外,我发现进行数据库检查以查看未包含的条款,以添加到查询中是没有意义的。不是弹性搜索的重点,以避免进行数据库查询吗?
答案 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)