使用SQL Server FULL-TEXT进行类字典搜索

时间:2012-04-21 13:13:36

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

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

  1. 名称服务器 - 映射人类可读名称的程序或服务器..
  2. 服务器 - 服务的人;女服务员或服务员。
  3. 服务器 - 用于餐具的托盘;托盘。 4 ...
  4. 'server'显然比'name server'更接近'server'。我如何确定排名?

    我不能只是逆转ASC,因为有更糟糕的比赛。 “上帝”的前3个结果是“上帝的行为”,“上帝的羔羊”,“上帝”......

    编辑:抱歉有任何困惑。名称服务器,服务器,服务器..位于名为“word”的单个列中,这是使用全文搜索查询的列。定义位于下一列“定义”中,并作为查询结果返回。

2 个答案:

答案 0 :(得分:0)

我认为您可以使用union来解决结果排序问题..

喜欢

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我想说的是你的单词名称。 说你的桌子结构是..

dictionary- (c_word,   c_definition,   c_synonyms )

然后你必须修改我的查询

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'替换为您要获取搜索关键字的变量。

答案 1 :(得分:0)

我使用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。如果您还搜索定义,如果您的搜索匹配同义词或词干(例如:您搜索“take”以便返回“take”),或者您的搜索涉及多个单词,则可能会出现这种情况。 CASE语句将这些结果排序到最后。