我正在使用Apache Lucene 5.5.3。我在我的代码中使用org.apache.lucene.analysis.standard.StandardAnalyzer
并使用下面的代码段来创建索引。
Document doc = new Document();
doc.add(new TextField("userName", getUserName(), Field.Store.YES));
现在,如果我搜索字符串'ALL',那么我没有得到任何搜索结果,但如果我搜索字符串'ALL-Categories',那么我会得到一些搜索结果。
对于带有特殊字符'+','。','!'的字符串,也会发生同样的事情。等
以下是我的搜索代码: -
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)
请参阅Escaping Special Characters部分以了解Lucene 5.5.3中的特殊字符。
正如上文所述,您需要放置\
,或者您可以使用public static String escape(String s)
类的方法QueryParser
来实现相同目标。
答案 1 :(得分:0)
我使用WildcardQuery,StringField和MultiFieldQueryParser组合获得了解决方案。除了这些类之外,我们要做的就是转义查询字符串中的空格