6
string q = "m";
Query query = new QueryParser("company", new StandardAnalyzer()).Parse(q+"*");

クエリは prefixQuery :company:a* になります

それでも、「フリート アフリカ」のような結果が得られます。この場合、A が最初にないことが明らかであり、望ましくない結果が得られます。

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

query は termQuery :company:a* になり、結果は返されません。おそらく、クエリを完全一致として解釈し、私の値が「a *」リテラルではないためです。

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

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

私は何を間違っていますか?

4

3 に答える 3

6

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

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

于 2011-03-30T11:20:05.920 に答える
0

簡単な答え: すべてのクエリが検索をフィールドの先頭に制限するわけではありません。EdgeNGramTokenFilterなどが必要です。Lucene でのオートコンプリートの実装については、この質問を参照してください。

于 2009-03-03T10:53:12.873 に答える