一尘不染

如何将树数据存储在Lucene / Solr / Elasticsearch索引或NoSQL数据库中?

elasticsearch

说说我有一些小树而不是文档,我需要将它们存储在Lucene索引中。我该怎么做呢?

树中的一个示例节点:

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

在上面的节点中,“数据”成员变量是用空格分隔的字符串,因此需要全文搜索。“类型”成员变量只是一个单词。

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

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

我快速浏览了neo4j,但它似乎将整个图形存储在db中,而不是大量的小树结构集合(例如数十亿或数万亿美元)。还是我的理解错了?

另外,非基于Lucene的NoSQL解决方案是否更适合此?


阅读 410

收藏
2020-06-22

共1个答案

一尘不染

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

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

这种方法的主要问题在于,移动分支需要在移动分支之后对每个分支重新排序。如果您的树木是相对静态的,那么实际上这只是一个小问题。

(我已经看到这种方法称为“路径枚举”或“杜威十进制”表示形式。)

2020-06-22