如何基于RawFrequencyDicts模型获取指定频次及Top N高频数据
实现指定频次筛选与高频数据获取
现有模型定义
class RawFrequencyDicts(Base): __tablename__ = "raw_frequency_dicts" id = Column(types.UInt64, primary_key=True) item = Column(types.String) lemmatized_text = Column(types.String) lemmatized_text_no_ordered = Column(types.String) frequency = Column(types.Int64) count_words = Column(types.Int64) mark_up = Column(types.Int64) domain_id = Column(types.Int64) language = Column(types.String) run = Column(types.Int64) run_desc = Column(types.String) created_at = Column(types.DateTime) updated_at = Column(types.DateTime) __table_args__ = (engines.MergeTree(),)
需求说明
- 可通过
size参数获取频次排名前N的数据(如size=1000时取前1000条高频数据) - 已实现按指定频次值筛选的基础代码:
query_db = query_db.filter(model.frequency == int(params.frequency))
实现方案
1. 完善指定频次值的筛选逻辑
你已编写的代码可实现固定频次筛选,建议增加参数校验避免类型异常:
# 校验参数合法性,防止非整数输入导致报错 try: target_freq = int(params.frequency) except ValueError: raise ValueError("frequency参数必须为整数类型") query_db = query_db.filter(RawFrequencyDicts.frequency == target_freq)
2. 获取前N高频数据
要获取频次排名前size的数据,需先按frequency倒序排序,再限制返回条数:
# 按频次降序排序后取前size条 query_db = query_db.order_by(RawFrequencyDicts.frequency.desc()).limit(int(params.size))
3. 组合场景:指定频次内取前N条数据
如果指定频次下数据量过大,需要从中取前N条,可结合筛选、排序(可选)和limit:
try: target_freq = int(params.frequency) size = int(params.size) except ValueError: raise ValueError("frequency和size参数必须为整数类型") # 先筛选指定频次,再按更新时间倒序排序,最后取前size条 query_db = query_db.filter(RawFrequencyDicts.frequency == target_freq)\ .order_by(RawFrequencyDicts.updated_at.desc())\ .limit(size)
注意事项
- 基于ClickHouse的MergeTree引擎,建议给
frequency字段添加索引,避免全表扫描影响查询性能 - 若
size参数未指定,可设置默认值(如默认返回前100条) - 分页场景下尽量避免大offset,建议用主键或排序字段做分页标记,提升查询效率
内容的提问来源于stack exchange,提问作者Tarodictrl
相关产品推荐
相关产品推荐

