Elasticsearch - 如何设置n对n关系

时间:2012-12-18 05:32:26

标签: elasticsearch

我正在尝试创建一个Books库应用程序。用户可以借很多书。一本书可以在其生命周期中借用许多用户。在ElasticSearch中,将有用户文档和书籍文档。如何搜索用户借用的所有图书?

  1. 如果我创建了一个用户手册文档,那么这本书的详细信息会在借书时重复多次。

  2. 如果我在Book文档中有一个数组列出了借用这本书的所有用户,那么该数组对于热门书籍来说将是巨大的。

  3. 哪个更好?还是有一个更简单,更好的解决方案,以上2?

2 个答案:

答案 0 :(得分:1)

主要问题是恕我直言,你想搜索什么?

  1. 如果您想搜索图书(title,isbn ...),请存储图书。
  2. 如果您要搜索用户(姓名,地址,城市...),请存储 用户。
  3. 如果您想搜索借书的用户,那么 存储用户和一系列借来的书籍。
  4. 这意味着,如果您需要1和3,您将存储两次有关您图书的信息(一次是书本类型,另一次是用户类型)。

    如果您需要添加有关借用日期和返回日期的信息,只需将其添加到“结帐”对象数组中即可。

    我可能会这样设计......

    {
      "name":"david",
      "birthdate":"1971-12-26",
      "books":[
        {
          "title":"Star wars",
          "author":"Georges Lucas",
          "borrowdate":"2012-12-18",
          "returndate":null
        },
        {
          "title":"Star Trek",
          "author":"Whatever his name",
          "borrowdate":"2012-07-01",
          "returndate":"2012-08-15"
        }
      ]
    }
    

    有帮助吗?

    大卫。

答案 1 :(得分:0)

在索引中创建三种类型,一种用于Books,一种用于User,一种用于结帐。分别使用“user”和“book”类型存储有关用户和书籍的信息。每次用户签出书籍时,使用“结帐”类型存储包含用户ID和书籍ID的文档。查询用户签出的所有书籍的签出类型以及签出书籍的所有用户。同时,用户和书籍的信息只存储一次。