【问题标题】:Combining filter and query whitin nested document in elasticsearch在elasticsearch中结合过滤器和查询whitin嵌套文档
【发布时间】:2015-07-06 20:31:14
【问题描述】:

我正在将 elasticsearch 集成到我们正在构建的应用程序中。我遇到了嵌套查询和过滤器的问题。这是我们的映射示例:

"index": {
    "mappings": {
        "users": {
            "properties": {
                "membership": {
                    "type": "nested",
                    "properties": {
                        "membership": {
                            "type": "string"
                        },
                        "start date": {
                            "type": "date"
                        },
                        "end date date": {
                            "type": "date"
                        }
                    }
                }
            }
        }
    }
}

现在,我想查找所有具有“membership”“foo bar”的用户,没有结束日期。问题是当我使用标准分析器时,“foo bar”在索引中被分成两个单词,所以我不能使用术语过滤器来查找“foo bar”。我们可以通过使用不同的分析器来解决这个问题,但这还有其他缺点,比如大小写问题等。

此外:使用查询而不是过滤器很容易找到拥有“foo bar”成员资格的每个人。问题是没有查询可以找到“结束日期”=缺失的嵌套文档。有一个过滤器,但我似乎无法在同一个嵌套文档中将查询“membership”=“foo bar”与过滤器“end date”=missing 结合起来。

所以,我可以找到“结束日期”= 失踪的每个人,并且我可以找到所有会员资格“foo bar”的人,但不是每个没有结束日期的人,特别是会员资格“foo bar”。

对于如何解决这个问题有什么建议吗?

【问题讨论】:

    标签: elasticsearch nested


    【解决方案1】:

    这似乎可以做到:

    POST /test_index/_search
    {
       "query": {
          "nested": {
             "path": "membership",
             "query": {
                "bool": {
                   "must": [
                      {
                         "match": {
                            "membership.membership": {
                               "query": "foo bar",
                               "operator": "and"
                            }
                         }
                      },
                      {
                         "filtered": {
                            "filter": {
                               "not": {
                                  "filter": {
                                     "exists": {
                                        "field": "membership.end_date"
                                     }
                                  }
                               }
                            }
                         }
                      }
                   ]
                }
             }
          }
       }
    }
    

    这是我用来设置它的代码(ES 1.5.1):

    http://sense.qbox.io/gist/20a12a71178f0aac4369f52ab0c4c811ba803122

    【讨论】:

      猜你喜欢
      • 2018-05-10
      • 1970-01-01
      • 1970-01-01
      • 2020-09-05
      • 2015-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-06
      相关资源
      最近更新 更多