避免在 ElasticSearch/OpenSearch 上使用点

问题描述 投票:0回答:1

我是 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 仍然出现。

请给我一些关于如何解决此问题的指导。谢谢!

elasticsearch regex-lookarounds amazon-opensearch
1个回答
0
投票

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
中。我在示例中选择了第一个解决方案。

© www.soinside.com 2019 - 2024. All rights reserved.