「bahnhofstrasse」を検索すると、Lucene が「bahnhofstr」という用語を含むドキュメントを検索するようにします。つまり、検索用語が接頭辞である用語を含むドキュメントだけでなく、用語を含むドキュメントも検索したいのです。それ自体が私の検索用語の接頭辞です...
これについてどうすればいいですか?
私があなたを正しく理解していて、検索文字列が正確な文字列である場合はqueryParser.setAllowLeadingWildcard(true);
、Luceneで設定して、先頭のワイルドカード検索を許可できます(低速の場合もそうでない場合もあります-かなり高速ですが、わずか60,000以上のLuceneドキュメント)。
クエリ構文の例は次のようになります。
*bahnhofstr bahnhofstr*
またはおそらく(これをテストしていません)ただ:
*bahnhofstr*
あいまいクエリが最も役立つと思います。これにより、クエリからのレーベンシュタイン距離に基づいて用語がスコアリングされます。最小の類似度が指定されていない場合、使用可能なすべての用語に効果的に一致します。これにより、パフォーマンスが低下する可能性がありますが、探しているものは達成されます。
ファジー クエリは、次のように ~ 文字で示されます。
firstname:bahnhofstr~
または最小の類似度 (0 から 1 までの数値。0 は最小値のない最も緩い値)
firstname:bahnhofstr~0.4
または、独自のクエリを作成している場合は、FuzzyQueryを使用します
これは指定したとおりではありませんが、近づくための最も簡単な方法です。
あなたが探しているものに関する限り、それを達成するための単純な Lucene 呼び出しについては知りません。おそらく、用語を一連の用語クエリに分割し、次のようなクエリ文字列で表すことができます。
firstname:b
firstname:ba
firstname:bah
firstname:bahn
firstname:bahnh
firstname:bahnho
firstname:bahnhof
firstname:bahnhofs
firstname:bahnhofst
firstname:bahnhofstr*
ちなみに、実際に自分でクエリ文字列を生成することはありません。TermQuery オブジェクトと PrefixQuery オブジェクトを自分で作成するだけです。
スコアリングは少し歪んでおり、おそらく長いクエリをより高くブーストして、より適切な順序付けを行うことができますが、それは、探しているものをかなり簡単に正確に達成するために頭に浮かぶ方法です. DisjunctionMaxQueryは、このようなものを他の用語と一緒に使用して、より妥当なスコアを取得するのに役立ちます。
ただし、あいまいなクエリがうまく機能することを願っています。はるかに優れたソリューションのようです。
別のオプションとして、この性質のクエリが必要な場合は、インデックスを作成するときに、フィールドを n-gram にトークン化することもできます ( NGramTokenizerを参照)。これにより、 NGramPhraseQueryを効果的に使用して、必要な結果を得ることができます。