【问题标题】:Azure Search - regex searchAzure 搜索 - 正则表达式搜索
【发布时间】:2020-06-23 02:33:44
【问题描述】:

我正在尝试配置 Azure 搜索以查找一些具有特殊字符的字符串,例如 ABC*DEF

当我使用"ABC*DEF" 查找完整术语时,它可以完美运行。

如果我想使用正则表达式,问题就来了:

  • 当我使用部分术语时,例如/(.*)ABC(.*)/,结果没有问题
  • 当我使用部分术语时,例如/(.*)DEF(.*)/,结果没有问题
  • 但是当我尝试查找类似/(.*)C\*D(.*)/ 的内容时,结果为空。

我正在使用标准分析仪。我也尝试了关键字分析器,但这样正则表达式搜索根本不起作用。

有什么建议吗?

【问题讨论】:

  • 最后没有尾随 /。另一种可能性可能是不得不转义反斜杠。你试过 /(.*)C\\*D(.*)/ 吗?在某些语言中,在轮到正则表达式引擎之前会进行一定程度的解析。恐怕我对 Azure 搜索没有任何直接经验。
  • 谢谢,缺少的尾随 / 是一个错字。是的,我也试过了,还是不行。

标签: azure lucene azure-cognitive-search


【解决方案1】:

您将无法使用标准分析器创建匹配 ABC*DEF 的正则表达式。

如果您使用“标准”分析器通过analyzer api 运行"ABC\*DEF",您将看到ABC*DEF 在索引时被分成2 个标记-> "ABC" 和"DEF"。不分析正则表达式,但是,它们需要匹配索引中存在的标记。

由于索引中不存在ABC\*DEF(仅存在“ABC”和“DEF”),因此您将无法使用您正在搜索的表达式找到它。

使用“关键字”分析器会将整个字段保留为单个标记,因此如果字段“仅”包含表达式 ABC\*DEF,那么正则表达式将对其起作用,但是,如果 ABC\*DEF 是其中的一部分一段较大的文本,那么这可能不是您想要使用的。

最好的办法是创建一个custom analyzer,以保留与您的用例相关的特殊字符的方式标记您的文本。

【讨论】:

  • 感谢您的回答,我创建了一个自定义分析器,现在我有了令牌 ABC*DEF,但是当我使用正则表达式 /(.*)ABC\*DEF(.*)/ 或 /(.*)ABC*DEF(.*)/ 时,它仍然没有返回任何匹配。知道为什么吗?
【解决方案2】:

如果您要搜索特殊字符,为什么不丢弃普通字符?

[^\w]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-02
    • 2023-04-10
    • 2013-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多