【问题标题】:What regular expression features are supported by Solr edismax?Solr edismax 支持哪些正则表达式功能?
【发布时间】:2012-03-09 02:15:57
【问题描述】:

正则表达式允许使用如下所示的模式匹配语法。 我正在尝试实现一个功能强大的搜索工具,尽可能多地实现这些功能。 我听说 edismax 是最灵活的工具。 下面哪些模式匹配表达式可以用 edismax 完成?我能比edismax做得更好吗?您能否建议我可以使用哪些过滤器和解析器补丁来实现此功能?如果我认为 Solr 可以在这些类型的搜索中实现可接受的性能(即服务器端处理时间),我是不是在做梦?

来自mysql的正则表达式语法和示例

  1. ^ 匹配字符串的开头。 'fofo' REGEXP '^fo' => true
  2. $ 匹配字符串结尾。 'fo\no' REGEXP '^fo\no$' => true
  3. * 0-无限通配符。 'Baaaan' REGEXP 'Ba*n' => true
  4. ? 0-1 通配符。 'Baan' REGEXP '^Ba?n => false'
  5. + 1-无限通配符。 'Bn' REGEXP 'Ba+n' => false
  6. |要么。 'pi' REGEXP 'pi|apa' => true
  7. ()* 序列匹配。 'pipi' REGEXP '^(pi)*$' => true
  8. [a-dX], [^a-dX] 字符范围/集'aXbc' REGEXP '[a-dXYZ]' => true
  9. {n} 或 {m,n} 基数符号'abcde' REGEXP 'a[bcd]{3}e' => true
  10. [:character_class:] 'justalnums' REGEXP '[[:alnum:]]+' => true

【问题讨论】:

    标签: regex solr edismax


    【解决方案1】:

    Lucene 4.0 版将使用特殊语法直接在标准查询解析器中支持正则表达式查询。我验证了它可以在我正在运行的 Solr 实例上运行,该实例是在 2 月份从 subversion 主干构建的。

    Jira ticket 2604 描述了标准查询解析器使用特殊正则表达式语法的扩展,使用正斜杠来分隔正则表达式,类似于 Javascript 中的语法。它似乎正在使用底层的 RegexpQuery 解析器。

    一个简单的例子:

    body:/[0-9]{5}/
    

    将匹配我索引的文本语料库中的五位数邮政编码。但是,奇怪的是,body:/\d{5}/ 对我不起作用,^ 也失败了。

    正则表达式方言必须是 Java 方言,但我不确定其中的所有内容是否有效,因为我只是粗略检查了一下。可能需要仔细查看RegexpQuery 代码才能了解哪些有效,哪些无效。

    【讨论】:

    • 我挖得更远了。有一个page that describes the supported syntax。正则表达式引擎毕竟不是 Java 的,而是在 Lucene 的 org.apache.lucene.util.automaton 包中实现的。另请参阅RegexpQuery 的文档。
    • 刚刚在 Solr 4.0 中的字符串字段上尝试了\d{4}。这是行不通的。看来我们只能使用[0-9]{4}。但是我猜 ^ 是不需要的,因为像 /[0-9]{5}/ 这样的任何查询实际上都等同于 Perl-Compatible RegEx /^[0-9]{5}$/ 即不使用 .* 作为前缀意味着您从第一个字符开始强制匹配。
    • @RonaldWood 您发布的两个链接现在都已失效。
    • Lucene 项目移动了它的 javadocs。他们自己的一些链接也被破坏了。试试这些更新的链接:RegExpRegexpQuery
    • ElasticSearch 有一个good overview of the query syntax
    【解决方案2】:

    正则表达式和 (e)dismax 没有可比性。 Dismax 旨在直接处理常见的最终用户输入,而正则表达式不是典型的最终用户输入。

    另外,用 dismax 匹配类似正则表达式的东西很大程度上取决于text analysis settings 和模式设计,而不是 dismax 本身。使用 Solr,您通常可以根据具体搜索需求定制模式和文本分析,可能在索引时完成大部分工作。正则表达式与此不一致,甚至与 Lucene 倒排索引的基本结构不一致。

    不过,Lucene 提供了RegexQuery 和更新的RegexpQuery。据我所知,这些没有与 Solr 集成,但它们可以集成。在Solr issue tracker 中开始一个新项目并快乐编码! :)

    请记住,正则表达式查询可能总是很慢...但在您的情况下它们可能具有可接受的性能。

    【讨论】:

      猜你喜欢
      • 2014-10-14
      • 1970-01-01
      • 2012-01-28
      • 1970-01-01
      • 2011-02-08
      • 1970-01-01
      • 1970-01-01
      • 2016-11-21
      • 1970-01-01
      相关资源
      最近更新 更多