模糊正则表达式弹性搜索

2024-10-03 04:37:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试找到单词之间的匹配,并使用Elasticsearch进行简化。在

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

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

有没有一种方法可以同时进行模糊搜索(例如max_expansions 1),使s.*h.*?n.*?p.*?匹配?在

然而,我不确定这是最好的方法,也许有一些工作我没有想到。在


Tags: 方法nameeselasticsearchquery单词dslmax
2条回答

(..*?h.*?m.*?p.*?|s.*?..*?m.*?p.*?|s.*?h.*?..*?p.*?|s.*?h.*?m.*?..*?)

https://regex101.com/r/qV9cW6/1

手工生成有点麻烦,因为它将涉及一个OR语句,其项数等于输入中的字母数。但是,如果使用循环,为任意输入生成循环也不会太糟糕。它的工作方式是允许4个字符中的任何一个shmp是不同的字符,但不能超过一个。在

这个解决方案与@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之外的内容。在

相关问题 更多 >