我正在尝试使用 Elasticsearch 查找单词和简化形式之间的匹配项。
假设我有输入词 shmp(在 ES 中索引为 shampoo),我生成以下正则表达式 s.*?h.*?m .*?p.*? 并执行以下查询 DSL:
{
"query": {
"regexp": { "name": "s.*?h.*?m.*?p.*?" }
}
}
有没有办法同时进行模糊搜索(例如 max_expansions 1)以便 s.*h.*?n.*?p.*? 匹配?
但是我不确定这是最好的方法,也许有一些我没有想到的解决方法。
请您参考如下方法:
此解决方案与@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 以外的内容”。
