弹性搜索QUERY_STRING包括术语不查询

问题描述:

我是新与弹性的搜索,但现在已坐这个问题了一会儿:弹性搜索QUERY_STRING包括术语不查询

我试图做到的,是用大量的分组复选框过滤的搜索(即动态提取),如组:

  • 级(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,syllabus == IEB(足够公平),g RADE == 9(原因),meta_data == 3(为什么?)
  • 然后将所有正确的行似乎被包括以及

的溶液(这是不可行的,因为元数据可以扩大成千上万的唯一的ID)不加入到所有其他现有条款:

$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); 

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

顺便说一句,我从用户选择建立这些查询,所以它不像这些例子中的静态。另外,我发现做一个数据库检查来查看没有包含哪些术语,并将其添加到查询中是毫无意义的。 Elastic搜索的重点不在于避免执行db查询吗?

您正在将您的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) 
+0

太感谢了,现在工作正常:d。 最初我删除了引号,但在时间上添加了它作为解决问题的尝试。也有(等级=> 12或等级=> 10),但与(等级=>'12'或'10')相比没有差别,但整个问题似乎来自混乱:与=>,如你所说。发生这种情况是因为我刚刚看到了有关expect =的一般错误,而不是:对于其他部分。 – SwCharlie