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

时间:2012-04-02 02:21:02

标签: solr lucene nosql neo4j elasticsearch

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

树中的示例节点:

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

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

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

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

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

另外,基于非Lucene的NoSQL解决方案更适合这个吗?

4 个答案:

答案 0 :(得分:10)

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

假设'treepath'是树位置的字段名称,您将在'treepath:014 *'上查询以查找第14个树中的所有节点和叶子。同样,要查找第14个树的所有子项,您将在'treepath:014。*'上查询。

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

(我看到这种方法称为'路径枚举'或'杜威十进制'表示。)

答案 1 :(得分:3)

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

此设计随后由核心Lucene和Elastic Search实施。 BlockJoinQuery是Lucene的核心实现,Elastic Search希望实现如下所述的实现:Elastic search nested docs

答案 2 :(得分:2)

我建议Neo4j。 毕竟,树只是一个特殊的,受限制的图形。

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

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

答案 3 :(得分:0)

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