【问题标题】:How to store tree data in a Lucene/Solr/Elasticsearch index or a NoSQL db?如何将树数据存储在 Lucene/Solr/Elasticsearch 索引或 NoSQL 数据库中?
【发布时间】:2012-04-15 17:53:12
【问题描述】:

假设我有需要存储在 Lucene 索引中的小树而不是文档。我该怎么做呢?

树中的一个示例节点:

class Node
{
    String data;
    String type;
    List<Node> children;
}

在上面的节点中,“data”成员变量是一个空格分隔的字符串,所以需要全文搜索。 “type”成员变量只是一个单词。

搜索查询将是一棵树本身,它将搜索每个节点中的数据和类型以及树的结构以进行匹配。在匹配子节点之前,查询必须首先匹配父节点的数据和类型。数据值的近似匹配是可以接受的。

索引此类数据的最佳方法是什么?如果 Lucene 不直接支持索引这些数据,那么这可以通过 Solr 或 Elasticsearch 来完成吗?

我快速浏览了一下 neo4j,但它似乎在数据库中存储了整个图形,而不是大量(比如数十亿或数万亿)小树结构的集合。还是我的理解有误?

另外,基于非 Lucene 的 NoSQL 解决方案是否更适合这种情况?

【问题讨论】:

  • 搜索时要查找什么。如果你有 NodeB 作为 NodeA 的子节点,并且 NodeB 有文本 FOO,那么在搜索 FOO 时,是返回 NodeB,还是返回 NodeA?
  • 查询将与树结构和树数据进行匹配。所以如果NodeA中的数据已经匹配,那么NodeB中出现FOO就构成了完全匹配。
  • 你是说FOO必须在NodeA和NodeB中?或者该类型必须在 NodeA 中匹配,但您不在乎类型是否在 NodeB 中匹配。
  • 永远不会孤立地搜索 FOO。查询本身将是一棵树!因此,我们可能会搜索具有 NodeA.data = "BAR" 及其子 NodeB.data = "FOO" 的树。成功的匹配将是所有第一个节点匹配 NodeA(数据和类型)且子节点匹配 NodeB(类型和数据)的树。数据值的近似匹配是可以接受的。
  • neo4j 之类的可能会更好

标签: solr lucene nosql neo4j elasticsearch


【解决方案1】:

有一个项目SIRenhttp://rdelbru.github.io/SIREn 它处理“深入”的树,寻址。内部使用杜威编号 (http://www.ipl.org/div/farq/deweyFARQ.html) ....

【讨论】:

    【解决方案2】:

    此要求和解决方案在此处捕获:Proposal for nested docs

    此设计随后由核心 Lucene 和 Elastic Search 实现。 BlockJoinQuery 是 Lucene 的核心实现,Elastic Search 看起来有一个如下所述的实现:Elastic search nested docs

    【讨论】:

    • 谢谢,ES/Lucene 中的原生解决方案比任何“hacky”解决方案都要好!
    【解决方案3】:

    另一种方法是在树中存储当前节点位置的表示。例如,第 14 棵树的第 1 层节点的第 3 层第 2 层节点的第 17 片叶子将表示为 014.001.003.017

    假设“treepath”是树位置的字段名称,您将查询“treepath:014*”以查找第 14 棵树中的所有节点和叶子。同样,要查找第 14 棵树的所有子树,您可以查询“treepath:014.*”。

    这种方法的主要问题是移动分支需要在被移动的分支之后重新排序每个分支。如果你的树是相对静态的,这在实践中可能只是一个小问题。

    (我见过这种方法称为“路径枚举”或“杜威十进制”表示。)

    【讨论】:

    • 谢谢马克!这正是我用来解决这个问题的方法。
    • 你好@GolamKawsar,这种方法是否也有助于聚合每个级别的层次结构?
    【解决方案4】:

    我建议使用 Neo4j。 毕竟,树只是一个特殊的、受约束的图。

    查看这个关于是否应该在 Neo4j 中存储树的精彩讨论:

    http://www.mail-archive.com/user@lists.neo4j.org/msg03256.html

    【讨论】:

    猜你喜欢
    • 2010-10-05
    • 1970-01-01
    • 1970-01-01
    • 2011-03-14
    • 2011-06-17
    • 1970-01-01
    • 2016-03-31
    • 1970-01-01
    • 2020-11-14
    相关资源
    最近更新 更多