elasticsearch,Solr,Lucene,Nosql,Neo4j,elasticsearch" /> elasticsearch,Solr,Lucene,Nosql,Neo4j,elasticsearch" />

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

如何将树数据存储在Lucene/Solr/Elasticsearch索引或NoSQL数据库中?,solr,lucene,nosql,neo4j,elasticsearch,Solr,Lucene,Nosql,Neo4j,elasticsearch,比如说,我需要存储在Lucene索引中的小树,而不是文档。我该怎么做呢 树中的一个示例节点: class Node { String data; String type; List<Node> children; } 类节点 { 字符串数据; 字符串类型; 列出儿童名单; } 在上面的节点中,“data”成员变量是一个空格分隔的字符串,因此需要全文搜索。“type”成员变量只是一个单词 搜索查询将是一个树本身,并将搜索每个节点中的数据和类型以及树的结构以查

比如说,我需要存储在Lucene索引中的小树,而不是文档。我该怎么做呢

树中的一个示例节点:

class Node
{
    String data;
    String type;
    List<Node> children;
}
类节点
{
字符串数据;
字符串类型;
列出儿童名单;
}
在上面的节点中,“data”成员变量是一个空格分隔的字符串,因此需要全文搜索。“type”成员变量只是一个单词

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

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

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

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

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

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


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

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

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


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

这一要求和解决方案如下:

该设计随后由core Lucene和Elastic Search实现。 BlockJoinQuery是Lucene的核心实现,弹性搜索的实现如下所述:

有一个项目警报
它处理“深入”树,寻址。内部使用杜威编号()..

搜索时要查找的内容。如果您将NodeB作为NodeA的子节点,并且NodeB具有文本FOO,那么在搜索FOO时,您希望返回NodeB还是NodeA?查询将根据树结构和树数据进行匹配。因此,如果NodeA中的数据已经匹配,那么FOO在NodeB中的出现将构成完全匹配。你是说FOO必须在NodeA和NodeB中吗?或者该类型必须在NodeA中匹配,但您不关心NodeB.FOO中的类型是否匹配。永远不会单独搜索。查询本身将是一棵树!因此,我们可以搜索包含NodeA.data=“BAR”及其子节点NodeB.data=“FOO”的树。成功的匹配将是其第一个节点匹配NodeA(数据和类型)且子节点匹配NodeB(类型和数据)的所有树。数据值的近似匹配是可以接受的。类似neo4j的东西可能会更好地感谢您的答案,但您的链接已断开。此外,Neo4j是否允许存储数十亿(或万亿)的小树以进行索引?我希望能够搜索树,包括它们的结构和节点中存储的文本。链接没有断开,我刚刚检查过。这里还有几个地方可以找到讨论线程:Neo4j用户组中有大量关于树结构的内容:谢谢mbonaci。当我第一次尝试时,链接不起作用(我尝试了几次)。我会检查你指向的链接。谢谢谢谢你,马克!这正是我解决这个问题所采用的方法。您好@GolamKawsar,这种方法是否也有助于聚合每个级别的层次结构?谢谢,ES/Lucene中的本机解决方案将比任何“黑客”解决方案更好!