我的查询是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
即使我用反斜杠转义加号它也不起作用,因为反斜杠也是这个库中的一个特殊字符。
答案 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)
。