Elasticsearch中基于给定文件名检索相似文件名的实现方案
Elasticsearch 按同命名规则匹配文件名的解决方案
你当前的查询结果不符合预期,核心是普通match查询依赖的分词逻辑无法保证文件名的整体结构匹配:标准分词器会将文件名按下划线、点等符号拆分为独立词项,只要命中任意词项就会返回结果,导致大量无关文件被召回;如果改用精确匹配则只能返回完全相同的文件名。该需求完全可以通过ES实现,只需要调整映射配置和查询逻辑即可。
1. 调整索引映射
首先给filename字段新增keyword类型子字段用于前缀精确匹配,同时完善反向分词器配置用于高效后缀匹配:
{ "settings": { "analysis": { "analyzer": { "filename_reverse": { "tokenizer": "keyword", "filter": ["reverse"] } } } }, "mappings": { "properties": { "filename": { "type": "text", "fields": { "keyword": { "type": "keyword", "ignore_above": 256 }, "reverse": { "type": "text", "analyzer": "filename_reverse", "fielddata": false } } } } } }
2. 预处理输入文件名
在业务层对输入的目标文件名做结构拆分,提取固定前缀和固定后缀:
- 示例输入
invoice_1234.pdf:- 固定前缀:
invoice_(最后一个可变内容前的固定串,可根据业务规则调整拆分逻辑) - 固定后缀:
.pdf(文件扩展名固定部分) - 反向后缀:
fdp.(将后缀反转,用于匹配reverse字段)
- 固定前缀:
3. 构造查询语句
使用bool过滤器同时匹配前缀和后缀,保证命名规则一致:
GET /documents/_search { "query": { "bool": { "filter": [ // 精确匹配前缀 { "prefix": { "filename.keyword": "invoice_" } }, // 用反向字段匹配后缀,性能远高于后缀通配符查询 { "match": { "filename.reverse": { "query": "fdp.", "analyzer": "keyword" } } }, // 可选:增加长度校验,避免匹配到invoice_123456.pdf这类长度不符的文件 { "script": { "script": "doc['filename.keyword'].value.length() == params.expected_len", "params": { "expected_len": 16 } } } ] } } }
扩展说明
如果你的文件名规则更灵活(不固定前缀后缀长度),可以使用ES 7.9+提供的wildcard字段类型替换keyword子字段,直接用通配符查询invoice_*.pdf,查询性能远高于普通keyword的通配符查询。
内容的提问来源于stack exchange,提问作者Barry Baronas
相关产品推荐
相关产品推荐

