1

lucene.netを使用してインデックスを検索するための適切なコードを探していました。私は一見有望に見えましたが、私はいくつかの混乱を得ました。可能であれば、lucene.netに精通している人は、コードを見て、その人がそのコードをそのように構築する理由を教えてください。

コードを取得した場所から...URLは次のとおりです http://www.codeproject.com/Articles/320219/Lucene-Net-ultra-fast-search-for-MVC-or-WebForms

ここにコードがあります

private static IEnumerable<SampleData> _search
(string searchQuery, string searchField = "") {
// validation
if (string.IsNullOrEmpty(searchQuery.Replace("*", "").Replace("?", ""))) return new List<SampleData>();

// set up lucene searcher
using (var searcher = new IndexSearcher(_directory, false)) {
    var hits_limit = 1000;
    var analyzer = new StandardAnalyzer(Version.LUCENE_29);

    // search by single field
    if (!string.IsNullOrEmpty(searchField)) {
        var parser = new QueryParser(Version.LUCENE_29, searchField, analyzer);
        var query = parseQuery(searchQuery, parser);
        var hits = searcher.Search(query, hits_limit).ScoreDocs;
        var results = _mapLuceneSearchResultsToDataList(hits, searcher);
        analyzer.Close();
        searcher.Close();
        searcher.Dispose();
        return results;
    }
    // search by multiple fields (ordered by RELEVANCE)
    else {
        var parser = new MultiFieldQueryParser
            (Version.LUCENE_29, new[] { "Id", "Name", "Description" }, analyzer);
        var query = parseQuery(searchQuery, parser);
        var hits = searcher.Search
        (query, null, hits_limit, Sort.RELEVANCE).ScoreDocs;
        var results = _mapLuceneSearchResultsToDataList(hits, searcher);
        analyzer.Close();
        searcher.Close(); 
        searcher.Dispose();
        return results;
    }
}
} 

上記のルーチンについて、ここでいくつか質問があります

1) why the developer of this code replace all * & ? to empty string in search term
2) why search once with QueryParser and again by MultiFieldQueryParser
3) how developer detect that search term has one word or many words separated by space.
4) how wild card search can be done using this code....where to change in code for handling wild card.

5) how to handle search for similar word like if anyone search with helo then hello related result should come.

var hits = searcher.Search(query, 1000).ScoreDocs;

6) when my search result will return 5000 record and then if i limit like 1000 then how could i      show next 4000 in pagination fashion.what is the object for giving the limit...i think for    fastness but if i specify limit the how can i show other results....what would be the logic

誰かが私のすべてのポイントについて話し合ったら嬉しいです。ありがとう

4

1 に答える 1

3

1)このコードの開発者がすべての*&を置き換える理由 検索語の文字列を空にする

これらはワイルドカード検索用の特殊文字だからです。著者が行うこと-検索クエリにワイルドカードと一緒に何か他のものがあるかどうかをチェックします。たとえば、通常は「*」を検索する必要はありません。

2)QueryParserで1回検索し、MultiFieldQueryParserでもう一度検索する理由

彼はQueryParsers自体では検索しませんが、検索クエリ(文字列)を解析し、それから多数のオブジェクトを作成しています。これらのオブジェクトは、Searcher実際の検索を実行するオブジェクトによって消費されます。

3)開発者が、検索語にスペースで区切られた1つの単語または複数の単語が含まれていることを検出する方法。

これは、開発者ではなく、パーサーオブジェクトが気にする必要があることです。

4)このコードを使用してワイルドカード検索を実行する方法....ワイルドカードを処理するためのコードを変更する場所。

ワイルドカードはsearchQueryパラメーターで指定されます。たとえば、「test *」を指定すると、ワイルドカードとしてカウントされます。詳細はこちら

5)誰かがheloで検索した場合のように、類似した単語の検索を処理する方法は、hello関連の結果が表示されるはずです。

あいまい検索が必要だと思います。

6)検索結果が5000レコードを返す場合、1000のように制限すると、次の4000をページネーション形式で表示するにはどうすればよいですか?制限を与える目的は何ですか...
堅牢性を考えますが、制限を指定した場合はどのように他の結果を表示できますか....ロジックはどうなりますか

これについての記事があります。

UPD:複数のフィールドについて。ロジックは次のとおりです。

  • が指定されている場合searchField、単純なパーサーを使用するよりも、のようなクエリが生成されますsearchField: value1 seachField: value2... etc
  • ただし、そのパラメータが存在しない場合は、渡されたものが。searchQueryのようなフィールドと値を指定すると想定します"field1: value1 field2: value2"。例は、前に述べたのと同じ構文ページにあります。

UPD2:これは最初はJavaプロジェクトであるため、LuceneのJavaドキュメントと例を探すことを躊躇しないでください(したがって、Javaの例とチュートリアルがたくさんあります)。Lucene.NETは移植されたプロジェクトであり、両方のプロジェクトが多くの機能とクラスを共有しています。

UPD3:あいまい検索については、同義語検索用に独自のアナライザーを実装することもできます(同義語とともに一般的なタイプミスを処理するために、私が取り組んだ商用プロジェクトの1つでその手法を使用しました)。

于 2012-07-12T19:52:05.990 に答える