如何逃避加号lucene图书馆4.1.0

时间:2014-12-01 08:51:57

标签: java sql lucene

我的查询是cs_contents:(canal+) OR cs_docs:(canal+) OR cs_annots:(canal+)

lucene传递时,查询变为+((cs_contents:canal cs_contents:canal) (cs_docs:canal cs_docs:canal) (cs_annots:canal cs_annots:canal)) +DBName:dPortal +TableName:CASE_ACTION

即使我用反斜杠转义加号它也不起作用,因为反斜杠也是这个库中的一个特殊字符。

4 个答案:

答案 0 :(得分:0)

然后我建议您尝试转义反斜杠:\\ +

答案 1 :(得分:0)

我认为你可以用这样的引号来写你的文字。

cs_contents:"(canal+)" OR cs_docs:"(canal+)" OR cs_annots:"(canal+)"

答案 2 :(得分:0)

双反斜杠可以解决问题(org.apache.lucene.queryparser.flexible.standard.QueryParserUtil如何做到这一点),但是当且仅当<{strong>} +在该字段中时才会起作用首页的!

如果您在索引编制期间标记化字段,则+字符不可能是索引值的一部分,并且如果您在查询时使用相同的标记化分析器解析您&# 39;无论是否转义(查询字符串通过分析器传递),都不会搜索到+

一种解决方法是不使用相关特殊字符标记化字段 - 并在查询解析时使用非标记化分析器(例如KeywordAnalyzer) - 如果您可以区分具有特殊字符的查询和不具有特殊字符的查询...

Lucene使用的值(在索引中,在查询中)通常不是传递给lucene的确切值,例如通常所有的字符串都是小写的(不言自明)和标记化的(分成单词,去掉特殊字符)。这取决于使用的分析器,字段类型等。

<强>索引

Analyzer(field value) = value stored in index

查询时间

QueryParser(Analyzer(query string)) = query passed to Lucene

答案 3 :(得分:0)

QueryParser documentation解释了应该转义的内容。执行此类转义的编程方法是使用QueryParserBase.escape(String)