Lucene中多个字段的重复值的影响

时间:2011-12-02 13:13:48

标签: java indexing lucene.net lucene

在lucene索引中的多个字段中重新索引相同值会产生什么影响?

这个想法是,某人的名字是他们名字的一部分及其一般细节。所以我想将该值索引到多个字段中。 Ted Bloggs我的索引可能如下:

Field        |    Value
-------------|---------
firstName    | Ted
lastName     | Blogs
name         | Ted
name         | Bloggs
general      | Ted
general      | Bloggs
all          | Ted
all          | Bloggs

通过这样做,我可以很容易地形成字段类别,但我担心它可能会对性能和/或磁盘使用产生不利影响。

有人可以提出建议吗

3 个答案:

答案 0 :(得分:4)

@aishwarya是对的,但要进一步扩展它:

来自the docs

  

此文件按术语排序。条款首先按字典顺序(按UTF16字符代码)按术语的字段名称排序,并按字节顺序(按UTF16字符代码)按术语的文本排序。

该字词将在每个字段中存储一次,因此如果您重复每个字词五次,则存储空间将大五倍。但是,术语dic的大小相对于原始数据的大小是对数的,所以我怀疑你会遇到问题。

性能损失将不存在(Lucene缓存每个字段开始的位置),除非有更多数据会强制内存不足。对于大多数搜索基础架构,您可能会有一个低于几gb的索引,无论如何都很容易适应内存。

答案 1 :(得分:4)

Xodarap的解释很好,只是为了补充一点:

考虑lucene中字段的最佳方法是每个都是它自己的微型倒排索引,但是文档id是对齐/并行的,所以你可以在不同的字段中进行析取/连接。

添加大量字段时要注意的一件事:默认情况下,每个字段都有一个字节[maxdoc]在ram中加载,用于长度规范化。因此,对于许多文档和许多字段,都启用了长度标准化,这可能会占用一些空间。

查看用例长度规范化对于firstName / LastName这样的字段可能不是很有用,所以你可能想在这些短字段上省略Node()。

答案 2 :(得分:1)

lucene的索引已经很好地优化了,所以我不会太担心这里的性能或磁盘使用情况。话虽如此,与简单的单列精确搜索相比,您的用例肯定会有更差的性能,尽管不会引起担忧。