2009-03-03 5 views
5
string q = "m"; 
Query query = new QueryParser("company", new StandardAnalyzer()).Parse(q+"*"); 

はprefixQueryされたクエリになります:会社:*なぜこのLuceneクエリは "startsWith"の代わりに "contains"ですか?

それでも私はAがスタート時ではないので、私に望ましくない結果をもたらすことはなく明らかである「フリートアフリカ」のような結果が得られます。

Query query = new TermQuery(new Term("company", q+"*")); 

はクエリがtermQuery:company:a *になり、結果が返されません。おそらく、それは正確に一致するものとしてクエリを解釈し、私の値のどれも "a *"リテラルではないからです。

Query query = new WildcardQuery(new Term("company", q+"*")); 

は、prefixqueryと同じ結果を返します。

私は間違っていますか?

答えて

0

簡潔な答え:すべてのクエリは検索をフィールドの先頭に限定しません。 EdgeNGramTokenFilterなどが必要です。 Luceneでオートコンプリートの実装については、this questionを参照してください。

+0

確かにこの例はあまりにも遠すぎます。すべてのファズがなくてもstartswithのようなクエリを作成することは可能でしょうか? –

+0

私が知っているわけではありません。 startswithは微妙です。あなたがこれを行うことができれば、私に知らせてください。私が見ていることから、PrefixQueryは、最初のものだけでなく、どんな用語の開始を探すことを意味します。 –

+0

これは私を実際に驚かせます。 Startswithは、実行するのが最も簡単なクエリでなければなりません。 –

4

StandardAnalyzerは、「フリートアフリカ」を「フリート」と「アフリカ」にトークン化します。あなたのa *検索は、後の用語と一致します。

"Fleet Africa"を1つの語句とみなしたい場合は、空白文字列を分割しないアナライザを使用してください。 KeywordAnalyzerは例ですが、クエリで大文字と小文字を区別しないようにデータを小文字にしたい場合もあります。