【问题标题】:Elastic Search Matching with a Filter使用过滤器进行弹性搜索匹配
【发布时间】:2015-08-12 22:56:57
【问题描述】:

弹性搜索新手,我需要使用过滤器进行搜索的帮助。例如,我想在meta_values.meta_value 中搜索“史蒂文·斯皮尔伯格”,但只在meta_value.meta_name = 'director' 的位置,而不是在meta_value.meta_name = 'producer' 的位置等。下面的查询将匹配“史蒂文·斯皮尔伯格”,但在meta_value.meta_name = 'producer' 时也匹配.我基本上希望这个过滤器只搜索导演。

{
  "query": {
    "filtered": {
      "query": {
        "match_phrase": {
          "meta_values.meta_value": "steven spielberg"
        }
      },
      "filter": {
        "and": [{
          "term": {
            "meta_values.meta_name": "director"
          }
        }]
      }
    }
  }
}

【问题讨论】:

  • 您能否展示一两个与此问题相关的示例文档?此外,如果您没有使用动态/默认映射,那么很高兴看到您当前的映射是什么。

标签: elasticsearch


【解决方案1】:

我猜你在 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是一个独立的文档,而前一个例子在转换后作为普通字段存储在文档中。

【讨论】:

    【解决方案2】:

    对于这种方法,您可以使用 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"
            }
          }
        }
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-04
      • 1970-01-01
      • 1970-01-01
      • 2020-05-13
      • 1970-01-01
      • 1970-01-01
      • 2019-01-29
      • 1970-01-01
      相关资源
      最近更新 更多