2

本の検索アプリを実行しています。休止状態の検索によって実装されます。

Book エンティティは次のように定義されます。

@Entity
@Indexed
public class Book{
@DocumentId
private Integer UID;
@Field
private String title;

@Field
private String description;
...}

たとえば、ユーザーが書籍名を検索すると、Microsoft Access 2007 と入力すると、タイトルまたは説明を含む書籍に microsoft、access または 2007 が返されます。それが私たちが期待したことです。キーワード 2007 のため、まったく関係のない書籍もあります。各キーワードの重要性を理解するための解決策を探しています。その場合、2007 年は検索でそれほど重要ではありません。しかし、その検索では、microsoft、access、または 2007 に違いはありません。

2 番目のユーザー ケース: 複数のフレーズをサポートするためにインデックス作成とクエリで使用できる優れたアナライザーはありますか? 休止状態検索のデフォルトのアナライザーは、検索語を単一の単語にトークン化するだけだと思いましたか?

検索ワードが microsoft access 2007 の場合、結果に「microsoft access」が含まれている場合に最高のスコアが表示されます。

もう 1 つの検索例: "salt lake city", "united states", "salt, city" または "lake" のみに一致する場合、結果は期待されません。

誰か手がかりを教えてもらえますか?

ありがとう!

4

2 に答える 2

0

Lucene は、頻繁に発生する用語を既に割り引いているため、ドキュメント間でうまく区別できません。その効果を高めたい場合は、いくつかの選択肢があります。

  1. 類似度関数をデフォルトから変更し、新しい関数を使用して用語を異なる方法で重み付けします
  2. 最初に特定の用語を含むドキュメントの数を検索し、それに応じてその用語の重みを調整することにより、クエリ内の低 df (高 IDF) 用語をブーストします。
  3. どの用語がそれほど効果的でないか (例: 年数) をアプリオリに判断できる分類子を作成し、それに応じて重みを調整します。
  4. WordNet や Wikipedia などを、単一のトークンとして索引付けする語句のソース (リーダーシップ スキルなど) として使用します。これには、アナライザーによって構成された、変更された TokenStream が含まれます。
于 2011-06-03T21:55:35.663 に答える
0

良い 2007 と悪い 2007 を区別する方法がわかりません。

できることの 1 つは、説明には数字を無視するアナライザーを使用し、タイトルには通常のアナライザーを使用することです。そうすれば、タイトルの数字だけがピックアップされます。実際には、これはアナライザー全体ではなく、作成してアナライザー スタックに追加できる単純なフィルターです。

また、説明を 2 回索引付けすることもできます。1 回目は数字を無視し、もう 1 回は数字を無視しません。その後、クエリ時にブースト ファクターを操作して、両方のフィールドを検索できますが、数字のあるフィールドの優先度は低くなります。

もう 1 つの解決策は、カスタム フィルターでいくつかの数字パターンを無視することです (つまり、年式の数字、1 桁の数字など)。これらは、無視したい最も一般的なタイプのノイズの多い数字です (それが私が最初に行うことだと思います)。 )。

フレーズ検索に関しては、単純に Lucene の PhraseQuery を使用するか、より使いやすい Hibernate Search DSL を使用します。

Query luceneQuery = mythQB
   .phrase()
   .onField("history")
   .matching("Thou shalt not kill")
       .createQuery();

クエリ DSL のドキュメント全体はこちら

于 2011-06-03T09:09:01.943 に答える