大文字と小文字を区別するか、大文字と小文字を区別しない検索を行うオプションをユーザーに与えたいと考えています。Lucene大文字と小文字を区別するかどうかを切り替える方法
私の考えでは、大文字と小文字を区別するアナライザを使用してデータをインデックス付けし、ユーザの入力に応じて機密または非機密性のアナライザを使用して検索します。
だから私は私の大文字と小文字を区別アナライザを作成し、ここに私のコードの簡単です:インデックスについては
public final class CaseSensitiveStandardAnalyzer extends StopwordAnalyzerBase {
@Override
protected TokenStreamComponents createComponents(final String fieldName, final Reader reader) {
final StandardTokenizer src = new StandardTokenizer(matchVersion, reader);
src.setMaxTokenLength(maxTokenLength);
TokenStream tok = new StandardFilter(matchVersion, src);
tok = new StopFilter(matchVersion, tok, stopwords);
return new TokenStreamComponents(src, tok) {
@Override
protected void setReader(final Reader reader) throws IOException {
src.setMaxTokenLength(CaseSensitiveStandardAnalyzer.this.maxTokenLength);
super.setReader(reader);
}
};
}
私はこれを使用:検索するための
Analyzer analyzer = new CaseSensitiveStandardAnalyzer(Version.LUCENE_46);
IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_46,analyzer);
IndexWriter indexWriter = new IndexWriter(indexDir,config);
indexWriter.addDocument(document);
を私が使用:
Analyzer analyzer;
if(caseSentive)
analyzer = new CaseSensitiveStandardAnalyzer(Version.LUCENE_46);
else
analyzer = new StandardAnalyzer(Version.LUCENE_46);
QueryParser queryParser = new QueryParser(Version.LUCENE_46,"content", analyzer);
Query query = queryParser.parse(searchString);
//Search
TopDocs results = indexSearcher.search(query,10000);
ScoreDoc[] hits = results.scoreDocs;
を
これを疲れさせたとき、敏感なケースは機能しましたが、無感覚のケースはそうではありませんでした。
さらに調査した結果、低ケアクエリで大文字と小文字を区別するアナライザを使用すると機能しないことが判明しました。大文字と小文字を区別するクエリを使用した大文字と小文字を区別したアナライザのインデックス付き作業、および大文字と小文字を区別しないクエリを使用したインデックス付き作業では、誰でもこれを確認できますか?
大文字と小文字を区別しないで検索する唯一の信頼できる方法は、それぞれの場合に1つずつ2回インデックスを作成することです。これは正しいですか?