11

正则表达式允许使用如下所示的模式匹配语法。我正在尝试实现一个功能强大的搜索工具,尽可能多地实现这些功能。有人告诉我,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
4

2 回答 2

15

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

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

所以一个简单的例子:

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

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

正则表达式方言必须是 Java 的,但我不确定其中的一切是否有效,因为我只是粗略地检查了一下。人们可能不得不仔细查看RegexpQuery代码以了解哪些有效,哪些无效。

于 2012-03-06T01:06:41.743 回答
4

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

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

尽管如此,Lucene 还是提供了RegexQuery和更新的RegexpQuery。据我所知,这些没有与 Solr 集成,但它们可以集成。在Solr 问题跟踪器中开始一个新项目并快乐编码!:)

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

于 2012-02-17T19:24:38.850 回答