SQLITE 执行反向全文搜索
SQLITE Perform Reverse full text search
假设我们有两个 table,一个名为 tags
,一个名为 texts
,如下所示:
tags
table:
id
name
1
T1
2
T2
3
T3
4
T4
Texts
table:
id
text
1
Text includes T2
2
Text includes T4
3
Text
4
Text includes T2
我想搜索每个 Text
并将 Tags
table 中的标签附加到每个文本。输出将是这样的:
tagId
textId
2
1
2
4
4
3
I 就像遍历每个文本,然后遍历每个标签并使用 Like
语句检查该文本是否包含该标签。然而,这是不切实际的。另一种方法是使用 FTS
但我不太确定如何编写它的查询,因为例如这个查询只给我具有这些标签的文本
select *
from texts_fts
WHERE texts_fts MATCH ( select group_concat(tag, ' OR ')
from keywords
group by 'x' )
是否有任何其他方法可以让它发挥作用?
谢谢
您可以在 ON
子句中使用联接和运算符 LIKE
来实现:
SELECT tg.id tagId, tx.id textId
FROM tags tg INNER JOIN texts tx
ON tx.text LIKE '%' || tg.name || '%'
或 INSTR()
:
SELECT tg.id tagId, tx.id textId
FROM tags tg INNER JOIN texts tx
ON INSTR(tx.text, tg.name)
参见demo。
假设我们有两个 table,一个名为 tags
,一个名为 texts
,如下所示:
tags
table:
id | name |
---|---|
1 | T1 |
2 | T2 |
3 | T3 |
4 | T4 |
Texts
table:
id | text |
---|---|
1 | Text includes T2 |
2 | Text includes T4 |
3 | Text |
4 | Text includes T2 |
我想搜索每个 Text
并将 Tags
table 中的标签附加到每个文本。输出将是这样的:
tagId | textId |
---|---|
2 | 1 |
2 | 4 |
4 | 3 |
I 就像遍历每个文本,然后遍历每个标签并使用 Like
语句检查该文本是否包含该标签。然而,这是不切实际的。另一种方法是使用 FTS
但我不太确定如何编写它的查询,因为例如这个查询只给我具有这些标签的文本
select *
from texts_fts
WHERE texts_fts MATCH ( select group_concat(tag, ' OR ')
from keywords
group by 'x' )
是否有任何其他方法可以让它发挥作用? 谢谢
您可以在 ON
子句中使用联接和运算符 LIKE
来实现:
SELECT tg.id tagId, tx.id textId
FROM tags tg INNER JOIN texts tx
ON tx.text LIKE '%' || tg.name || '%'
或 INSTR()
:
SELECT tg.id tagId, tx.id textId
FROM tags tg INNER JOIN texts tx
ON INSTR(tx.text, tg.name)
参见demo。