0

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

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

“服务器”显然比“名称服务器”更接近“服务器”。如何固定排名?

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

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

4

2 回答 2

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。如果您也在搜索定义,如果您的搜索与同义词或词干词匹配(例如:您搜索“took”,因此返回“take”),或者如果您的搜索涉及多个词,则可能会发生这种情况。CASE 语句将这些结果排序到最后。

于 2012-04-29T21:58:25.750 回答
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我的意思是说列名是什么意思..说你的表结构是..

字典- ( 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'为您获得请求关键字的变量以进行搜索。

于 2012-04-21T13:44:41.197 回答