Lucene文档结构正确分组密钥集合

时间:2014-10-09 04:54:41

标签: java lucene compass-lucene

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

假设这只是众多文档中的一个,我可以像这样搜索:

  1. 查找姓名以男性为主的男性

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

    $/person/children/sex:male AND $/person/children/sex:female
    
  3. 在尝试寻找具有特定姓名和性别的孩子时,我遇到了麻烦,比如

    $/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
      

1 个答案:

答案 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