【问题标题】:Dictionary-like search using SQL Server FULL-TEXT使用 SQL Server FULL-TEXT 进行类似字典的搜索
【发布时间】:2012-05-02 19:21:51
【问题描述】:

我正在尝试为我的网站创建字典。 使用 FREETEXTTable 和 Rank DESC 搜索“服务器”返回:

  1. 名称服务器 - 映射人类可读名称的程序或服务器..
  2. 服务器 - 服务的人;女服务员或服务员。
  3. server - 一个盘子;一个托盘。 4...

'server' 显然比'name server' 更接近'server'。如何确定排名?

我不能只反转到 ASC,因为还有更糟糕的匹配。 “上帝”的前 3 个结果是“上帝的行为”、“上帝的羔羊”、“上帝”..

编辑:很抱歉有任何混淆。 nameserver、server、server.. 位于一个名为“word”的列中,这是通过全文搜索查询的列。定义在下一列“定义”中并作为查询结果返回。

【问题讨论】:

  • 我的猜测是 1 包含服务器两次。也许您可以将全文索引限制在第 1 列。
  • 感谢这是一个好主意,我使用了 FREETEXTTABLE(Dictionary, word, @0, 20)。这是否足以将索引限制为“单词”列而不是表中的定义列。

标签: sql sql-server dictionary full-text-search ranking


【解决方案1】:

我认为你可以使用联合来解决你的结果排序问题..

喜欢

select * from your_table_name where col_name = 'server'
union 
select * from your_table_name where col_name like '%server%' order by col1,col2..

这个查询应该给你第一行全文搜索,然后是部分搜索..

澄清.. 请注意,col_name 我的意思是说关于列名,你对你的话有什么看法.. 说你的表结构是..

字典- ( c_word , c_定义, c_同义词 )

那么你必须将我的查询修改为

select * from Dictionary where c_word = 'server'
union 
select * from Dictionary where c_word like '%server%' order by c_definition,c_synonyms

这样该查询将首先显示 c_word 值与单词 'server' 完全匹配的位置,然后是部分搜索..

对于动态查询 - 您需要将 'server' 替换为您在其中获取请求的关键字以进行搜索的变量。

【讨论】:

  • 您需要为每个单独的选择添加其他内容以指定顺序。联合可以以任何顺序组装和呈现,不一定与您放在一起的查询的顺序相同。此外,这些查询完全忽略了问题的FULLTEXT 部分——“服务器”本身并不是一个列(您的第一个选择暗示)。
  • 对于我给出的示例,我同意 LIKE 语句可能会给出更接近的匹配,但情况并非总是如此,因为当 LIKE 没有给出任何结果时,全文可以给出接近的结果。有时,用户可能会搜索短语或模棱两可的词的定义。我使用的数据集来自 wiktionary.org,结果很多。
  • @user759885 如果您还想为短句添加条件,那么您还必须在此查询中添加此条件..
【解决方案2】:

我曾一度使用 PATINDEX 函数来执行此操作。类似于以下内容:

SELECT
    Word,
    Definition
FROM
    FREETEXTTABLE(Dictionary, Word, @search, 20) AS Matches
    INNER JOIN Dictionary ON
        Matches.Key = Dictionary.ID
ORDER BY
    CASE PATINDEX('%' + @search + '%', Word) 
        WHEN -1 THEN 1000
        ELSE PATINDEX('%' + @search + '%', Word) 
    END

由于您使用全文索引来获得较小的结果集(在这种情况下最多 20 个),因此它的性能不会太差。 PATINDEX 在表达式中查找字符串。如果表达式中不存在搜索字符串,则返回 -1。如果您也在搜索定义,如果您的搜索与同义词或词干词匹配(例如:您搜索“took”,因此返回“take”),或者如果您的搜索涉及多个词,则可能会发生这种情况。 CASE 语句将这些结果排序到最后。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-26
    • 1970-01-01
    • 2011-11-07
    相关资源
    最近更新 更多