正则表达式允许使用下面显示的模式匹配语法。 我正在尝试实现一个功能强大的搜索工具,尽可能多地实现这些工具。 我被告知edismax是这项工作最灵活的工具。 下面哪个模式匹配表达式可以用edismax完成?我能做得比edismax好吗?您能否建议我可以使用哪些过滤器和解析器补丁来实现此功能?如果我认为Solr能够达到这类搜索的可接受性能(即服务器端处理时间),我是否会梦想?
正则表达式语法& mysql
中的示例'fofo' REGEXP '^fo' => true
'fo\no' REGEXP '^fo\no$' => true
'Baaaan' REGEXP 'Ba*n' => true
'Baan' REGEXP '^Ba?n => false'
'Bn' REGEXP 'Ba+n' => false
'pi' REGEXP 'pi|apa' => true
'pipi' REGEXP '^(pi)*$' => true
'aXbc' REGEXP '[a-dXYZ]' => true
'abcde' REGEXP 'a[bcd]{3}e' => true
'justalnums' REGEXP '[[:alnum:]]+' => true
答案 0 :(得分:15)
Lucene 4.0版将使用特殊语法直接在标准查询解析器中支持正则表达式查询。我验证它适用于我正在运行的Solr实例,它是在二月份的subversion主干中构建的。
Jira ticket 2604使用特殊的正则表达式语法描述标准查询解析器的扩展,使用正斜杠来划分正则表达式,类似于Javascript中的语法。它似乎使用底层的RegexpQuery解析器。
这是一个简短的例子:
body:/[0-9]{5}/
将匹配我编入索引的文本语料库中的五位邮政编码。但是,奇怪的是,身体:/ \ d {5} /对我不起作用,^也失败了。
正则表达式方言必须是Java的,但我不确定它是否有效,因为我只是粗略地检查了一下。人们可能不得不仔细查看RegexpQuery代码,以了解哪些有效,哪些无效。
答案 1 :(得分:4)
正则表达式和(e)dismax实际上不具有可比性。 Dismax意味着直接与常见的最终用户输入一起工作,而正则表达式不是典型的最终用户输入。
此外,将类似正则表达式的事物与dismax匹配在很大程度上取决于text analysis settings和架构设计,而不是dismax本身。使用Solr,您通常可以根据具体的搜索需求定制模式和文本分析,从而可能在索引时完成大部分工作。正则表达式与此不一致,甚至与Lucene倒排索引的基本结构相符。
然而,Lucene提供了RegexQuery和更新的RegexpQuery。据我所知,这些并没有与Solr集成,但它们可能是。在Solr issue tracker中开始一个新项目并快乐编码! :)
请记住,正则表达式查询可能总是很慢......但在您的情况下,它们可以具有可接受的性能。