SQLite FTS查询:如何仅返回包含匹配关键词的单行文本
SQLite提取FTS匹配结果中的目标行
你的FTS查询能返回包含关键词的整个body内容,但body里可能有多段文本,你需要的是仅提取包含匹配关键词的那一段。
用递归CTE拆分筛选
SQLite没有现成的按行拆分字符串的工具,但可以用递归公共表表达式(CTE)实现。假设段落是用换行符\n分隔的,直接用下面的查询:
WITH split_lines AS ( -- 先拆分第一行 SELECT SUBSTR(body, 1, INSTR(body || '\n', '\n') - 1) AS line, SUBSTR(body, INSTR(body || '\n', '\n') + 1) AS remaining FROM my_table WHERE body MATCH 'adipiscing' UNION ALL -- 递归拆分剩下的行 SELECT SUBSTR(remaining, 1, INSTR(remaining || '\n', '\n') - 1) AS line, SUBSTR(remaining, INSTR(remaining || '\n', '\n') + 1) AS remaining FROM split_lines WHERE remaining != '' ) SELECT line FROM split_lines WHERE line MATCH 'adipiscing';
这个逻辑是先把每个匹配到的body拆成单独的行,再从中筛选出包含关键词的行。如果你的段落分隔符是\r\n(Windows换行),把所有'\n'换成'\r\n'就行。如果同一个body有多段匹配,这个查询会返回所有匹配段,不需要的话加个LIMIT 1即可。
自定义函数(可选)
如果你的环境允许扩展SQLite,可以自己写个函数来提取目标行。比如用Python扩展的话,函数逻辑就是把body按换行拆成列表,遍历找包含关键词的行返回。这种方法更灵活,但需要依赖外部扩展支持。
内容的提问来源于stack exchange,提问作者425nesp
相关产品推荐
相关产品推荐

