将过滤器和查询whitin嵌套文档组合在elasticsearch中

时间:2015-07-06 20:31:15

标签: elasticsearch nested

我正在将弹性搜索集成到我们正在构建的应用程序中。我遇到嵌套查询和过滤器的问题。这是我们映射的一个例子:

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

现在,我想找到所有用户"会员资格" " foo bar",没有结束日期。问题是,当我使用标准分析仪时," foo bar"在索引中被分成两个单词,所以我不能使用术语过滤来查找" foo bar"。我们可以通过使用不同的分析仪来解决这个问题,但这有其他缺点,例如上/下案例等问题。

此外:通过" foo bar"很容易找到所有人。使用查询而不是过滤器的成员资格。问题是找不到带有"结束日期"的嵌套文档的查询。 =失踪。有一个过滤器,但我似乎无法结合查询"会员资格" =" foo bar"使用过滤器"结束日期" =在同一嵌套文档中丢失。

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

有没有关于如何解决这个问题的建议?

1 个答案:

答案 0 :(得分: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