Luceneを使用する場合、私がお勧めするオプションがいくつかあります。
1つは、 KeywordAnalyzerを使用して商品IDにインデックスを付けてから、ファジークエリを使用して提案どおりにクエリを実行することです。
または、カスタムアナライザーを作成することもできます。このアナライザーでは、WordDelimiterFilter
変更時にトークンを作成し、ダッシュとスペース(トークナイザーを通過した後にトークンに存在する場合)を追加します。重要な注意点として、StandardAnalyzer、SimpleAnalyzer、または同様のものを使用している場合は、のWordDelimiterFilter
前にが適用されていることを確認する必要がありLowercaseFilter
ます。もちろん、それを実行するLowercaseFilter
と、ラクダのケーシングに基づいて用語を分割することができなくなります。もう1つの注意点として、「I」は一般的な英語のストップワードであるため、 StopFilterをカスタマイズすることをお勧めします。
カスタムアナライザーでは、主にをオーバーライドする必要がありますcreateComponents()
。たとえばWordDelimiterFilter
、StandardAnalyzerのフィルタセットに機能を追加する場合は、次のようにします。
@Override
protected TokenStreamComponents createComponents(String fieldName, Reader reader) {
Tokenizer tokenizer = new StandardTokenizer(Version.LUCENE_40,reader);
TokenStream filter = new StandardFilter(Version.LUCENE_40,tokenizer);
//Take a look at the WordDelimiterFactory API for other options on this filter's behavior
filter = new WordDelimiterFilter(filter,WordDelimiterFilter.GENERATE_WORD_PARTS,null);
filter = new LowercaseFilter(Version.LUCENE_40,filter);
//As mentioned, create a CharArraySet of your stopwords, since the default will likely cause problems for you
filter = new StopFilter(Version.LUCENE_40,filter,myStopWords);
return new TokenStreamComponents(tokenizer, filter);
}