我有这样的Java模型(省略了一些字段):
@Searchable(root=true)
class Person {
@SearchableProperty
String sex;
@SearchableProperty
String name;
}
class Parent extends Person {
@SearchableComponent
List<Person> children;
}
此模型创建一个lucene文档,其中包含Anakin人员的以下数据:
$/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
答案 0 :(得分:0)
我不熟悉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