【问题标题】:Solr regex query global flagSolr 正则表达式查询全局标志
【发布时间】:2013-02-27 14:43:19
【问题描述】:

我想在 solr name:/.+\.m+d$/ 中运行以下正则表达式查询。我的索引中有以下名称的文档:

readme.md
2013.02.26.md
test.mmd

它们都不匹配。删除 $ 匹配 readme.md 条目。我认为问题在于我需要指定一个全局模式修饰符,但找不到执行此操作的语法。

【问题讨论】:

    标签: solr


    【解决方案1】:

    这些是我基于对 Solr 正则表达式匹配进行试验的观察结果:

    • 对正则表达式中的所有特殊字符执行HTML percent encodingThis site 有助于手动进行百分比编码。

    • 如果要匹配整个值,请确保对字符串字段进行正则表达式匹配。文本字段上的正则表达式匹配将涉及标记化,并将根据索引期间生成的标记进行工作。

    • 对于 solr 正则表达式,不要指定开始锚点 ^ 或结束锚点 $,因为它始终假定您匹配整个字符串。除非您在开头或结尾指定.*.+(或某些此类正则表达式),否则它始终与开头的^ 和结尾的$ 匹配。

      李>

    我刚刚在一个字符串字段中索引了您问题中的 3 个值并发出了这个查询,它匹配所有 3 个文档:

    q=id:/.%2B%5C.m%2Bd/
    

    .%2B%5C.m%2Bd 的 PCRE 是 .+\.m+d$

    【讨论】:

    • 感谢您的回复。我注意到我的名称字段是 text_general,但更改为字符串似乎没有任何效果。还搜索 id 字段我得到相同的结果。顺便说一句,我正在使用 Solr Admin 查询进行测试,并且转义是通过表单完成的,所以我认为这不是问题所在。
    • 实际上将字段更改为字符串似乎已经解决了这个问题。它现在无需正则表达式即可工作,即名称:*.m*d。正如您指出的那样使用正则表达式时,您不需要尾随 $。再次感谢您的帮助。
    • 谢谢,在尝试找到有关 solr regexp 的文档后,您的评论终于帮助了我。在创建字符串索引并将 .* 放在开头和结尾之后,我的 sorl 正则表达式按预期工作:)
    • @arun,原则上您对百分比编码的事情是正确的,但除非您正在使用curl 进行一些快速测试,否则您作为程序员的工作应该在您完成的那一刻完成已构建查询对象。它的序列化包括转义应该由您的 HTTP 查询工具(例如,jQuery.ajax)完成。如果您在生产环境中手动/显式执行此操作,则几乎可以肯定您做错了。
    • @flow,对。我使用 SolrJ。这仅用于直接通过 REST 接口测试查询
    【解决方案2】:

    我在 Reg exp buddy 中尝试过这个。 IT 符合您的测试。

    .+\.m+d
    

    用于遍历字符串中所有匹配项的 php (Preg) 语法。

    preg_match_all('/.+\.m+d/', $subject, $result, PREG_PATTERN_ORDER);
    for ($i = 0; $i < count($result[0]); $i++) {
        # Matched text = $result[0][$i];
    }
    

    这是如果 ^$ 在换行符处匹配并且点匹配新行且不区分大小写

    preg_match_all('/.+\.m+d/sim', $subject, $result, PREG_PATTERN_ORDER);
    for ($i = 0; $i < count($result[0]); $i++) {
        # Matched text = $result[0][$i];
    }
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-27
    • 2018-07-17
    • 2022-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多