假设搜索输入是“什么是”。这将匹配“whatever it is”以及“what is”,这是确切的短语。现在,我如何在排序中首先制作确切的短语?
从昨天开始我就一直在考虑这个问题,我一直在想出不同的解决方案,但每个解决方案都有自己的缺陷。
不过,这是我失败的方法(假设 input = 'what is'):
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
- 这个问题是两个 SELECT 不是互斥的,所以会有重复。
- 我不能使用 UNION,因为它们在等级列和片段函数上有所不同(首先将具有 START|what is|END,其他将具有 START|what|ENDSTART|is|END)。
- 我也不能使用这个(我之前的问题),因为 MATCH 在 ORDER BY 子句中不起作用(因为结果表/选择不是原始 FTS 表)。
这是我目前的解决方案:
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*'
我在这里做的是:
- 在最里面的 SELECT 中,我正在做排序
- 在下一个 SELECT 中,我将过滤掉重复项(这会起作用,因为我还没有使用片段。
- 最后,如果 rowId 在第二个选择中,我将选择该片段。
正如您所料,这里的问题是订购完全消失了:(。
编辑:
我在 Android 中使用 FTS4(我不使用增强的查询语法,因为我不确定 Android 是否支持)。