2017-01-03 11 views
1

私はApache Lucene 5.5.3を使用しています。私はorg.apache.lucene.analysis.standard.StandardAnalyzerを私のコードに使用しており、以下のコードスニペットを使ってインデックスを作成しています。Apache Lucene 5.5.3 - 特殊文字で終わる文字列を検索する

Document doc = new Document(); 

doc.add(new TextField("userName", getUserName(), Field.Store.YES)); 

は今、私はその後、私はすべての検索結果を取得していないよ、「オール」という文字列を検索しますがあれば、私は、文字列「ALL-カテゴリー」を検索すると、その後、私はいくつかの検索結果を取得しています。

特殊文字 '+'、 '。'、 '!'の文字列でも同じことが起こります。など

以下は私の検索コードである: -

Directory directory = new RAMDirectory(); 
IndexReader reader = DirectoryReader.open(directory); 
IndexSearcher searcher = new IndexSearcher(reader); 
Document document = new Document(); 
document.add(new TextField("body", ALL-THE GLITTERS IS NOT GOLD, Field.Store.YES)); 

IndexWriter writer = new IndexWriter(directory, new IndexWriterConfig(buildAnalyzer())); 
writer.addDocument(document); 
writer.commit(); 

Builder builder = new BooleanQuery.Builder(); 

Query query1 = new QueryParser(IndexAttribute.USER_NAME, buildAnalyzer()).parse(searchQUery+"*"); 
Query query2 = new QueryParser(IndexAttribute.IS_VETERAN, buildAnalyzer()).parse(""+isVeteran); 
builder.add(query1, BooleanClause.Occur.MUST); 
builder.add(query2, BooleanClause.Occur.MUST); 

Query q = builder.build(); 

TopDocs docs = searcher.search(q, 10); 
ScoreDoc[] hits = docs.scoreDocs; 

private static Analyzer buildAnalyzer() throws IOException { 
    return CustomAnalyzer.builder().withTokenizer("whitespace").addTokenFilter("lowercase") 
      .addTokenFilter("standard").build(); 
} 

だから、私はこの上で提案してください。

+0

最後に文字列にハイフンがありますか?インデックス値は何ですか?検索コードも表示してください。 –

+0

はい、私は最後に特殊文字を持っています。私の索引付けされた値は「ALL-THE GLITTERS IS GOLD」です。 – Raj

+0

失敗した検索結果を表示するには 'q.toString()'の値を表示し、 'searchquery'と' isVeteran'変数の値も指定する必要があります。 –

答えて

0

私は、WildcardQuery、StringField、およびMultiFieldQueryParserの組み合わせで解決策を得ました。これらのクラスに加えて、クエリ文字列内のスペースをエスケープすることが必要です

0

Lucene 5.5.3の特殊文字については、Escaping Special Charactersのセクションを参照してください。

上記のように、\を配置するか、public static String escape(String s)QueryParserクラスを使用して同じ結果を得ることができます。

+0

お返事ありがとうSabir。私はそれを試しましたが、期待どおりに動作していませんでした。私は、WildcardQuery、StringField、MultiFieldQueryParserの組み合わせで解決策を得ました。これらのクラスに加えて、クエリ文字列内のスペースをエスケープする必要があります。 – Raj

関連する問題