Redis Search无法通过mid文本字段查询MAC地址问题求助
问题根源分析
你的问题出在Redisearch对TEXT类型字段的分词处理上:
- Redisearch默认使用
english分词器,会将包含点(.)、冒号(:)的MAC地址拆分为多个独立的小token(例如00.00.5e.00.53.af会被拆成00、5e、53、af)。 - 当你执行
@mid:00.00.5e.00.53.af查询时,查询语句也会被同样分词,变成匹配包含所有这些小token的文档,而非精确匹配整个MAC地址。 - 仅
ff.ff.ff.ff.ff.ff能被查到是巧合:分词后所有token都是ff,查询语句分词后也是多个ff,刚好匹配到该文档,但这不是正确的精确匹配逻辑。
解决方案
针对MAC地址这种需要精确匹配的唯一标识,推荐两种修复方式:
方案1:改用TAG类型(推荐)
TAG类型专为精确匹配的标识类数据设计,不会对内容分词。修改索引创建代码:
await client.ft.create( 'idx:cits', { mid: { type: SchemaFieldTypes.TAG, separator: '.' // 如果你用冒号分隔MAC,就改为':';单个MAC无需分割时可省略 }, timestamp: { type: SchemaFieldTypes.NUMERIC, sortable: true }, position: { type: SchemaFieldTypes.GEO } }, { ON: 'HASH', PREFIX: 'CITS' } )
查询时需用{}包裹MAC值(TAG类型的标准查询语法):
const results = await client.ft.search('idx:cits', '@mid:{00.00.5e.00.53.af}')
方案2:保留TEXT类型,使用不分词的分词器
如果必须使用TEXT类型,可指定KEYWORD分词器,将整个MAC地址当作单个token处理:
await client.ft.create( 'idx:cits', { mid: { type: SchemaFieldTypes.TEXT, analyzer: 'KEYWORD' // 强制不分词,保留完整字符串作为单个token }, timestamp: { type: SchemaFieldTypes.NUMERIC, sortable: true }, position: { type: SchemaFieldTypes.GEO } }, { ON: 'HASH', PREFIX: 'CITS' } )
此时原查询语句@mid:00.00.5e.00.53.af即可正常精确匹配。
注意事项
- 修改索引结构前,需先删除旧索引:执行
await client.ft.dropIndex('idx:cits') - 重新创建索引后,需要重新插入数据,旧数据不会自动被新索引收录
内容的提问来源于stack exchange,提问作者Javari
相关产品推荐
相关产品推荐

