【问题标题】:Lucene document structure to correctly group a collection of keysLucene 文档结构可以正确地对一组键进行分组
【发布时间】:2014-10-09 04:54:41
【问题描述】:

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

【问题讨论】:

    标签: java lucene compass-lucene


    【解决方案1】:

    我不熟悉 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

    【讨论】:

    • 这绝对是正确的答案,但在软件中总是有一个警告。 Compass 框架几乎被封存了,并且停留在 Lucene 的 2.9 版上,所以很遗憾我无法利用这些改进。感谢您的建议!
    • 考虑放弃Compass开发(作者继续开发ElasticSearch)不考虑切换栈吗?如果您真的想要注释抽象,可以使用 Hibernate Search 与 Lucene hibernate.org/search
    • 绝对是我们想做的事情。我希望在此期间我们可以做一些事情来满足这个要求,但这看起来像是一条死胡同。感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-06
    • 2021-05-05
    • 1970-01-01
    • 2018-05-03
    • 1970-01-01
    • 2018-02-19
    • 1970-01-01
    相关资源
    最近更新 更多