我有一个Lucene.net索引,其中一个字段接收许多包含括号的条目。在搜索该字段之前,我通过QueryParser.Escape(searchTerm)
运行搜索字词。如果我搜索包含括号的条目,则找不到它。但是在运行Visual Studio调试器时,我将转义符撤消到我的搜索字符串,搜索成功找到了我的条目。
索引我的数据时,我正在使用标准分析器。对于这个领域,我存储它但不分析它。
doc.Add(new Field("fieldName", fieldValue, Field.Store.YES, Field.Index.NOT_ANALYZED));
在构建Term
或TermQuery
对象时,是否有比试错更好的方法来了解是否应该转义(甚至是哪些)特殊字符?
这有效:
List<Query> queryParts = new List<Query>;
queryParts.Add(new TermQuery(new Term("fieldName", searchValue)));
我第一次尝试但没有奏效:
List<Query> queryParts = new List<Query>;
queryParts.Add(new TermQuery(new Term("fieldName", QueryParser.Escape(searchValue))));
searchValue
来自用户输入。索引值和搜索值都应包含括号和可能对Lucene具有特殊意义的其他字符。
queryParts
收集多个搜索条件,最终合并为一个BooleanQuery
,具体取决于用户的选择,所有元素都可以与BooleanClause.Occur.MUST
或BooleanClause.Occur.SHOULD
结合使用;之后,该查询可以与其他搜索条件结合使用。
答案 0 :(得分:2)
如果您不使用输入来调用QueryParser.Parse(string),则不需要使用QueryParser.Escape()。
当你这样做时会发生Escape方法会在你的输入中添加转义字符,但是由于你手动构建了你的术语,所以转义字符将保留在那里并且尝试lucene以便搜索它们。
索引值和搜索值都应包含括号和可能对Lucene具有特殊意义的其他字符
这些字符对QueryParser Parse方法有特殊意义,它们在其他地方没有特别的意义。