1

Lucene でインデックスを作成してTestClassいるフィールドを含むHibernate アノテーション付きクラスがあります。List<String>次の例を検討してください。

"Foo Bar""Bar Snafu"は、特定のレコードのリスト内の 2 つのエントリです。ここで、ユーザーが TestClass で検索すると"Foo Snafu"、レコードが見つかります。これは、トークン Foo とトークン Snafu が両方ともList<String>このレコードのトークンであるためだと思います。

これを防ぐ方法はありますか?

実際の例は、原告と被告のリストを持つ裁判です。この事件で 2 人が起訴されているJoe Lewis BobとしRobert Clay Smithます。これらのユーザーは、訴訟記録の被告リストに保存されます。この被告のリストは、Lucene で索引付けされています。ここで、ユーザーが前述の 2 つの被告のいずれかを検索すると、その事件が見つかります。Lewis Smithただし、ユーザーが、 またはを検索した場合にもケースが見つかりますJoe Clay

更新: Lucene IRC チャンネルで、多値フィールドを使用できる可能性があると言及されました。

更新 2: Solr IRC チャネルで、positionIncrementGap設定を使用schema.xmlして Solr でこれを実現できることが言及されました。どうやら、フレーズ クエリを (slop の有無にかかわらず) 使用すると、「インクリメント ギャップにより、同じフィールド内の異なる値が意図しない一致を引き起こさないことが保証されます」。

4

1 に答える 1

0

Lucene は、同じドキュメント内の同じフィールドへの連続した追加を、フィールドに既にあるものの末尾に追加します。

リストの各メンバーを完全に別個のエンティティとして扱いたい場合は、それらを異なるフィールドでインデックス化する必要があります。すでに使用しているフィールド名にインデックスを追加するだけです。もちろん、あなたのニーズに関する完全な情報はありませんが、このようなことを行う方がおそらくより良い解決策です.

正確なテキストを検索したいだけの場合は、 PhraseQuery"Foo Snafu"を使用できます。フレーズクエリが 1 つのリスト項目から次の項目にまたがらないようにしたい場合 (つまり、インデックスにandがある場合)、インデックスに書き込むときに、各メンバー間に何らかの形式の区切り用語を挿入できます。"Bar Foo""Snafu Bar"

于 2013-02-25T23:06:32.907 に答える