gpt4 book ai didi

android - SQLite FTS 中的确切短语首先出现在其他任何内容之前?

转载 作者:行者123 更新时间:2023-11-29 01:19:52 27 4
gpt4 key购买 nike

假设搜索输入是“what is”。这将匹配“whatever it is”和“what is”,这是确切的短语。现在,如何在排序中将确切的短语排在第一位?

从昨天开始我就一直在思考这个问题,我一直在想出不同的解决方案,但每个解决方案都有其自身的缺陷。

这是我失败的方法(假设输入 = '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)。
  • 我不能同时使用 this (我之前的问题)因为 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*'

我在这里做的是:

  1. 在最里面的 SELECT 中,我正在做排序
  2. 在下一个 SELECT 中,我将过滤掉重复项(这会起作用,因为我还没有使用代码段。
  3. 最后,如果 rowId 在第二个选择中,我将选择代码段。

这里的问题是,如您所料,排序完全消失了 :(。

编辑:

我在 Android 中使用 FTS4(我不使用增强的查询语法,因为我不确定 Android 是否支持)。

最佳答案

您必须对 FTS 表本身进行所有 FTS 处理(包括 snippet()),然后才将结果合并到最上面的查询中:

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*/;

或者,使用更通用的模式获取所有可能的行,并检查 ORDER BY 中更严格的 MATCH:

SELECT snippet(fts)
FROM fts
WHERE body MATCH 'what* NEAR/3 is*'
ORDER BY NOT (body MATCH '"what is"');

关于android - SQLite FTS 中的确切短语首先出现在其他任何内容之前?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37516017/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com