【问题标题】:Lucene.net escaped characters not found, but un-escaped characters are found - when should I escape?未找到 Lucene.net 转义字符,但找到未转义字符 - 我应该何时转义?
【发布时间】: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));

在构造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 组合;之后,该查询可能会与其他搜索条件相结合。

【问题讨论】:

  • 你能提供一些搜索代码(QueryParser 创建,搜索代码)吗?当你说:“取消对我的搜索字符串的转义”时,你究竟是什么意思?
  • @JfBeaulac 我认为他的意思是他正在注释掉对 QueryParser.Escape(searchTerm) 的调用 - 但最好得到一些澄清和一些示例代码。
  • 在尝试转义搜索字符串之前先查看索引内容stackoverflow.com/questions/7842024/…
  • @JfBeaulac 撤消转义时,我右键单击 Visual Studio 中的监视项(在调试时)并选择“编辑”。然后我手动删除了括号前的反斜杠。保存对查询的深层嵌入 Term 对象的 Text 属性的更改并继续执行后,搜索成功。

标签: c# lucene.net


【解决方案1】:

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

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

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

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

【讨论】:

  • 所以如果使用 Parse 方法,我只需要转义我的输入吗?我需要对通配符查询进行任何转义吗? var wildQuery = new WildcardQuery(new Term(field, searchValue));
  • 是的,Escape 方法将转义 Parse 方法用来从输入字符串构造查询的字符。由于您手动创建查询,因此不需要此方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-21
  • 2014-04-10
  • 1970-01-01
  • 1970-01-01
  • 2011-06-25
  • 1970-01-01
相关资源
最近更新 更多