我是ElasticSeach的新手,目前正在使用AWS OpenSearch服务中的OpenSearch。在Dev Tools中,我有以下查询:
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
。我还尝试了regex ^[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仍然显示出来。
请给予给我一些如何解决这个问题的指示。谢谢!
1条答案
按热度按时间rslzwgfq1#
TLDR:
字符串
这是在elasticsearch上测试的。对不起,我没有使用opensearch,也没有计划开始,但它足够简单,所以应该可以工作。
您的查询中有几个问题。
第一个是,默认情况下,elasticsearch对每个记录索引两次-一次在分析的表单中,另一次在非分析的表单中。分析的表单存储在
handler_id
中,对于测试字符串,它被转换为mp4137879580
(在handler_id.keyword
中,原始字符串按原样索引。因此,当你在regexp中使用handler_id
时,你搜索的是这些转换后的字符串而不是原始字符串。所以,第一个修复方法是在你的查询中使用handler_id.keyword
。第二个问题是
regexp
在末尾包含一个额外的反勾号,这是不匹配的。只需删除它。第三个问题是你在这里使用了双重否定。首先你找到了所有不包含标点符号的handler_id,然后你把它 Package 到
must_not
中,实际上是说“我不想要这些”。所以你需要把你的正则表达式移动到must
中,或者把你的正则表达式改为match。处理器,并将其保存在must_not
中。我在示例中选择了第一个解决方案。