1

我有一个 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;之后,该查询可能会与其他搜索条件相结合。

4

1 回答 1

2

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

当您这样做时会发生什么,Escape 方法会将转义字符添加到您的输入中,但由于您手动构建您的术语,转义字符将保留在那里并且 lucene 尝试因此搜索它们。

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

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

于 2012-04-18T13:44:33.203 回答