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

Java Lucene文档结构以正确分组密钥集合,java,lucene,compass-lucene,Java,Lucene,Compass Lucene,我有这样一个Java模型(省略了一些字段): 假设这只是许多文档中的一个,我可以这样搜索: 查找名称以开头且有男婴的人 $/person/name:an* AND $/person/children/sex:male $/person/children/sex:male AND $/person/children/sex:female 查找有男婴和女婴的人 $/person/name:an* AND $/person/children/sex:male $/person/children

我有这样一个Java模型(省略了一些字段):

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

  • 查找名称以开头且有男婴的人

    $/person/name:an* AND $/person/children/sex:male
    
    $/person/children/sex:male AND $/person/children/sex:female
    
  • 查找有男婴和女婴的人

    $/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
    
    这将返回一个结果,我知道为什么。我希望这不会返回任何结果。我的问题是如何区分或关联这些嵌套属性,以便查询返回有效数据

    我曾考虑:

    $/person/children/1/name:luke
    $/person/children/name:luke1 or $/person/children/name:1luke
    
  • 将子项存储为单独的文档,尽管这样做会使我失去以上面所述方式进行搜索的能力

  • 在查询中使用
    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]

    [2]

    这肯定是正确的答案,但软件中总是有一个警告。Compass框架几乎被封存,并且停留在Lucene的2.9版上,因此很遗憾,我无法利用这些改进。谢谢你的建议!考虑到罗盘的发展被放弃(作者继续发展弹性搜索),你不考虑交换堆栈吗?如果你真的想要注释抽象,有一个Hibernate搜索,它与Lucene一起工作,这绝对是我们想要做的事情。我希望在此期间我们能做些什么来满足这一要求,但这看起来像是一条死胡同。谢谢你的帮助!