如何借助elasticsearch等工具高效提取单文档独有的专属术语?
独有术语提取高效方案
以下分别提供Elasticsearch生态内优化方案和更轻量的替代方案:
Elasticsearch 原生优化方案
你之前用的逐个术语检索的方案瓶颈在单次请求只能处理单个术语,吞吐量极低,用ES原生能力可以把效率提升至少两个数量级:
- 索引预处理:给所有存量文档的文本字段开启
doc_values和term_vector存储,提前构建好术语的全局倒排索引元数据。 - 批量提取+批量统计:
- 对目标文档直接调用ES的
termvectorsAPI,单次请求就能拿到该文档分词后的全量术语列表,无需自行分词处理。 - 把所有术语批量传入
terms聚合查询,设置聚合的min_doc_count参数为1,一次请求就能统计出每个术语在全索引的总出现文档数,直接筛选出总文档数等于1的术语,就是仅出现在当前文档的独有术语。
- 对目标文档直接调用ES的
- 固定存量场景优化:如果存量文档不会再更新,可以提前跑一次全索引的
terms聚合,导出所有术语的出现文档数存为独立的KV词典,后续新文档处理直接本地查KV即可,完全不需要再请求ES,响应速度可以到毫秒级。
非ES轻量替代方案
如果不需要依赖已有ES集群,还有更简单的高效方案:
- 固定存量场景:把所有存量文档的术语去重后生成一个全局术语集合,新文档分词后得到的术语集合直接和全局集合求差集,得到的结果就是独有术语,时间复杂度仅和新文档的术语数量成正比,是目前已知的最快方案。
- 动态存量场景:可以用FST(有限状态转换器)或者布隆过滤器存储全局术语:
- FST是Lucene底层用的词典存储结构,内存占用极低,查询速度快,无误差,适合对准确性要求100%的场景。
- 布隆过滤器内存占用比FST还要小一个数量级,查询速度相同,只有百万级以下的误判率,适合允许极小误差的大规模数据场景。
内容的提问来源于stack exchange,提问作者Michael Balber
相关产品推荐
相关产品推荐

