【问题标题】:ElasticSearch: How to query exact nested arrayElasticSearch:如何查询精确的嵌套数组
【发布时间】:2017-09-08 05:04:55
【问题描述】:

我正在尝试在我的索引中查询某种类型的文档。

我们看下面的文档:

{
  "id": 1,
  "title": "My first Collection",
  "items": [
    {
      "code": "SB",
      "order": 1,
      "random": "something random"
    },
    {
      "code": "BB",
      "order": 2,
      "random": "something random"
    },
    {
      "code": "FO",
      "order": 3,
      "random": "something random"
    },
    {
      "code": "RA",
      "order": 4,
      "random": "something random"
    },
    {
      "code": "FO",
      "order": 5,
      "random": "something random"
    }
  ]
}

items 字段是 nested 字段。

我想查询所有符合确切模式的文章:

{
  "items": [
    {
      "code": "SB",
      "order": 1
    },
    {
      "code": "BB",
      "order": 2
    },
    {
      "code": "FO",
      "order": 3
    },
    {
      "code": "RA",
      "order": 4
    }
  ]
}

查询的文档将包含具有此精确字段组合的所有这 4 个项目。但他们也可以拥有更多。上面描述的文档将匹配查询。

我搜索了整个文档,特别是在嵌套查询部分,但我没有找到任何让它工作的方法。

是否有可能或者我应该实现自己的算法/脚本?

编辑:

我尝试了以下但没有成功:

{
  "query": {
    "nested": {
      "path": "items",
      "query": {
        "bool": {
          "must": [
            {
              "query_string": {
                "query": "items.code:SB AND items.order:1"
              }
            },
            {
              "query_string": {
                "query": "items.code:BB AND items.order:2"
              }
            },
            {
              "query_string": {
                "query": "items.code:FO AND items.order:3"
              }
            }
          ]
        }
      }
    }
  }
}

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    此查询有效:

    {
      "query": {
        "bool": {
          "must": [
            {
              "nested": {
                "path": "items",
                "query": {
                  "bool": {
                    "must": [
                      {
                        "term": {
                          "items.code": "SB"
                        }
                      },
                      {
                        "term": {
                          "items.order": "1"
                        }
                      }
                    ]
                  }
                }
              }
            },
            {
              "nested": {
                "path": "items",
                "query": {
                  "bool": {
                    "must": [
                      {
                        "term": {
                          "items.code": "BB"
                        }
                      },
                      {
                        "term": {
                          "items.order": "2"
                        }
                      }
                    ]
                  }
                }
              }
            },
            {
              "nested": {
                "path": "items",
                "query": {
                  "bool": {
                    "must": [
                      {
                        "term": {
                          "items.code": "FO"
                        }
                      },
                      {
                        "term": {
                          "items.order": "3"
                        }
                      }
                    ]
                  }
                }
              }
            }
          ]
        }
      }
    }
    

    请注意,这基本上是您使用的那个,但为每个子查询指定 nested 而不是整体。

    当您使用 nested 关键字时,您是在告诉 ElasticSearch 尝试在与主文档分离的嵌套文档中进行匹配。当然,以您的示例为例,一个项目不能同时具有所有代码顺序对"SB"-1"BB"-2"FO"-3。但是您可以通过 3 个嵌套查询单独要求它们。

    【讨论】:

      猜你喜欢
      • 2021-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-06
      • 2021-07-21
      相关资源
      最近更新 更多