【发布时间】:2012-04-17 21:04:20
【问题描述】:
我有一个 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 组合;之后,该查询可能会与其他搜索条件相结合。
【问题讨论】:
-
你能提供一些搜索代码(QueryParser 创建,搜索代码)吗?当你说:“取消对我的搜索字符串的转义”时,你究竟是什么意思?
-
@JfBeaulac 我认为他的意思是他正在注释掉对 QueryParser.Escape(searchTerm) 的调用 - 但最好得到一些澄清和一些示例代码。
-
在尝试转义搜索字符串之前先查看索引内容stackoverflow.com/questions/7842024/…
-
@JfBeaulac 撤消转义时,我右键单击 Visual Studio 中的监视项(在调试时)并选择“编辑”。然后我手动删除了括号前的反斜杠。保存对查询的深层嵌入 Term 对象的 Text 属性的更改并继续执行后,搜索成功。
标签: c# lucene.net