Python 模糊正则弹性搜索
我正在尝试使用Elasticsearch查找单词和简化形式之间的匹配 假设我有输入单词Python 模糊正则弹性搜索,python,regex,
elasticsearch,fuzzy-search,Python,Regex,
elasticsearch,Fuzzy Search,我正在尝试使用Elasticsearch查找单词和简化形式之间的匹配 假设我有输入单词shmp(在ES中索引为shamp),我生成以下正则表达式s.*h.*m.*p.,并执行以下查询DSL: { "query": { "regexp": { "name": "s.*?h.*?m.*?p.*?" } } } 是否有一种方法可以同时进行模糊搜索(例如max_展开1),以便s.*h.*n.*p.*匹配 但是我不确定这是最好的方法,也许有一些工作我没有想到。(…*?h.*m.*p.*s
shmp
(在ES中索引为shamp
),我生成以下正则表达式s.*h.*m.*p.
,并执行以下查询DSL:
{
"query": {
"regexp": { "name": "s.*?h.*?m.*?p.*?" }
}
}
是否有一种方法可以同时进行模糊搜索(例如max_展开1),以便s.*h.*n.*p.*
匹配
但是我不确定这是最好的方法,也许有一些工作我没有想到。(…*?h.*m.*p.*s.*m.*p.*s.*h.*p.*s.*h.*p.*s.*h.*h.*m.*m.*
手工生成有点混乱,因为它将涉及一个术语数量等于输入中字母数量的OR语句。但是,如果您使用循环,那么为任意输入生成循环也不会太糟糕。它的工作方式是允许4个字符shmp
中的任何一个是不同的字符,但不超过一个 此解决方案与@ezig的答案不同。对此有不同的看法:p
^(.*?([^s](?=.*?h.*?m.*?p)|s).*?([^h](?=.*?m.*?p)|h).*?([^m](?=.*?p)|m).*?.)
这个正则表达式的基本工作方式是每个字母都有一个节。对于这个解释,我们将使用s
,因为它是第一个
S:([^S](?=.*h.*m.*p)S)
这表示“允许您在此处不匹配s
,前提是字符串的其余部分将正确匹配,否则我们需要在此处匹配s
”
要了解为什么这个正则表达式比@ezig的答案增长得慢,我们知道第一个字符将遵循模糊匹配的规则,我们不必对其他字符太聪明
H:([^H](?=.*m.*p)| H)
该部分被缩短,因为我们知道如果s
不匹配,我们根本不会匹配字符串,但因为我们在这里检查h
,可能会有所不同,我们知道它以前必须匹配s
。这表示“如果字符串的其余部分正确匹配,那么我们可以匹配除h
”之外的其他内容。”那么s.*h.[mn].*p.*?
?实际上,可能发散的字母是未知的。否则就太容易了;)因此,在这种情况下,您可以使用字符范围s.*h.[a-z].*p.
或其他正则表达式,例如,您也可以使用\w
匹配所有单词字符。m
成为n
就是一个例子。我的意思是s
或h
可能是错误的字母,如fhmp
或sump
。(即使我知道有很多其他单词可以匹配)正则表达式是模糊搜索部分的唯一方法吗?(仅使用正则表达式查看,不使用内置ES功能)。假设我想在一个8个字母的单词上进行4的max_扩展,正则表达式将相当大。使用ES功能可能有更好的方法来实现它——我不熟悉Elasticsearch(仅正则表达式),所以我不确定。