提问者:小点点

OpenSearch查询不匹配


我正在尝试创建一个基于作为密钥一部分的文件扩展名匹配的查询。

我知道OpenSearch中存在以下记录:

{
  '_index': 'the_index',
  '_type': 'some_type',
  '_id': 'id',
  '_score': 1,
  '_routing': 'routing',
  '_parent': 'parent',
  '_source': {
    'files': [
      {
        'bucket': 'a_bucket',
        'fileName': 'a_file_name.dat.gz',
        'size': 9001,
        'source': 's3://a_bucket/some_path/a_file_name.dat.gz',
        'key': 'some_path/a_file_name.dat.gz'
      },
      {
        'bucket': 'b_bucket',
        'fileName': 'a_file_name.dat.gz.ext.json',
        'size': 9001,
        'source': 's3://b_bucket/some_path/a_file_name.dat.gz.ext.json',
        'type': 'metadata',
        'key': 'some_path/a_file_name.dat.gz.ext.json'
      }
    ],
    'collectionId': 'collectionId',
    'status': 'completed',
    'timestamp': 1,
    'updatedAt': 1
  }
}

我可以搜索file. key:

{
  "query": {
    "bool": {
      "should": [
        {
          "match_phrase": {
            "files.key": {
              "query": "some_path/a_file_name.dat.gz.ext.json"
            }
          }
        }
      ]
    }
  }
}

它工作正常。如果我从前面删除任何字符,它不再返回结果。所以我尝试了正则表达式查询:

{
  "query": {
    "regexp": {
      "files.key": ".*.ext.json"
    }
  }
}

也不返回任何结果。

我在这里错过了什么?一些file. key值将以s3://bucket ketname开头,一些将以ext.json结尾,我需要找到所有这些记录。


共1个答案

匿名用户

regexp通配符查询在标记级别工作,因此您必须将路径存储为关键字才能工作。但是,由于ES处理通配符查询的方式,它可能仍然无法返回所有结果(因此查询扩展不会涵盖所有值)。

这里最正确的方法是使用路径标记器(甚至是其中的两个-按/从左到右和.从右到左分割)。虽然它可能会变得相当复杂,但您可以尝试使用带有2个filter子句的bool查询来获得一些好的结果:一个match_phrase作为前缀,另一个作为后缀。