0

私たちの製品のすべてのドキュメントの索引があります。ドキュメントフィールドは次のとおりです。

  • グループ
  • 名前
  • バージョン
  • ドキュメンテーション
  • ...

ほとんどのドキュメンテーションには複数のサイトがあるため、各サイトに対して 1 つのドキュメントをインデックスに作成します。そのため、グループ、名前、およびバージョンで製品を検索すると、いくつかの結果が得られます。しかし、この組み合わせ (グループ、名前、およびバージョン) に対して 1 つの結果のみが必要な場合があります (製品にいくつのドキュメントが存在するかに関係なく)。

そのため、DuplicateFilter を使用しました。

このフィルターは 1 つのフィールドでしか使用できない (フィールドの組み合わせでは使用できない) ため、別のフィールド (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 を使用しています。

4

1 に答える 1

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

インデックスに異なる ID を持つ 2 つの「c」がある場合でも。

したがって、あなたの組み合わせはこのようには機能しません。

于 2012-09-12T18:53:36.750 に答える