[英]Lucene document structure to correctly group a collection of keys
我有一个这样的Java模型(省略了一些字段):
@Searchable(root=true)
class Person {
@SearchableProperty
String sex;
@SearchableProperty
String name;
}
class Parent extends Person {
@SearchableComponent
List<Person> children;
}
此模型为Anakin人员创建具有以下数据的lucene文档:
$/person/sex:male
$/person/name:anakin
$/person/children/sex:male
$/person/children/name:luke
$/person/children/sex:female
$/person/children/name:leia
假设这只是许多文档之一,我可以这样搜索:
寻找名字开头为且有一个男孩的人
$/person/name:an* AND $/person/children/sex:male
寻找有男婴和女婴的人
$/person/children/sex:male AND $/person/children/sex:female
试图找到一个有特定名字和性别的孩子时遇到麻烦
$/person/children/sex:male AND $/person/children/name:leia
这将返回结果,我明白了为什么。 我希望这不会返回任何结果。 我的问题是如何区分或关联这些嵌套属性,以使查询返回有效数据?
我考虑过:
将孩子存储为单独的文档,尽管这样做会使我失去以上面编写的方式进行搜索的功能。
在查询中以某种方式使用id
字段将这些字段分组。 我一直无法提出一种“正确”的方法。 我考虑过的变体:
$/person/children/1/name:luke $/person/children/name:luke1 or $/person/children/name:1luke
我对Compass并不熟悉,但是在Lucene级别上,您可以使用BlockJoinQuery将子文档嵌套到父文档中并进行查询。
Mike McCandless在Lucene 3.4 [1]中有一篇关于使用BlockJoinQuery的优秀博客文章。 那应该给您基本概念。 但是,在Lucene 4中,API进行了更改,并且现在位于org.apache.search.lucene.join
包下。 Javadoc [2]中有一个代码示例。
[1] http://blog.mikemccandless.com/2012/01/searching-relational-content-with.html
[2] http://lucene.apache.org/core/4_10_1/join/org/apache/lucene/search/join/package-summary.html
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.