【发布时间】: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