乐闻世界logo
搜索文章和话题

如何在elasticsearch中对_id进行通配符或正则表达式匹配?

3 个月前提问
2 个月前修改
浏览次数39

2个答案

1
2

在Elasticsearch中,您可能已经知道,_id 字段是文档的唯一标识符。默认情况下,Elasticsearch并不支持在 _id 字段上使用通配符或正则表达式直接进行搜索。这是因为 _id 字段被设计为用来精确匹配,以便快速定位和检索文档。

然而,如果您确实需要对 _id 进行模式匹配,有两种可能的方法可以实现:

方法1: 使用脚本查询

您可以使用Elasticsearch的脚本查询功能来实现这一点。通过使用Painless脚本语言,可以在查询时编写一个小脚本来匹配 _id。这种方法的缺点是性能不佳,因为它需要遍历所有文档并在查询时运行脚本。

示例查询:

json
GET /your_index/_search { "query": { "bool": { "filter": { "script": { "script": { "source": "doc['_id'].value.matches('your_regex_here')", "lang": "painless" } } } } } }

请将 'your_regex_here' 替换成适当的正则表达式。

方法2: 复制 _id 到另一个字段

由于直接在 _id 上使用通配符或正则表达式性能较差,另一个更高效的策略是在索引文档时,将 _id 的值复制到另一个可搜索的字段。这样,您就可以在这个新字段上使用标准的查询语法,包括通配符和正则表达式搜索。

索引设置示例:

json
PUT /your_index { "mappings": { "properties": { "searchable_id": { "type": "keyword", "copy_to": "searchable_id" } } } }

搜索查询示例:

json
GET /your_index/_search { "query": { "regexp": { "searchable_id": ".*pattern.*" } } }

在这里,首先确保在索引文档时,将 _id 的值复制到 searchable_id 字段。随后,您可以使用 regexp 查询在 searchable_id 上运行正则表达式匹配。

总结

虽然Elasticsearch本身不支持在 _id 字段上直接使用通配符和正则表达式查询,但通过上述方法,您可以实现相似的功能。推荐的做法是复制 _id 到一个新的可查询字段,因为这样做在性能上更优。

2024年6月29日 12:07 回复

在Elasticsearch中,您可能已经知道,_id 字段是文档的唯一标识符。默认情况下,Elasticsearch并不支持在 _id 字段上使用通配符或正则表达式直接进行搜索。这是因为 _id 字段被设计为用来精确匹配,以便快速定位和检索文档。

然而,如果您确实需要对 _id 进行模式匹配,有两种可能的方法可以实现:

方法1: 使用脚本查询

您可以使用Elasticsearch的脚本查询功能来实现这一点。通过使用Painless脚本语言,可以在查询时编写一个小脚本来匹配 _id。这种方法的缺点是性能不佳,因为它需要遍历所有文档并在查询时运行脚本。

示例查询:

json
GET /your_index/_search { "query": { "bool": { "filter": { "script": { "script": { "source": "doc['_id'].value.matches('your_regex_here')", "lang": "painless" } } } } } }

请将 'your_regex_here' 替换成适当的正则表达式。

方法2: 复制 _id 到另一个字段

由于直接在 _id 上使用通配符或正则表达式性能较差,另一个更高效的策略是在索引文档时,将 _id 的值复制到另一个可搜索的字段。这样,您就可以在这个新字段上使用标准的查询语法,包括通配符和正则表达式搜索。

索引设置示例:

json
PUT /your_index { "mappings": { "properties": { "searchable_id": { "type": "keyword", "copy_to": "searchable_id" } } } }

搜索查询示例:

json
GET /your_index/_search { "query": { "regexp": { "searchable_id": ".*pattern.*" } } }

在这里,首先确保在索引文档时,将 _id 的值复制到 searchable_id 字段。随后,您可以使用 regexp 查询在 searchable_id 上运行正则表达式匹配。

总结

虽然Elasticsearch本身不支持在 _id 字段上直接使用通配符和正则表达式查询,但通过上述方法,您可以实现相似的功能。推荐的做法是复制 _id 到一个新的可查询字段,因为这样做在性能上更优。

2024年6月29日 12:07 回复

你的答案