【问题标题】:Lucene DuplicateFilter filters not only duplicate resultsLucene DuplicateFilter 过滤器不仅会重复结果
【发布时间】:2012-08-29 13:12:07
【问题描述】:

我有一个包含我们产品的所有文档的索引。文档字段是:

  • 姓名
  • 版本
  • 文档
  • ...

因为我们的大多数文档都有多个站点,所以我为每个站点创建了一个索引中的一个文档。 因此,当我按组、名称和版本搜索产品时,我会得到一些结果。但有时我希望这种组合(组、名称和版本)只有一个结果(无论产品存在多少文档)。

为此我使用了 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);

是我犯了错误还是重复过滤器中的错误(可能是长字段值等)?

我使用的是 Lucene 3.6。

【问题讨论】:

    标签: lucene


    【解决方案1】:

    是的,这种方式是行不通的。这是因为过滤器“清理”了所有索引文档,以便搜索查询获得匹配的文档。

    即 您的索引中有以下文件:

    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 个具有不同 id 的“c”。

    所以你的组合不会这样工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-03-15
      • 1970-01-01
      • 1970-01-01
      • 2015-10-14
      • 2015-06-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多