.search() now works differently for FTS4 v.s. FTS5

This commit is contained in:
Simon Willison 2020-11-05 10:01:58 -08:00
commit 7c22a64fb6
2 changed files with 43 additions and 42 deletions

View file

@ -1326,7 +1326,8 @@ class Table(Queryable):
assert fts_table, "Full-text search is not configured for table '{}'".format( assert fts_table, "Full-text search is not configured for table '{}'".format(
self.name self.name
) )
return textwrap.dedent( if self.db[fts_table].virtual_table_using == "FTS5":
sql = textwrap.dedent(
""" """
with {original} as ( with {original} as (
select select
@ -1345,7 +1346,21 @@ class Table(Queryable):
order by order by
{order} {order}
{limit} {limit}
""".format( """
).strip()
else:
if order == rank or order is None:
order = "rowid"
sql = textwrap.dedent(
"""
select * from "{dbtable}" where rowid in (
select rowid from [{fts}]
where [{fts}] match :query
)
order by {order}
"""
).strip()
return sql.format(
dbtable=self.name, dbtable=self.name,
original=original, original=original,
columns=columns_sql, columns=columns_sql,
@ -1353,24 +1368,10 @@ class Table(Queryable):
fts=fts_table, fts=fts_table,
order=order or "{} desc".format(rank), order=order or "{} desc".format(rank),
limit="limit {}".format(limit) if limit else "", limit="limit {}".format(limit) if limit else "",
)
).strip() ).strip()
def search(self, q): def search(self, q, order=None):
sql = ( return self.db.execute(self.search_sql(order=order), {"query": q}).fetchall()
textwrap.dedent(
"""
select * from "{table}" where rowid in (
select rowid from [{table}_fts]
where [{table}_fts] match :search
)
order by rowid
"""
)
.strip()
.format(table=self.name)
)
return self.db.execute(sql, (q,)).fetchall()
def value_or_default(self, key, value): def value_or_default(self, key, value):
return self._defaults[key] if value is DEFAULT else value return self._defaults[key] if value is DEFAULT else value

View file

@ -112,7 +112,7 @@ def test_fts_tokenize(fresh_db):
tokenize="porter", tokenize="porter",
) )
assert [("racoons are biting trash pandas", "USA", "bar")] == table.search( assert [("racoons are biting trash pandas", "USA", "bar")] == table.search(
"bite" "bite", order="rowid"
) )