【问题标题】:How to avoid Lucene from tokenizing query string containg '/' or '-'?如何避免 Lucene 对包含“/”或“-”的查询字符串进行标记?
【发布时间】:2017-01-01 21:55:28
【问题描述】:

美好的一天!

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

我想搜索具有此日期或时间段的文档 - 因此,只需具有相同的“日期”字段值。不幸的是,我无法做到这一点。尝试了不同的查询字符串,转义或不转义,如

  • date:"25-08-2016/P1D" - 转换为 PhraseQuery,但失败并显示 例外,AFAIUI,因为一个字段只是一个字符串字段
  • date:"25-08-2016/P1D" - 同上
  • 日期:25-08-2016/P1D - 不会因异常而失败,但仍会创建 PhraseQuery,并且 什么都找不到
  • 日期:25-08-2016/P1D - 解析失败,出现“org.apache.lucene.queryparser.classic.TokenMgrError:第 1 行第 150 列出现词法错误。遇到:之后:“/P1D”

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

【问题讨论】:

    标签: lucene


    【解决方案1】:

    经过我的一些研究,转义查询字符串是一种错误的方法 - 实现此目的的正确方法是为必要的字段(在我的例子中为“日期”)自定义查询分析器。

    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/

    【讨论】:

      猜你喜欢
      • 2012-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-16
      • 1970-01-01
      • 2013-07-24
      相关资源
      最近更新 更多