是否可以使用完全匹配在弹性搜索中链接fquery过滤器?

时间:2015-07-20 18:53:14

标签: elasticsearch

我在编写一个方法时会遇到问题,该方法会在elasticsearch中使用各种搜索参数。我正在使用看起来像这样的查询:

body: 
  {query:
    {filtered: 
      {filter: 
        {and: 
          [
          {term: {some_term: "foo"}}, 
          {term: {is_visible: true}}, 
          {term: {"term_two": "something"}}]
         }
      }
    }
  }

使用这种语法我认为我可以将这些术语链接在一起并以编程方式生成这些查询。我使用简单的字符串,如果有一个像" person_name"我可以将查询拆分为两个并说出#34;其中person_name匹配' JOHN'"并且person_name匹配' SMITH'"获得准确的结果。

然而,我刚刚遇到了" fquery"在问这个问题时: Escaping slash in elasticsearch

我无法使用这个"和" /"术语"过滤搜索带有斜杠的值,所以我了解到我可以使用fquery来搜索完整的值,就像这样

 "fquery": {
     "query": {
        "match": {
           "by_line": "John Smith"

但是如何针对多个项目进行搜索?当我结合fquery和我的过滤/过滤/和/期限查询,我的"和"术语查询被忽略。使用弹性搜索进行嵌套/链接查询的最佳做法是什么?

如下面的评论中所示,是的,我可以添加fquery到"和"像这样阻止

{:filtered=>
  {:filter=>
    {:and=>[
      {:term=>{:is_visible=>true}}, 
      {:term=>{:is_private=>false}}, 
      {:fquery=>
        {:query=>{:match=>{:sub_location=>"New JErsey"}}}}]}}}

为什么elasticsearch还会返回" sub_location" ="纽约"?我想只返回"新球衣"这里。

1 个答案:

答案 0 :(得分:0)

match query分析输入,如果分析后有多个术语,则默认为boolean OR查询。在您的情况下,“New JErsey”会被分析为“new”和“jersey”。您正在使用的match查询将搜索字段“sub_location”的索引值为“new”或“jersey”的文档。这就是为什么您的查询还匹配字段“sub_location”的值为“new York”的文档,因为常用术语“new”。

要仅匹配“新泽西”,您可以使用以下版本的match查询:

{
   "query": {
      "match": {
         "sub_location": {
            "query": "New JErsey",
            "operator": "and"
         }
      }
   }
}

这与字段“sub_location”的值为“New York”的文档不匹配。 但是,它将匹配字段“sub_location”的值为“York New”的文档,因为查询最终会转换为类似"York" AND "New"的布尔查询。如果你对这种行为很好,那就好了,否则进一步阅读。

出现所有这些问题的原因是您使用默认分析器“sub_location”字段,该字段在字边界处打破令牌并对其进行索引。如果您真的不关心部分匹配并希望始终匹配整个字符串,则可以使用custom analyzers来使用Keyword TokenizerLowercase Token Filter。请注意,继续这种方法需要您重新索引所有文档。