Lucene复杂结构搜索

时间:2010-04-29 09:20:33

标签: lucene compass-lucene

基本上我有一个非常简单的数据库,我想用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个具有值的对实例:“Andrew Morton”,“新南威尔士大学”,“澳大利亚”和“Linux程序员”。

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

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

姓名:Andrew * AND职业:Linux *

我应该创建自定义Indexer和Searcher吗?或者我可以使用标准的,只是以某种方式映射KeyItem和Pair作为Lucene组件?

2 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:1)

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

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

1.使用文档ID读取列入名单的文档。 (我想可以重写collect()方法来从IndexSearcher类的search()传递文档id。) 2.获取字段值并检查预期关键字是否存在 3.仅在文档符合您的自定义条件时,才对文档进行评分。

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