2

Lucene.NET 3.0 で検索してインデックスを作成し、結果が次の順序で表示されるようにする最善の方法は何ですか。

  1. クエリ テキスト全体 (1 つの単語として) で始まる結果 (例: "Bar Acme")
  2. 「Bart Simpson」などの単語の断片として検索語で始まる結果
  3. クエリ テキストを完全な単語として含む結果 (例: "National Bar Association")
  4. 「United Bartenders Inc」などのクエリ テキストをフラグメントとして含む結果

例:バーの検索

注文結果:

  1. バーアクメ
  2. バールナ
  3. バート・シンプソン
  4. 全米弁護士会
  5. 国際バーテンダー協会
4

2 に答える 2

1

linqで実現できます。ヒット数 Int32.MaxValue で lucene 検索を行います。ScoreDocs の結果をループし、コレクション Searchresults に保存します。

サンプルコード:

Searchresults = (from scoreDoc in results.ScoreDocs select (new SearchResults { suggestion = searcher.Doc(scoreDoc.Doc).Get("suggestion") })).OrderBy(x => x.suggestion).ToList();

Searchresultsstartswith = Searchresults.Where(x => x.suggestion.ToLower().StartsWith(searchStringLinq.ToLower())).Take(10).ToList();

if (SearchresultsStartswith.Count > 0)
    return SearchresultsStartswith.ToList();
else
    return Searchresults.Take(10).ToList();
于 2016-07-29T06:43:55.163 に答える
1

Lucene は通常、フィールド内の位置に基づく検索/スコアリングをサポートしていません。すべてのフィールドに既知のフィールド開始区切り文字などのプレフィックスを付けると、それをサポートできます。テキストフィールド内の位置が関係ない全文検索のレンズでは、それが理にかなっているとは本当に思いません (つまり、ドキュメント内で Bar を検索していた場合、「Bartシンプソン」は「全国弁護士会」の前に返還された)

それとは別に、単純なプレフィックス検索が他のすべてを処理します。したがって、単語の開始トークンを追加するだけで、元の語句よりも高いブースト プレフィックス クエリを使用して変更された語句を検索でき、正確に記述したものを取得できます。

于 2013-06-10T16:23:17.073 に答える