弹性搜索与过滤器匹配

时间:2015-08-12 22:56:58

标签: elasticsearch

新的弹性搜索,我需要帮助搜索过滤器。例如,我想搜索" Steven Spielberg"在meta_values.meta_value,但仅限于meta_value.meta_name = 'director',而不是meta_value.meta_name = 'producer'等等。下面的查询将匹配" steven spielberg",但它也会在{{1}时匹配}。我基本上希望这个过滤器只搜索导演。

meta_value.meta_name = 'producer'

2 个答案:

答案 0 :(得分:0)

我猜你在elasticsearch中经历了所谓的跨对象匹配。解决方法是nested object

这个概念已在“Elasticsearch:The Definitive Guide"”一书中得到了很好的解释。相关章节为Nested Objects < - 点击链接进行阅读,您无需进一步阅读

基本上,如果您有这样的文档:

{
  "name": "yj",
  "age": 30,
  "friends": [
    {
      "name": "jn",
      "age": 28
    },
    {
      "name": "abao",
      "age": 6
    }
  ]
}

Elasticsearch会将您的文档展平为:

{
  "name": "yj",
  "age": 30,
  "friends.name": ["jn", "abao"],
  "friends.age": [28, 6 ]
}

转型后," jn"并且28丢失了。为避免这种情况,您可以使用Nested object,但必须在预先映射中将该字段声明为nested类型。几乎任何涉及嵌套对象的东西都很麻烦,因为在查询中你必须明确地说你是通过将查询声明为nested来查询嵌套字段,并且还要对嵌套对象中的属性指定path

区别的原因是,nested object是一个独立的文档,而前一个例子在转换后作为普通字段存储在文档中。

答案 1 :(得分:0)

对于这种方法,您可以使用Elasticsearch中的Query String Query功能

这样您就可以将查询框架化为如下所示

{
  "query": {
    "filtered": {
      "query": {
        "query_string": {
          "query": "(meta_values.meta_value:\"Steven Spielberg\" 
                    AND meta_value.meta_name: director) 
                    AND NOT meta_value.meta_name: producer"
        }
      }
    }
  }
}