Peewee 可以使用 SQLite 的 FTS5(全文搜索)辅助函数 highlight() 吗?

Posted

技术标签:

【中文标题】Peewee 可以使用 SQLite 的 FTS5(全文搜索)辅助函数 highlight() 吗?【英文标题】:Can Peewee use highlight(), which is SQLite's FTS5 (full text search) auxiliary function? 【发布时间】:2021-09-26 09:11:54 【问题描述】:

    SQLite 的 FTS5 支持highlight()。该辅助函数返回全文搜索查询结果的标签:参见official documentation。

    Peewee 的 code on Github, in the <sqlite_ext.py> module 也提到了 highlight(),虽然只是顺便提及。

    内置辅助功能:

    bm25(tbl[, weight_0, ... weight_n]) highlight(tbl, col_idx, prefix, suffix) sn-p(tbl, col_idx, prefix, suffix, ?, max_tokens)

    尽管 Peewee 已经支持 bm25()rank() 作为现有的 FTS5 辅助功能,但我在 Peewee 的文档中没有找到示例代码或对 highlight() 的引用。

    除非我遗漏了什么,否则如何在我的 Python 代码中将 FTS5 highlight() 与 Peewee 一起使用? (如果这很重要,我正在使用 Django。)

【问题讨论】:

【参考方案1】:

是的,只需在全文搜索查询中选择 fn.highlight(...)

class Post(FTS5Model):
    title = SearchField()
    content = SearchField()
    class Meta:
        database = db

db.create_tables([Post])

Post.create(title='alpha', content='this is post alpha')
Post.create(title='beta', content='this is post beta')
Post.create(title='delta', content='this is post delta')

query = (Post
         .select(fn.highlight(Post._meta.entity, 1, '[', ']').alias('hi'))
         .where(Post.match('post')))
print(query.sql())
for row in query:
    print(row.hi)

请注意,我们必须使用Post._meta.entity 作为第一个参数,以避免使用表的别名 - Sqlite 特别是明确使用 FTS 表名。

打印:

this is [post] alpha
this is [post] beta
this is [post] delta

【讨论】:

谢谢!不幸的是,fn.highlight() 在声明中的位置对我来说并不是很明显。即它是否在.where() 子句中,或者您是否将其包裹在搜索短语/查询中?您能否编辑您的答案以提供示例? 完成,没问题。 非常感谢!感谢您的辛勤工作,Peewee 是一个了不起的 ORM。 此提交将 highlight() 方法添加到 SearchField。感谢您对 peewee 的关注:github.com/coleifer/peewee/commit/… 谢谢! Peewee 的 SQLite 支持/实现目前比 Django 的要好得多,这增加了它。

以上是关于Peewee 可以使用 SQLite 的 FTS5(全文搜索)辅助函数 highlight() 吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用带有 Python 3.7 的 sqlite3 python 模块的 FTS5 扩展?

FTS5与DIY

FTS5与DIY

在 sqlite fts5 查询中使用 Match 但需要更多地控制排名?

C# SQLite FTS5 表和触发器创建

Sqlite FTS5:使用 Trigram Tokenizer 进行子字符串匹配