1

Lucene の標準アナライザーを使用します。問題のタイトル フィールドは保存されておらず、分析されています。クエリは次のとおりです。

title:"Some-Url-Friendly-Title"

Luke では、このクエリは次のように正しく書き直されます。

title:"some url friendly title" (- replaced by whitespace, everything lowercased).

Lucene.netのバージョンは次のようになると思いました。

new TermQuery(new Term("title","Some-Url-Friendly-Title"))

ただし、結果は返されません。

それから私は試しました:

_parser.GetFieldQuery("title","Some-Url-Friendly-Title")

そして、それは期待どおりに機能しました!

どちらのクエリも次の方法で実行されました: _searcher.Search([クエリ オブジェクト], [ソート オブジェクト])

誰かが私を正しい方向に向けて、TermQuery と _parser.GetFieldQuery() の違いを確認できますか?

4

2 に答える 2

2

ATermQueryは、クエリパーサーを介してクエリを実行するよりもはるかに簡単です。小文字化されていないだけでなく、ハイフンでつながれた用語を分割することを理解していないだけでなく、トークン化さえされていません。検索するように指示した用語を検索するだけです。つまり、インデックス内でトークン化されていない単一のキーワードとして「Some-Url-Friendly-Title」という用語を探しているということです。アナライザーを使用していると想定しているため、そのようなトークンが存在しない可能性があります。

さらに一歩進めると、用語テキストとして「Some Url Friendly Title」を検索していた場合でも、「Some Url Friendly Title」を単一のトークンとして検索しているため、何も思いつきません。インデックス内の 4 つのトークン (または用語) として。

クエリを解析するときに標準のクエリ パーサーが生成するものを見ると、TermQueries が完全なクエリを生成するために使用するビルディング ブロックの 1 つにすぎないことわかります

于 2013-02-05T00:18:05.497 に答える