模糊正则表达式Elasticsearch

时间:2015-08-21 14:12:13

标签: python regex elasticsearch fuzzy-search

我试图找到单词之间的匹配,并使用Elasticsearch缩小表单。

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

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

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

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

2 个答案:

答案 0 :(得分:1)

此解决方案与@ 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 以外的其他内容。

答案 1 :(得分:0)

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

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

手动生成会有点麻烦,因为它会涉及一个OR语句,其中术语的数量等于输入中的字母数。但是如果你使用了一个循环,那么为任意输入生成它就不会太糟糕。它的工作方式是它允许4个字符shmp中的任何一个是不同的字符但不超过一个的情况。