我正在尝试创建一个基于作为密钥一部分的文件扩展名匹配的查询。
我知道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结尾,我需要找到所有这些记录。
regexp
和通配符
查询在标记级别工作,因此您必须将路径存储为关键字
才能工作。但是,由于ES处理通配符查询的方式,它可能仍然无法返回所有结果(因此查询扩展不会涵盖所有值)。
这里最正确的方法是使用路径标记器(甚至是其中的两个-按/
从左到右和.
从右到左分割)。虽然它可能会变得相当复杂,但您可以尝试使用带有2个filter
子句的bool
查询来获得一些好的结果:一个match_phrase
作为前缀,另一个作为后缀。