我是 ElasticSeach 的新手,目前正在使用 AWS OpenSearch 服务的 OpenSearch。在开发工具中,我有以下查询:
GET _search
{
"from": 0,
"size": 10,
"query": {
"bool": {
"must_not": [
{
"regexp": {
"handler_id": "[^_*\\-.;?#$%^@!`,/?+()~<>:'\\[\\]{}]*`"
}
}
],
"must": [
{
"regexp": {
"handler_id": "~([^.])*[A-Za-z]{2}[a-zA-Z0-9]{2}[0-9]{8}"
}
}
]
}
},
"sort": [
{
"handler_id.keyword": {
"order": "asc"
}
}
]
}
上面的查询应该获取所有不带特殊字符的handler_id,并且也满足
must
格式。它有效,但它总是返回这个handler_id = .MP4137879580
。我还尝试了正则表达式 ^[A-Za-z]{2}[a-zA-Z0-9]{2}[0-9]{8}(?![^.]+$)
,然后是 "~([^
。])*[A-Za-z]{2}[a-zA-Z0-9]{2}[0-9]{8}"
来转义点,但 id 仍然出现。
请给我一些关于如何解决此问题的指导。谢谢!
TLDR:
GET _search
{
"from": 0,
"size": 10,
"query": {
"bool": {
"must": [
{
"regexp": {
"handler_id.keyword": "~([^.])*[A-Za-z]{2}[a-zA-Z0-9]{2}[0-9]{8}"
}
},
{
"regexp": {
"handler_id.keyword": "[^_*\\-.;?#$%^@!`,/?+()~<>:'\\[\\]{}].*"
}
}
]
}
},
"sort": [
{
"handler_id.keyword": {
"order": "asc"
}
}
]
}
这是在elasticsearch 上测试的。抱歉,我没有使用 opensearch,也没有计划开始,但它足够简单,所以它应该可以工作。
您的查询有几个问题。
第一个是默认情况下,elasticsearch 对每个记录索引两次 - 一次以分析形式,另一次以非分析形式。分析后的形式存储在
handler_id
中,并且对于您的测试字符串,它会转换为 mp4137879580
(小写字母用空格分隔,并删除标点符号)。在 handler_id.keyword
中,您的原始字符串按原样索引。因此,当您在正则表达式中使用 handler_id
时,您将搜索这些转换后的字符串而不是原始字符串。因此,第一个修复方法是在查询中使用 handler_id.keyword
。
第二个问题是
regexp
末尾包含一个额外的反勾号,这不匹配。只需将其删除即可。
第三个问题是你在这里使用了双重否定。首先,您找到所有不包含标点符号的 handler_ids,然后将其包装到
must_not
中,本质上是在说“我不想要这些”。因此,您需要将正则表达式移至 must
或将正则表达式更改为带有标点符号的 match 处理程序并将其保留在 must_not
中。我在示例中选择了第一个解决方案。