我试图找到单词之间的匹配,并使用Elasticsearch缩小表单。
假设我输入了单词shmp
(在ES中索引为shampoo
),我生成以下正则表达式s.*?h.*?m.*?p.*?
并执行以下查询DSL:
{
"query": {
"regexp": { "name": "s.*?h.*?m.*?p.*?" }
}
}
有没有办法在同一时间(例如max_expansions 1)进行模糊搜索,以便s.*h.*?n.*?p.*?
匹配?
但是我不确定这是最好的方法,也许有一些我没想到的工作。
答案 0 :(得分:1)
此解决方案与@ 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
以外的其他内容。
答案 1 :(得分:0)
(..*?h.*?m.*?p.*?|s.*?..*?m.*?p.*?|s.*?h.*?..*?p.*?|s.*?h.*?m.*?..*?)
https://regex101.com/r/qV9cW6/1
手动生成会有点麻烦,因为它会涉及一个OR语句,其中术语的数量等于输入中的字母数。但是如果你使用了一个循环,那么为任意输入生成它就不会太糟糕。它的工作方式是它允许4个字符shmp
中的任何一个是不同的字符但不超过一个的情况。