Lucene DuplicateFilter过滤器不仅重复结果

时间:2012-08-29 13:12:08

标签: lucene

我的索引包含了我们产品的所有文档。文件领域是:

  • 名称
  • 版本
  • 文档
  • ...

因为我们的大部分文档都有几个网站,我为每个网站创建一个索引中的文档。 因此,当我按组,名称和版本搜索产品时,我会得到一些结果。但有时我想要这个组合(组,名称和版本)只有一个结果(无论产品有多少文件)。

因此我使用了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。

1 个答案:

答案 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。

所以你的组合不会这样。