【问题标题】:Parent / Child Relationships in Elasticsearch - Returning the results I wantElasticsearch 中的父/子关系 - 返回我想要的结果
【发布时间】:2015-07-31 02:05:15
【问题描述】:

我正在建立一个 Elasticsearch 索引,并希望它以某种方式运行(返回结果)。我已经建立了父/子关系。

curl -XPUT 'http://127.0.0.1:9200/parent/' -d '
{
  "mappings": {
    "parent": {},
    "child": {
      "_parent": {
        "type": "parent" 
      }
    }
  }
} '

我已经用一些“父”文档和一堆“子”文档填充了它,它们的父设置正确。

当我使用普通搜索查询搜索内容时,我当然会取回所有匹配的文档。父子文件,但两者之间没有联系。如果我使用 has_child 过滤器搜索内容,它会正确搜索子文档并将匹配的父文档返回给我:

curl -XGET 'http://127.0.0.1:9200/parent/_search' -d '
{
  "query": {
    "has_child": {
      "type":         "child",
      "query": {
       "match": {
        "detail": "Stuff I Want To Match"
      }
    }
  }
} 
}'

问题是,我想搜索孩子并在一个文档中取回父母和孩子。有没有办法做到这一点?是不是亲子关系搞错了?

【问题讨论】:

  • 通过更新,我只是在查看嵌套对象,我似乎也遇到了同样的问题,除非我弄错了。
  • 不,你不能。您将返回您搜索的对象类型。时期。如果您使用嵌套对象,您可以搜索具有匹配嵌套查询的嵌套属性的顶级文档;您将返回顶级文档,包括嵌套文档的所有,而不仅仅是匹配的文档。你想用一个嵌套的孩子取回父文档类型吗?您必须为父母拥有的每个孩子索引父母+孩子文档。 Elasticsearch 不执行“连接”。
  • 格伦 - 你完全正确。我试图避免每次向其中添加子/嵌套文档时都需要重新索引整个文档......这就是为什么父/子关系起初看起来很有吸引力的原因。我将使用嵌套文档。

标签: json elasticsearch pyelasticsearch


【解决方案1】:

我最近想做同样的事情。我想出将父文档和子文档打印到一个弹性搜索结果中。 但理想情况下,它可能能够将父母和孩子放在一个 json 块中。

这是我现在可以做的,将所有匹配的父文档和子文档放在一起。

curl -XGET 'http://127.0.0.1:9200/indexname/parent,child/_search' -d '
{
   "query": {
      "bool": {
         "should": [
            {
               "has_child": {
                  "type": "child",
                  "query": {
                     "match": {
                        "detail": "Stuff I Want To Match"
                     }
                  }
               }
            },
            {
               "match": {
                  "detail": "Stuff I Want To Match"
               }
            }
         ]
      }
   }
}'

假设您有 1 个父母和 3 个孩子符合您的条件,它将返回 4 个文档。 1 个父文档和 3 个子文档。我猜您可能只想拥有 3 个包含一些父字段和子字段的文档。

这就是我接下来要解决的问题。

希望对你有所帮助。

【讨论】:

  • 你能在父文档上添加匹配过滤器吗?
【解决方案2】:

这可能是最有效的方法,将“inner_hits”用于父/子关系

参考:https://github.com/elastic/elasticsearch/pull/8153

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2023-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-10
  • 1970-01-01
  • 2016-05-06
  • 1970-01-01
相关资源
最近更新 更多