【问题标题】:ElasticSearch Relationships弹性搜索关系
【发布时间】:2014-06-27 09:58:06
【问题描述】:

你好朋友请帮帮我...

我对弹性搜索中的关系有一些疑问。

我会用下面的例子来解释我的疑惑

第 1 步: 我在弹性搜索中创建了一个名为“books”的索引

example.com:9200/books/

第 2 步: 然后我创建了一个名为“作者”的类型并插入了数据

POST example.com:9200/books/author/1 { “fname”:“大卫”,“lname”:“托马斯” }

POST example.com:9200/books/author/2 { “fname”:“Hamton”,“lname”:“Vergo” }

第 3 步: 然后为另一个类型“authorbook”创建了一个映射,它是“author”的子类型

POST example.com:9200/books/authorbook/_mapping

{"authorbook":{"_parent":{"type":"author"}}}

第 4 步: 然后我为 authorbook 插入数据

发布 example.com:9200/books/authorbook/100?parent=1 { “书名”:“书名1” }

发布 example.com:9200/books/authorbook/200?parent=1 { “书名”:“书名2” }

POST example.com:9200/books/authorbook/300?parent=2 { “书名”:“书名3” }

步骤:5 然后我为另一个名为 'publisher' 的类型创建了一个映射,它是 authorbook 的子类

POST example.com:9200/books/publisher/_mapping

{"publisher":{"_parent":{"type":"authorbook"}}}

**第 6 步: 然后我为发布者插入数据

POST example.com:9200/books/publisher/50?parent=200 { “publname”:“publisher1” }

POST example.com:9200/books/publisher/51?parent=200 { “publname”:“publisher2” }

POST example.com:9200/books/publisher/52?parent=100 { “publname”:“publisher3” }

第 7 步 现在我已经通过使用带有以下正文的发布请求来获取“作者书”的详细信息

{
"query": {
    "has_parent": {
        "type": "author",
        "query": {
            "filtered": {
                "query": {
                    "match_all": {}
                },
                "filter": {
                    "or": [
                        {
                            "term": {
                                "fname": "Hamton"
                            }
                        },
                        {
                            "term": {
                                "fname": "David"     
                            }
                        }
                    ]
                }
            }
        }
    }
}

}   

我的要求是还获得发布者详细信息..如何实现?请帮忙..

【问题讨论】:

  • 我认为不可能在 ES 上进行递归请求。您可能应该执行第一个请求并将返回的答案用作第二个请求的输入。

标签: elasticsearch


【解决方案1】:

试试这个:

{
"query": {
    "constant_score": {
         "filter": {
             "or": [
                  {
                      "has_parent": {
                          "type": "author",
                           "query": <your query above>
                  },
                  {
                      "has_parent": {
                          "type": "author"
                          "query": {
                              "constant_score": {
                                   "filter": {
                                       "has_parent": {
                                           "type": "authorbook",
                                           "query": <some query you need for the publishers>
                                       }
                                   }
                              }
                          }
                      }
                  }
              ]
          }
     }
}   

这应该会在同一查询中返回作者和出版商。

第一个提示:如果您在filtered 查询中使用"query": {"match_all": {}},您也可以只使用constant_score 查询。然后你只需要提供过滤器。

第二个提示:当索引像publisher 这样的孙子时,最好同时提供routing 查询参数(它应该指向author 的id)。这样可以确保子孙存储在同一个分片中,从而加快查找速度。

一般来说,我建议不要像这样复杂的关系。您可以看到查询很难阅读,并且很可能以后很难调试。也许保持简单可能是更好的解决方案。另一个想法是让authorbook(或者只是book作为父母,publisherauthor作为book的普通(第一级)孩子。原因是authorpublisher不是相关,所以你实际上不需要这种深度嵌套。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-23
    • 1970-01-01
    • 1970-01-01
    • 2018-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多