我的索引包含了我们产品的所有文档。文件领域是:
因为我们的大部分文档都有几个网站,我为每个网站创建一个索引中的文档。 因此,当我按组,名称和版本搜索产品时,我会得到一些结果。但有时我想要这个组合(组,名称和版本)只有一个结果(无论产品有多少文件)。
因此我使用了DuplicateFilter:
因为此过滤器只能用于一个字段(而不是字段组合),所以我创建了另一个字段(productkey)。在此字段中,我存储了此产品的ID(组,名称和版本字段组合的md5Hashvalue)。 然后我告诉DuplicateFilter使用此字段来过滤重复项。
但是现在我没有得到所有预期的搜索结果。即:
文件:
group | name | version | productkey | description
a | one | 1.0 | 808d8f96138b7dec7cc69c2769176424 | ...
a | two | 1.0 | 0225635fc76ed8b88c65c7eb9f2ec1f9 | ...
a | two | 1.0 | 0225635fc76ed8b88c65c7eb9f2ec1f9 | ...
a | three| 1.0 | 621e2597b189ee8d9448f6bfb26c5a8f | ...
a | three| 1.0 | 621e2597b189ee8d9448f6bfb26c5a8f | ...
a | three| 1.0 | 621e2597b189ee8d9448f6bfb26c5a8f | ...
a | three| 1.0 | 621e2597b189ee8d9448f6bfb26c5a8f | ...
a | three| 1.0 | 621e2597b189ee8d9448f6bfb26c5a8f | ...
a | four | 1.0 | 3d03056a0d0f29f63477ee1f130b7ae8 | ...
a | four | 1.0 | 3d03056a0d0f29f63477ee1f130b7ae8 | ...
a | four | 1.0 | 3d03056a0d0f29f63477ee1f130b7ae8 | ...
a | four | 1.0 | 3d03056a0d0f29f63477ee1f130b7ae8 | ...
a | four | 1.0 | 3d03056a0d0f29f63477ee1f130b7ae8 | ...
a | four | 1.0 | 3d03056a0d0f29f63477ee1f130b7ae8 | ...
a | five | 1.0 | b2d49bc320325007e1466a38e41ce69a | ...
a | five | 1.0 | b2d49bc320325007e1466a38e41ce69a | ...
a | five | 1.0 | b2d49bc320325007e1466a38e41ce69a | ...
a | five | 1.0 | b2d49bc320325007e1466a38e41ce69a | ...
a | five | 1.0 | b2d49bc320325007e1466a38e41ce69a | ...
zz | one | 1.0 | b610a470c9a7d2cc928725e1fb1a577a | ...
zz | one | 1.0 | b610a470c9a7d2cc928725e1fb1a577a | ...
zz | one | 1.0 | b610a470c9a7d2cc928725e1fb1a577a | ...
zz | two | 1.0 | f5bb84453af30dd5f229d04cdb787dec | ...
zz | three| 1.0 | 4b86d91feded953e57fb3d1ccbf0fc6e | ...
zz | three| 1.0 | 4b86d91feded953e57fb3d1ccbf0fc6e | ...
zz | three| 1.0 | 4b86d91feded953e57fb3d1ccbf0fc6e | ...
结果:
group | name | version | productkey
a | two | 1.0 | 0225635fc76ed8b88c65c7eb9f2ec1f9
a | three| 1.0 | 621e2597b189ee8d9448f6bfb26c5a8f
zz | two | 1.0 | f5bb84453af30dd5f229d04cdb787dec
所以我错过了这些产品:
group | name | version | productkey
a | one | 1.0 | 808d8f96138b7dec7cc69c2769176424
a | four | 1.0 | 3d03056a0d0f29f63477ee1f130b7ae8
a | five | 1.0 | b2d49bc320325007e1466a38e41ce69a
zz | one | 1.0 | b610a470c9a7d2cc928725e1fb1a577a
zz | three| 1.0 | 4b86d91feded953e57fb3d1ccbf0fc6e
以下是我实例化过滤器的代码:
DuplicateFilter filter = new DuplicateFilter("productkey");
filter.setKeepMode(DuplicateFilter.KM_USE_FIRST_OCCURRENCE);
filter.setProcessingMode(DuplicateFilter.PM_FULL_VALIDATION);
我是否犯了错误,或者它是duplicateFilter中的错误(可能是长字段值等)?
我正在使用Lucene 3.6。
答案 0 :(得分:1)
是的,这不会这样。这是因为过滤器“清理”所有索引文档,因为searchquery获取匹配的文档。
即。 在你的索引中是以下文件:
docId, value
1, a
1, b
1, c
2, c
4, a
5, d
并且您有一个特殊的过滤器,可以按ID过滤重复项,而不是只有以下搜索文档:
docId, value
1, a
4, a
2, c
5, d
只有在此之后您的搜索才会被破坏。即如果你搜索所有“c”,你将只得到
2, c
即使索引中有2个“c”具有不同的ID。
所以你的组合不会这样。