2

我有一个这样的 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

假设这只是众多文档之一,我可以这样搜索:

  1. 查找名字以 an 开头并且有一个男孩的人

    $/person/name:an* AND $/person/children/sex:male
    
  2. 查找有男孩和女孩的人

    $/person/children/sex:male AND $/person/children/sex:female
    

当我试图找到一个具有特定姓名和性别的孩子时遇到了麻烦,就像这样

$/person/children/sex:male AND $/person/children/name:leia

这将返回一个结果,我明白为什么。我希望这不返回任何结果。我的问题是如何区分或关联这些嵌套属性,以便我的查询返回有效数据?

我考虑过:

  1. 将孩子存储为单独的文档,尽管这样做我失去了以我上面写的方式进行搜索的能力。

  2. 在查询中以某种方式使用id字段对这些字段进行分组。我一直无法想出一个“正确”的方法。我考虑过的变体:

    $/person/children/1/name:luke
    $/person/children/name:luke1 or $/person/children/name:1luke
    
4

1 回答 1

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

于 2014-10-10T13:41:17.447 回答