Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 模糊正则弹性搜索_Python_Regex_<img Src="//i.stack.imgur.com/RUiNP.png" Height="16" Width="18" Alt="" Class="sponsor Tag Img">elasticsearch_Fuzzy Search - Fatal编程技术网 elasticsearch,fuzzy-search,Python,Regex,elasticsearch,Fuzzy Search" /> elasticsearch,fuzzy-search,Python,Regex,elasticsearch,Fuzzy Search" />

Python 模糊正则弹性搜索

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

我正在尝试使用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.*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(仅正则表达式),所以我不确定。