【问题标题】:Lucene complex structure searchLucene 复杂结构搜索
【发布时间】:2010-04-29 09:20:33
【问题描述】:

基本上,我确实有非常简单的数据库,我想用 Lucene 编制索引。 域是:

// Person domain
class Person {
  Set<Pair> keys;
}

// Pair domain
class Pair {
  KeyItem keyItem;
  String value;
}

// KeyItem domain, name is unique field within the DB (!!)
class KeyItem{
  String name;
}

我有几千万个配置文件和几亿个Pairs,但是,由于大部分KeyItem的“名称”字段重复,所以只有几十个KeyItem实例。 想出了那个结构来保存 KeyItem 实例。

基本上,任何包含任何字段的配置文件都可以保存到该结构中。 假设我们有属性的配置文件

- name: Andrew Morton
- eduction:  University of New South Wales, 
- country: Australia, 
- occupation: Linux programmer.

为了存储它,我们将有一个 Profile 实例、4 个 KeyItem 实例:姓名、教育、国家和职业,以及 4 个具有值的 Pair 实例:“Andrew Morton”、“University of New South Wales”、“Australia”和“Linux 程序员”。

所有其他个人资料将引用(全部或部分)相同的 KeyItem 实例:姓名、教育、国家和职业。

我的问题是,如何索引所有这些,以便我可以在 Profile 中搜索 KeyItem::name 和 Pair::value 的某些特定值。理想情况下,我希望这种查询能够工作:

姓名:Andrew* AND 职业:Linux*

我应该创建自定义索引器和搜索器吗?或者我可以使用标准的并以某种方式将 KeyItem 和 Pair 映射为 Lucene 组件?

【问题讨论】:

    标签: lucene compass-lucene


    【解决方案1】:

    我相信您可以使用标准的 Lucene 方法。 我会:

    • 将每个配置文件转换为 Lucene 文档。
    • 将每一对翻译成本文档中的一个字段。所有字段都需要索引,但不一定要存储。
    • 将带有配置文件 ID 的存储字段添加到文档中。
    • 与您的示例类似,使用名称:值对进行搜索。

    如果您选择裸 Lucene,您将需要一个自定义的 Indexer 和 Searcher,但它们并不难构建。 使用Solr 可能对您来说更容易,您需要的编程更少。但是,我不知道 Solr 是否允许像我描述的那样开放式架构 - 我相信您必须预定义所有字段名称,因此这可能会阻止您使用 Solr。

    【讨论】:

    • 我在 Grails 项目中使用 Compass 插件。我只是想知道是否可以使用标准 Compass 注释或 XML 定义来做到这一点。我希望代码尽可能少。
    【解决方案2】:

    Lucene 基本上根据关键字的出现返回命中文档列表,而不管查询的类型如何。基本段阅读器会检查整个索引数据库中是否存在关键字,而不是在特定的感兴趣领域中。

    建议引入执行以下操作的自定义搜索器。

    1.使用文档ID读取入围文档。 (我猜可能会重写 collect() 方法以从 IndexSearcher 类的 search() 传递文档 ID)。
    2.获取字段值并检查预期关键字的存在。
    3.仅当文档符合您的自定义标准时才对文档进行评分。

    注意:可以修改默认的标准搜索器,而不是从头开始编写自定义搜索器。

    【讨论】:

      猜你喜欢
      • 2012-08-19
      • 1970-01-01
      • 2020-01-18
      • 1970-01-01
      • 1970-01-01
      • 2011-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多