Skip to main content
 首页 » 编程设计

python之模糊正则表达式 Elasticsearch

2025年05月04日24落叶无声

我正在尝试使用 Elasticsearch 查找单词和简化形式之间的匹配项。

假设我有输入词 shmp(在 ES 中索引为 shampoo),我生成以下正则表达式 s.*?h.*?m .*?p.*? 并执行以下查询 DSL:

{ 
  "query": { 
    "regexp": { "name": "s.*?h.*?m.*?p.*?" } 
  } 
} 

有没有办法同时进行模糊搜索(例如 max_expansions 1)以便 s.*h.*?n.*?p.*? 匹配?

但是我不确定这是最好的方法,也许有一些我没有想到的解决方法。

请您参考如下方法:

此解决方案与@ezig 的答案不同。不同的看法:p

^(.*?([^s](?=.*?h.*?m.*?p)|s).*?([^h](?=.*?m.*?p)|h).*?([^m](?=.*?p)|m).*?.) 

Regex101

这个正则表达式的基本工作方式是每个字母都有一个部分。对于这个解释,我们将使用 s,因为它是第一个。

S: ([^s](?=.*?h.*?m.*?p)|s)

这表示 “假设字符串的其余部分将正确匹配,您可以不匹配此处的 s,否则我们需要匹配 s这里”

要了解为什么这个正则表达式比@ezig 的答案增长得更慢,我们知道第一个字符将遵循模糊匹配的规则,我们不必对其他字符太聪明。

H: ([^h](?=.*?m.*?p)|h)

该部分被缩短了,因为我们知道如果 s 不匹配,我们根本不会匹配该字符串,但是因为我们在这里检查 h 并且它可能会有所不同,我们知道它之前必须匹配 s。这表示 “如果字符串的其余部分匹配正确,那么我们可以匹配 h 以外的内容”。