Elasticsearch:Wildcard关键词查询与N-gram+multi-match方案选型咨询
全文任意子串匹配方案咨询
背景信息
我有如下格式的字段:
- orderId:
ABC-DEF-1234 - date:
2024-02-24 - lastUpdatedTime:
2024-02-24T12:09:48.763-05:00
核心需求
用户在搜索框输入任意内容X,只要文档中指定的任意字段完全包含X,就返回该文档。比如输入DE、02-24、09:48都要命中上述示例文档。
生产环境约束
- 记录数量:10万~50万条
- 需要支持该功能的字段数量:约10个
拟定的两种方案
方案1:Keyword类型索引 + Wildcard Query
- 索引阶段:将目标字段直接按
keyword类型索引 - 查询阶段:对每个字段使用
*X*形式的wildcard query - 疑问:已知前缀加
*会影响性能,在10万-50万条记录、10个字段的场景下,性能影响到底有多大?
方案2:Text类型+N-gram分词器 + Multi-match Query
- 索引阶段:给所有目标字段配置N-gram分词器。我的理解是,当最小长度设为1时,N-gram会把
ABC-DEF-1234拆分成所有相邻子串,比如A、AB、ABC、DEF-1、ABC-DEF-1234等 - 查询阶段:直接用用户输入的内容对所有字段执行multi-match query
- 疑问:这个方案会明显增加索引时间和存储成本,但如果查询性能比方案1提升明显,我可以接受。
咨询问题
目前我倾向方案2,想知道有没有更优或者更平衡性能与成本的方案,同时请指出我对两种方案的假设是否存在错误。
内容的提问来源于stack exchange,提问作者codeedoc
相关产品推荐
相关产品推荐

