Sid*_* Go 6 sql sqlite android fts4
假设搜索输入是“是什么”。这将匹配“无论它是什么”以及“什么是”,这是确切的短语。现在,如何在排序中将准确的短语排在第一位?
从昨天开始我就一直在思考这个问题,并且不断提出不同的解决方案,但每个解决方案都有其自身的缺陷。
这是我失败的方法(假设输入=“是什么”):
SELECT snippet(fts), 1 as rank
FROM fts
WHERE body MATCH '"what is"'
UNION ALL
SELECT snippet(fts), 2 as rank
FROM fts
WHERE body MATCH 'what* NEAR/3 is*' -- 3 is arbitrary
ORDER BY rank
Run Code Online (Sandbox Code Playgroud)
这是我当前的解决方案:
SELECT snippet(fts)
FROM fts WHERE rowId IN
(
SELECT DISTINCT rowId
FROM
(
SELECT rowId, 1 as rank
FROM fts
WHERE body MATCH '"what is"'
UNION ALL
SELECT rowId, 2 as rank
FROM fts
WHERE body MATCH 'what* NEAR/3 is*'
ORDER BY rank
)
)
WHERE body MATCH 'what* NEAR/3 is*'
Run Code Online (Sandbox Code Playgroud)
我在这里做的是:
这里的问题是,如您所料,订购完全消失了:(。
编辑:
我在 Android 中使用 FTS4(我不使用增强的查询语法,因为我不确定 Android 是否支持)。
您必须snippet()
对 FTS 表本身进行所有 FTS 处理(包括 ),然后才将结果合并到最上面的查询中:
SELECT docid,
snippet,
MIN(rank) AS rank
FROM (SELECT docid,
snippet(fts) AS snippet,
1 AS rank
FROM fts
WHERE body MATCH '"what is"'
UNION ALL
SELECT docid,
snippet(fts),
2
FROM fts
WHERE body MATCH 'what* NEAR/3 is*')
GROUP BY docid
ORDER BY MIN(rank) /*, docid*/;
Run Code Online (Sandbox Code Playgroud)
或者,使用更通用的模式获取所有可能的行,并检查 ORDER BY 中是否有更严格的 MATCH:
SELECT snippet(fts)
FROM fts
WHERE body MATCH 'what* NEAR/3 is*'
ORDER BY NOT (body MATCH '"what is"');
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1314 次 |
最近记录: |