在ElasticSearch/OpenSearch上避免点

pu82cl6c  于 5个月前  发布在  ElasticSearch
关注(0)|答案(1)|浏览(61)

我是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仍然显示出来。
请给予给我一些如何解决这个问题的指示。谢谢!

rslzwgfq

rslzwgfq1#

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中,原始字符串按原样索引。因此,当你在regexp中使用handler_id时,你搜索的是这些转换后的字符串而不是原始字符串。所以,第一个修复方法是在你的查询中使用handler_id.keyword
第二个问题是regexp在末尾包含一个额外的反勾号,这是不匹配的。只需删除它。
第三个问题是你在这里使用了双重否定。首先你找到了所有不包含标点符号的handler_id,然后你把它 Package 到must_not中,实际上是说“我不想要这些”。所以你需要把你的正则表达式移动到must中,或者把你的正则表达式改为match。处理器,并将其保存在must_not中。我在示例中选择了第一个解决方案。

相关问题