正则表达式将带连字符的单词与无连字符的查询匹配

Posted

技术标签:

【中文标题】正则表达式将带连字符的单词与无连字符的查询匹配【英文标题】:Regex match hyphenated word with hyphen-less query 【发布时间】:2021-12-17 06:11:04 【问题描述】:

我设置了一个 Azure 存储表,其中包含许多值,其中包含连字符、撇号和其他一些 Azure 索引器不喜欢的标点符号。 Hyphenated-Word 在索引时被分成两个标记 - HyphenatedWord。因此,这意味着搜索HyphenatedWord 不会产生任何结果,无论是否有任何通配符或模糊匹配字符。也就是说,Azure 认知搜索支持 Regex Lucene 查询...

因此,我正在尝试找出是否有正则表达式模式可用于将带有或不带有连字符的单词与给定的查询进行匹配。例如,查询homework 应该匹配结果homework home-work

我知道,如果我试图反其道而行之——即使在查询中提供了连字符也匹配未连字符的单词——我会使用类似 /home(-)?work/ 的内容。但是,我不确定逆向是什么样子——如果这样的事情存在的话。

是否有一个原始的正则表达式模式可以执行我提议的那种匹配?还是我是 SOL?

编辑:我应该指出我提供的示例是不切实际的,因为我并不总是知道连字符应该在哪里。理想情况下,执行此匹配的模式与连字符的精确位置无关。

Edit 2:我发现一个工作但并不完全最佳的解决方案(而且,虽然我没有办法证明这一点,可能不是performant)只是分解查询,删除所有导致令牌中断的特殊字符,然后动态构建一个正则表达式查询,在每个之间都有一个可选匹配查询中的字符。使用homework 示例,该模式看起来类似于[-'\.! ]?h[-'\.! ]?o[-'\.! ]?m[-'\.! ]?e[-'\.! ]?w[-'\.! ]?o[-'\.! ]?r[-'\.! ]?k[-'\.! ]?...这可能是我见过的最丑陋的东西。尽管如此,它还是完成了工作。

【问题讨论】:

【参考方案1】:

要添加到 Jennifer 的答案,您可以考虑使用由以下任一令牌过滤器组成的自定义分析器:

pattern_replace:一个标记过滤器,它将模式应用于流中的每个标记,用指定的替换字符串替换匹配项。 pattern_capture:使用 Java 正则表达式发出多个令牌,一个用于一个或多个模式的每个捕获组。

您可以使用 pattern_replace 标记过滤器将连字符替换为所需的字符,可能是空字符。

【讨论】:

【参考方案2】:

我对此类场景的解决方案始终是引入内容处理和查询处理。

当您通过 SDK 使用推送模型时,内容处理会更容易,但您可以通过创建表的影子/副本来实现相同的目的,在其中操作内容以用于索引目的。你让你原来的桌子保持不变。然后您维护一个重复的表格,您的文本在其中处理。

无论如何,您都应该使用查询处理。在最简单的形式中,您希望在查询中使用它之前清除来自最终用户的输入。其他步骤可以是处理连字符等特殊字符。逃避它,剥离它,或者根据您的要求进行任何操作。

示例

我必须支持搜索可能包含连字符或其他特殊字符的订购代码。我们订购代码的维护者可能会以不一致的格式定义订购代码。访问我们网站的客户同样不一致。

要求是 ABC-123-DE_F-4.56G 应该匹配任何一个

ABC-123-DE_F-4.56G ABC123-DE_F-4.56G ABC_123_DE_F_4_56G ABC.123.DE.F.4.56G ABC 123 DEF 56 G ABC123DEF56G

我使用上面建议的方法解决了这个问题。我使用内容处理来生成没有任何特殊字符的订购代码版本(使用简单的正则表达式)。然后,我使用查询处理将最终用户的输入转换为 OR 查询,例如:

<verbatim-user-input-cleaned> OR OrderCodeVariation:<verbatim-user-input-without-special-chars>

所以,如果用户输入 ABC.123.DE.F.4.56G 我会有效地搜索

ABC.123.DE.F.4.56G OR OrderingCodeVariation:ABC123DEF56G

【讨论】:

【参考方案3】:

听起来您想定义自己的标记化。使用自定义标记器有帮助吗? https://docs.microsoft.com/azure/search/index-add-custom-analyzers

【讨论】:

我使用 Azure Web 界面来处理我的所有数据源、索引和索引器,因此我从未以编程方式完成任何与索引相关的工作。 Azure Web 界面中是否有一些地方可以添加自定义分析器,还是我必须以编程方式完成? 这里有一个教程可以帮助您通过 Postman 调用 REST 端点:docs.microsoft.com/azure/search/tutorial-create-custom-analyzer 但是如果您使用“导入数据”在Azure portal 中提取数据,当您进入“自定义目标索引”屏幕时,会出现各种分析器的下拉列表,但这提供了所有各种内置分析仪选项。正如您所说,我相信您必须以编程方式创建自定义分析器。

以上是关于正则表达式将带连字符的单词与无连字符的查询匹配的主要内容,如果未能解决你的问题,请参考以下文章

使用正则表达式将带引号的字符串与嵌入的非转义引号匹配

正则表达式匹配一定长度的单词

javascript 正则表达式匹配任何脚本中所有非单词字符的正确正则表达式范围是多少?

正则表达式匹配在任意位置连字符并分成两行的特定单词

JavaScript正则表达式二

如何使用正则表达式,将字符串中的每个单词首字母大写