4

Lukeでは、次の検索式は23の結果を返します。

docurl:www.siteurl.com  docfile:Tomatoes*

これと同じ式を次の実装でC#Lucene.NETアプリに渡すと、次のようになります。

        IndexReader reader = IndexReader.Open(indexName);
        Searcher searcher = new IndexSearcher(reader);
        try
        {
            QueryParser parser = new QueryParser("docurl", new StandardAnalyzer());
            BooleanQuery bquery = new BooleanQuery();
            Query parsedQuery = parser.Parse(query);
            bquery.Add(parsedQuery, Lucene.Net.Search.BooleanClause.Occur.MUST);
            int _max = searcher.MaxDoc();
            BooleanQuery.SetMaxClauseCount(Int32.MaxValue);
            TopDocs hits = searcher.Search(parsedQuery, _max)
            ...
        }

結果は0になります

LukeはStandardAnalyzerを使用しており、ExplainStructureウィンドウは次のようになります。 Lukeクエリ構造

BooleanClause検索するフィールドごとにオブジェクトを手動で作成し、各フィールドを指定してから、オブジェクトにShould追加する必要がありますか?私は私のためにこれを行うだろうと思った。私は何が欠けていますか?BooleanQuery.Add()QueryParser

編集: 少し単純化するとdocfile:Tomatoes*、Lukeでは23のドキュメントが返されますが、私のアプリでは0が返されます。Geneの提案により、私はからに変更しMUSTましたSHOULD

            QueryParser parser = new QueryParser("docurl", new StandardAnalyzer());
            BooleanQuery bquery = new BooleanQuery();
            Query parsedQuery = parser.Parse(query);
            bquery.Add(parsedQuery, Lucene.Net.Search.BooleanClause.Occur.SHOULD);
            int _max = searcher.MaxDoc();
            BooleanQuery.SetMaxClauseCount(Int32.MaxValue);
            TopDocs hits = searcher.Search(parsedQuery, _max);

parsedQueryは単純ですdocfile:tomatoes*

Edit2:

私はついに根本的な問題に到達したと思います:

            QueryParser parser = new QueryParser("docurl", new StandardAnalyzer());
            Query parsedQuery = parser.Parse(query);

2行目でquery"docfile:Tomatoes*"、はですが、parsedQueryはです{docfile:tomatoes*}。違いに気づきましたか?解析されたクエリの小文字の「t」。私はこれまで気づかなかった。IDEの値を「T」に変更すると、23件の結果が返されます。

StandardAnalyzerインデックスを作成してインデックスを読み取るときに使用されていることを確認しました。queryParserの値の大文字と小文字を維持するように強制するにはどうすればよいqueryですか?

Edit3: うわー、なんてイライラする。ドキュメントによると、私はこれを次の方法で達成できます。

parser.setLowercaseExpandedTerms(false);

ワイルドカード、プレフィックス、ファジー、および範囲クエリの用語を自動的に小文字にするかどうか。デフォルトはtrueです。

それが賢明なデフォルトであるかどうかについては議論しません。SimpleAnalyzerを使用して、インデックスの内外のすべてを小文字にする必要があったと思います。イライラする部分は、少なくとも私が使用しているバージョンでは、Lukeがデフォルトで逆になっていることです。少なくとも、Luceneについてもう少し学びました。

4

2 に答える 2

3

を使用することは、標準のクエリ パーサーで演算子Occur.MUSTを使用することと同じです。したがって、Luke に入力した式ではなく、+コードが評価されます。+docurl:www.siteurl.com +docfile:Tomatoes*その動作を得るにはOccur.SHOULD、句を追加するときに試してください。

于 2011-05-15T06:00:53.180 に答える
1

QueryParser実際、「docurl:www.siteurl.com docfile:Tomatoes *」のようなクエリを取得し、指定されたクエリに応じて適切なクエリ(ブールクエリ、範囲クエリなど)を作成します(クエリ構文を参照)。

最初のステップは、デバッガーを接続し、の値とタイプを検査することですparsedQuery

于 2011-05-13T20:33:46.390 に答える