我是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);
所以问题是,默认情况下如何排除未指定的任何术语?目前,他们只是包括自己。以比第二段代码更简单的方式,我必须显式地添加不需要的内容。
顺便说一句,我是根据用户选择来构建这些查询的,因此它不像这些示例那样静态。另外,我发现进行数据库检查以查看不包含要添加到查询中的术语是毫无意义的。 flex 搜索的重点不是要避免执行数据库查询吗?
最佳答案
您正在将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)
关于php - Elasticsearch query_string包含未查询的术语,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38551627/