mirror of
https://github.com/simonw/sqlite-utils.git
synced 2026-09-10 10:34:10 +02:00
.search() now works differently for FTS4 v.s. FTS5
This commit is contained in:
parent
de39e8db1e
commit
7c22a64fb6
2 changed files with 43 additions and 42 deletions
|
|
@ -1326,51 +1326,52 @@ 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 (
|
"""
|
||||||
select
|
with {original} as (
|
||||||
rowid,
|
select
|
||||||
{columns}
|
rowid,
|
||||||
from [{dbtable}]
|
{columns}
|
||||||
)
|
from [{dbtable}]
|
||||||
select
|
|
||||||
{original}.*,
|
|
||||||
[{fts}].rank as {rank}
|
|
||||||
from
|
|
||||||
[{original}]
|
|
||||||
join [{fts}] on [{original}].rowid = [{fts}].rowid
|
|
||||||
where
|
|
||||||
[{fts}] match :query
|
|
||||||
order by
|
|
||||||
{order}
|
|
||||||
{limit}
|
|
||||||
""".format(
|
|
||||||
dbtable=self.name,
|
|
||||||
original=original,
|
|
||||||
columns=columns_sql,
|
|
||||||
rank=rank,
|
|
||||||
fts=fts_table,
|
|
||||||
order=order or "{} desc".format(rank),
|
|
||||||
limit="limit {}".format(limit) if limit else "",
|
|
||||||
)
|
)
|
||||||
|
select
|
||||||
|
{original}.*,
|
||||||
|
[{fts}].rank as {rank}
|
||||||
|
from
|
||||||
|
[{original}]
|
||||||
|
join [{fts}] on [{original}].rowid = [{fts}].rowid
|
||||||
|
where
|
||||||
|
[{fts}] match :query
|
||||||
|
order by
|
||||||
|
{order}
|
||||||
|
{limit}
|
||||||
|
"""
|
||||||
|
).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,
|
||||||
|
original=original,
|
||||||
|
columns=columns_sql,
|
||||||
|
rank=rank,
|
||||||
|
fts=fts_table,
|
||||||
|
order=order or "{} desc".format(rank),
|
||||||
|
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
|
||||||
|
|
|
||||||
|
|
@ -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"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue