如何避免Lucene将查询字符串标记为包含' /'或者' - '?

时间:2016-08-25 12:47:03

标签: lucene

美好的一天!

在我的文档中,我有一个日期字段,其中包含 ISO-8601 日期,该字段也可以是" 25- 08-2016 / P1D"

我想搜索一个具有这个日期或期间的文档 - 所以,只需要具有相同的值" date"领域。不幸的是,我无法做到这一点。尝试了不同的查询字符串,包括转义或不转义,如

  • 日期:" 25-08-2016 / P1D" - 转换为PhraseQuery,但失败了 异常,AFAIUI,因为字段只是一个字符串字段
  • 日期:" 25-08-2016 / P1D" - 与上述相同
  • 日期:25-08-2016 / P1D - 不会因异常而失败,但仍会创建PhraseQuery,并且 没有找到任何东西
  • 日期:25-08-2016 / P1D - 使用" org.apache.lucene.queryparser.classic.TokenMgrError解析失败:第1行第150列的词汇错误。遇到:之后:" / P1D"

我做错了什么?如何告诉Lucene使用简单的字符串匹配搜索此字段,而不进行任何标记化?

1 个答案:

答案 0 :(得分:0)

经过一些研究,我得到了,转义查询字符串是错误的方法 - 正确的方法是自定义查询分析器的必要字段(在我的情况下为“日期”)。

Map<String, Analyzer> analyzerPerField = new HashMap<String, Analyzer>();
        analyzerPerField.put("date", new WhitespaceAnalyzer());
        analyzer = new PerFieldAnalyzerWrapper(
                    new StandardAnalyzer(), analyzerPerField);
        parser = new QueryParser("title", analyzer);

在给定的代码中,我们只使用 WhitespaceAnalyzer (用空格划分查询)而不是默认使用的 SimpleAnalyzer ,它将文本除以非字母。 WhitespaceAnalyzer 不会破坏ISO-8601日期。

有关lucene中自定义分析/标记化的其他详细信息,请参阅例如http://www.hascode.com/2014/07/lucene-by-example-specifying-analyzers-on-a-per-field-basis-and-writing-a-custom-analyzertokenizer/