Apache Lucene 5.5.3 - 搜索以特殊字符

时间:2017-01-03 19:05:32

标签: lucene special-characters

我正在使用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();
}

所以,请在此建议我。

2 个答案:

答案 0 :(得分:0)

请参阅Escaping Special Characters部分以了解Lucene 5.5.3中的特殊字符。

正如上文所述,您需要放置\,或者您可以使用public static String escape(String s)类的方法QueryParser来实现相同目标。

答案 1 :(得分:0)

我使用WildcardQuery,StringField和MultiFieldQueryParser组合获得了解决方案。除了这些类之外,我们要做的就是转义查询字符串中的空格