在特定父级上搜索嵌套文档

时间:2017-10-24 00:06:31

标签: elasticsearch

在我的Elasticsearch索引中,我的book类型有很多pages。使用嵌套文档,我已成功映射关系,我可以索引这样的文档:

PUT /my_index/book/1

{
  "title": "Harry Potter and the Chamber of Secrets",
  "pages": [
    {
      "id": 1,
      "text": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam a metus est. Duis ut est et mi feugiat bibendum feugiat eu tortor. Pellentesque accumsan, eros nec commodo euismod, odio dolor lobortis diam, in pulvinar lacus turpis sed justo. Ut placerat ut nulla sed blandit. Aenean vel turpis erat. Phasellus vehicula laoreet ex, nec dapibus leo tempus vitae. Nulla gravida efficitur metus, in euismod justo placerat sit amet. Maecenas tristique est mauris, sagittis scelerisque turpis suscipit vel. Nullam ultricies sapien sit amet neque aliquam hendrerit sed non nibh."
    },
    {
      "id": 2,
      "text": "Pellentesque facilisis turpis in diam maximus luctus. Mauris leo diam, pellentesque a malesuada vitae, scelerisque at ipsum. Fusce tincidunt neque dui. Nullam ac ex luctus, convallis leo eget, feugiat augue. Cras condimentum, purus eu scelerisque sodales, diam est commodo lectus, at finibus orci turpis nec lectus. Mauris in lectus ut diam finibus pellentesque quis tincidunt urna. Curabitur tristique luctus metus at interdum. Curabitur imperdiet ex vel enim pretium, a convallis velit tempor. Nullam odio eros, tincidunt ut consectetur non, scelerisque eget urna. Fusce placerat dui et odio tempus rutrum. Integer non dui eu ante interdum volutpat. Mauris quis ante sed lacus euismod mattis."
    }
  ]
}

我想查询并获取包含text字段中某个字词的图书中的所有页面。我可以这样做:

POST /my_index/book/_search

{
    "_source": false,
    "query": {
        "nested": {
            "path": "pages",
            "query": {
                "query_string": {
                    "query": "Mundo",
                    "fields": ["pages.text"]
                }
            },
            "inner_hits": {}
        }
    }
}

我的问题是,我无法找到指定我要搜索哪个图书的方法。因为我已经知道我将从哪个图书中搜索所有图书。我试图使用ids查询来执行此操作,但我找不到将它与嵌套查询一起使用的方法。

如何指定我要搜索的图书(本书中的页面),并使响应返回每个页面的所有id值的列表?此id值是对图书中页面页码的引用。

2 个答案:

答案 0 :(得分:0)

我将为您的问题提供另一种数据模型。 我将创建两种类型:

  • A type book
  • A type Page

您将能够创建父/子关系(该书是父级,而该页是孩子的页面)。

您可以对页面类型进行简单查询,然后轻松检索页面的父级。

答案 1 :(得分:0)

您可以在Bool query下合并两个条件,如下所示:

{
  "_source": false,
  "query": {
    "bool": {
      "must": [
        {
          "term": {
            "title": "Harry Potter and the Chamber of Secrets"
          }
        },
        {
          "nested": {
            "path": "pages",
            "query": {
              "query_string": {
                "query": "Mundo",
                "fields": [
                  "pages.text"
                ]
              }
            },
            "inner_hits": {
              "_source": [
                "pages.id"
              ]
            }
          }
        }
      ]
    }
  }
}

可以看出,我已在bool-must(AND条件)下封装了您的嵌套查询,并添加了term,用于定义要过滤的title

第二件事,正如您所描述的那样,您只需要页面ID。因此,在inner_hits下,我添加了"_source": ["id"],它只为您提供了ID(它只是同样的技巧) 您在查询的开头设置了源时执行的操作。

请注意,inner_hits的默认尺寸为10,因此您可能还想在"size": 1000下添加inner_hits