Lucene.net逃脱了未找到的角色,但发现了未逃脱的角色 - 我何时才能逃脱?

时间:2012-04-17 21:04:21

标签: c# lucene.net

我有一个Lucene.net索引,其中一个字段接收许多包含括号的条目。在搜索该字段之前,我通过QueryParser.Escape(searchTerm)运行搜索字词。如果我搜索包含括号的条目,则找不到它。但是在运行Visual Studio调试器时,我将转义符撤消到我的搜索字符串,搜索成功找到了我的条目。

索引我的数据时,我正在使用标准分析器。对于这个领域,我存储它但不分析它。

字段索引:

doc.Add(new Field("fieldName", fieldValue, Field.Store.YES, Field.Index.NOT_ANALYZED));

在构建TermTermQuery对象时,是否有比试错更好的方法来了解是否应该转义(甚至是哪些)特殊字符?

修改

在字段中搜索:

这有效:

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.MUSTBooleanClause.Occur.SHOULD结合使用;之后,该查询可以与其他搜索条件结合使用。

1 个答案:

答案 0 :(得分:2)

如果您不使用输入来调用QueryParser.Parse(string),则不需要使用QueryParser.Escape()。

当你这样做时会发生Escape方法会在你的输入中添加转义字符,但是由于你手动构建了你的术语,所以转义字符将保留在那里并且尝试lucene以便搜索它们。

  

索引值和搜索值都应包含括号和可能对Lucene具有特殊意义的其他字符

这些字符对QueryParser Parse方法有特殊意义,它们在其他地方没有特别的意义。