python建立数据库并搜索_如何使用SQLAlchemy在SQLite上创建全文搜索索引并进行查询?...

FTS5提供支持全文搜索的虚拟表。换句话说,您不能在现有表中的列上创建全文索引。相反,您可以创建一个FTS5虚拟表,并将原始表中的相关数据复制到索引中。为了避免将相同的数据存储两次,您可以将其设为external content table,但您仍必须确保FTS5表保持同步,可以手动或使用触发器。在

您可以创建一个通用的自定义DDL构造来处理创建一个映射另一个表的FTS5虚拟表:class CreateFtsTable(DDLElement):

"""Represents a CREATE VIRTUAL TABLE ... USING fts5 statement, for indexing

a given table.

"""

def __init__(self, table, version=5):

self.table = table

self.version = version

@compiles(CreateFtsTable)

def compile_create_fts_table(element, compiler, **kw):

"""

"""

tbl = element.table

version = element.version

preparer = compiler.preparer

sql_compiler = compiler.sql_compiler

tbl_name = preparer.format_table(tbl)

vtbl_name = preparer.quote(tbl.name + "_idx")

text = "\nCREATE VIRTUAL TABLE "

text += vtbl_name + " "

text += "USING fts" + str(version) + "("

separator = "\n"

pk_column, = tbl.primary_key

columns = [col for col in tbl.columns if col is not pk_column]

for column in columns:

text += separator

separator = ", \n"

text += "\t" + preparer.format_column(column)

if not isinstance(column.type, String):

text += " UNINDEXED"

text += separator

text += "\tcontent=" + sql_compiler.render_literal_value(

tbl.name, String())

text += separator

text += "\tcontent_rowid=" + sql_compiler.render_literal_value(

pk_column.name, String())

text += "\n)\n\n"

return text

给定的实现有点幼稚,默认情况下索引所有文本列。创建的虚拟表通过在原始表名后添加_idx来隐式命名。在

如果您只想在表中自动添加一个DDL结构,那么只需在表中添加一个DDL结构就足够了,但是如果您只想在表中添加一个DDL结构,那么只需添加一个DDL就可以了:

^{pr2}$

如果person表包含现有数据,请记住将这些数据插入到创建的虚拟表中,以便编制索引。在

为了实际使用创建的虚拟表,您可以为Person创建一个non-primary mapper:person_idx = db.Table('person_idx', db.metadata,

db.Column('rowid', db.Integer(), primary_key=True),

db.Column('name', db.Text()),

db.Column('thumb', db.Text()))

PersonIdx = db.mapper(

Person, person_idx, non_primary=True,

properties={

'id': person_idx.c.rowid

}

)

以及使用例如MATCH进行全文查询:db.session.query(PersonIdx).\

filter(PersonIdx.c.name.op("MATCH")("john")).\

all()

注意,结果是Person对象的列表。PersonIdx只是一个^{}。在

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值