基本上我有一个非常简单的数据库,我想用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组件?
答案 0 :(得分:3)
我相信你可以使用标准的Lucene方法。 我会:
如果您选择裸Lucene,则需要自定义Indexer和Searcher,但它们并不难构建。 使用Solr可能更容易,您需要较少的编程。但是,我不知道Solr是否允许像我描述的那样开放式架构 - 我相信你必须预定义所有字段名称,所以这可能会阻止你使用Solr。
答案 1 :(得分:1)
Lucene基本上根据关键字/ s的出现返回命中文档列表,而不管查询类型如何。基本段读取器检查整个索引数据库中是否存在关键字,而不是检查特定感兴趣的字段。
建议引入执行以下操作的自定义搜索器。
1.使用文档ID读取列入名单的文档。 (我想可以重写collect()方法来从IndexSearcher类的search()传递文档id。) 2.获取字段值并检查预期关键字是否存在 3.仅在文档符合您的自定义条件时,才对文档进行评分。
注意:可以修改默认标准搜索器,而不是从头开始编写自定义搜索器。