繁体   English   中英

Lucene文档结构可以正确地对键集合进行分组

[英]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

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

  1. 寻找名字开头为且有一个男孩的人

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

我对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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM