【问题标题】:SQL Contains table and keword position in stringSQL 包含字符串中的表和关键字位置
【发布时间】:2011-08-22 07:44:00
【问题描述】:

对全文搜索有疑问。

我有一个有效的查询,但我想改进它。例如,假设我正在寻找“最佳解决方案”。在我的结果中(使用 FTS、CONTAINSTABLE、NEAR、ISABOUT、*)我有列 rank、id、string

排名|编号 |细绳
----+----+-----
430 | 33 |我自己的最佳解决方案
430 | 32 |最佳解决方案的方法
430 | 30 |最佳解决方案样本
430 | 31 |最佳解决方案
430 | 34 |最佳解决方案创建方式
300 | 40 |有用的最佳软件解决方案
300 | 41 |最佳软件解决方案
200 | 50 |世界最佳解决方案
200 | 51 |世界最佳解决方案

所以这个查询对我来说是 100% 正确的,所有 RANKs 都是正确的,但我想让这个查询更相关。

如果关键字在字符串中的位置更靠左,则它应该出现在结果中的较早位置。例如:

排名|编号 |细绳
----+----+-----
430 | 31 |最佳解决方案
430 | 34 |最佳解决方案创建方式
430 | 30 |最佳解决方案样本
430 | 33 |我自己的最佳解决方案
430 | 32 |最佳解决方案的方法
300 | 41 |最佳软件解决方案
300 | 40 |有用的最佳软件解决方案
200 | 51 |世界最佳解决方案
200 | 50 |世界最佳解决方案

这可能吗?如果是这样,我怎样才能得到这个结果?

【问题讨论】:

    标签: sql relevance full-text-search


    【解决方案1】:

    您需要一个indexOf 函数。在你的 sql 手册中搜索类似的功能。

    然后添加一个类似于ORDER BY rank, CASE indexOf(string, 'best') WHEN -1 THEN 100000 ELSE indexOf(string, 'best') END 的排序条件。

    如果您找不到类似indexOf 的函数,请使用数据库管理器的CREATE FUNCTION 功能自行编写。

    【讨论】:

    • 是...如果我在order by 子句中添加charaindex(string, key) ASC 并添加所有像这样用逗号分隔的关键字,它将起作用...但仅在我寻找“最佳解决方案”时适用于此示例" 但如果我搜索“最佳解决方案”,FTS 查询的结果将是相同的(行,不是排名,但排名 gropus 也将相同),并且在此示例中 charaindex(string, key) ASC 仅适用于 200 | 51 | bests solutions of the world 200 | 50 | wolrds bests solutions 我们需要实现这样的东西 charindex(string, formsof(FORMSOF(INFLECTIONAL,inflectional,key))
    • 您必须自己使用大小写或级联枚举可能的字符串文字,因为您的 sql 管理器无法内置任何语言功能。我建议您编写一个执行所有语言功能的函数,并在排序子句中使用它。
    • 没有别的办法吗?我们可以在没有全文搜索索引的情况下比较两个单词“best”和“bests”(在变量中)吗?
    • 我认为没有任何内置方法可以使用数据库引擎来做到这一点。我能想到的最接近的是将字符串数组传递给专用函数,该函数将处理解析算法。或者,如果您想降低成本,您可以使用自动机解析技术来实现此功能。但是很复杂:en.wikipedia.org/wiki/LALR_parser
    • 可能存在满足此需求的第 3 方解决方案?我们可以在服务器上安装什么...用于整个搜索过程...不仅用于排序“到顶部”记录?过滤器?
    【解决方案2】:

    您想要的第三方解决方案是 Sphinx(还有其他)。在此处阅读更多信息:

    http://www.ioncannon.net/programming/685/full-text-search-with-sphinx/

    【讨论】:

      猜你喜欢
      • 2016-03-01
      • 1970-01-01
      • 2011-03-19
      • 1970-01-01
      • 2023-03-14
      • 1970-01-01
      • 2012-01-29
      • 2021-05-22
      • 1970-01-01
      相关资源
      最近更新 更多