【问题标题】:Can Peewee use highlight(), which is SQLite's FTS5 (full text search) auxiliary function?Peewee 可以使用 SQLite 的 FTS5(全文搜索)辅助函数 highlight() 吗?
【发布时间】:2021-09-26 09:11:54
【问题描述】:
  1. SQLite 的 FTS5 支持highlight()。该辅助函数返回全文搜索查询结果的标签:参见official documentation

  2. 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)
  3. 尽管 Peewee 已经支持 bm25()rank() 作为现有的 FTS5 辅助功能,但我在 Peewee 的文档中没有找到示例代码或对 highlight() 的引用。

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

【问题讨论】:

    标签: python django sqlite full-text-search peewee


    【解决方案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 的要好得多,这增加了它。
    猜你喜欢
    • 1970-01-01
    • 2019-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多