【问题标题】:Is it possible to chain fquery filters in elastic search with exact matches?是否可以在具有完全匹配的弹性搜索中链接 fquery 过滤器?
【发布时间】:2015-07-20 18:53:13
【问题描述】:

我在编写一个在 elasticsearch 中接受各种搜索参数的方法时遇到了麻烦。我正在处理看起来像这样的查询:

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

使用这种语法,我认为我可以将这些术语链接在一起并以编程方式生成这些查询。我使用的是简单的字符串,如果有像“person_name”这样的术语,我可以将查询分成两部分,然后说“person_name 匹配'JOHN'”和“person_name 匹配'SMITH'”得到准确的结果。

但是,我在问这个问题时遇到了“fquery”: Escaping slash in elasticsearch

我无法使用“and”/“term”过滤器搜索带有斜杠的值,所以我了解到我可以使用 fquery 来搜索完整值,就像这样

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

但是我怎样才能像这样搜索多个项目呢? IT 似乎当我结合 fquery 和我的过滤/过滤/和/术语查询时,我的“和”术语查询被忽略了。使用弹性搜索进行嵌套/链接查询的最佳实践是什么?

正如下面的评论,是的,我可以像这样将 fquery 添加到“and”块中

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

为什么 elasticsearch 也会返回“sub_location”=“new York”的结果?我只想在这里归还“新泽西”。

【问题讨论】:

  • 您应该能够将查询过滤器作为过滤器包含在您的“and”过滤器中,就像您使用术语过滤器一样。
  • 你是对的。我已经用后续问题更新了我的问题

标签: elasticsearch


【解决方案1】:

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

要仅匹配“new jersey”,您可以使用以下版本的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 Tokenizer 和Lowercase Token Filter。请注意,继续使用这种方法需要您重新为所有文档重新编制索引。

【讨论】:

    猜你喜欢
    • 2011-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多