如何基于关键字搜索进行排序?

时间:2010-07-06 17:06:03

标签: sql-server sql-server-2000 full-text-search

我的sql语句

SELECT *  
  FROM mytable 
 WHERE (CONTAINS(keyword,' "green" '))

如何列出最匹配的结果

Green
Army Green
Hunter Green

而不是下面的

Army Green
Green
Hunter Green

我知道我们不能在我的情况下使用asc或desc的命令。

我计划在'green'之前添加一个空格并使用字典对象或插入到数据库中并按字母顺序排序。我认为这里有一种更好的技术可以完成这项工作,而不是使用我的慢速技术来专门处理关键字数据库中超过数百万条记录。

顺便说一句,我们仍在使用古老的SQL Server 2000。

这是与绿色相关的关键字。我想根据input关键字获得最匹配的结果。结果应显示与关键字最接近的匹配。

数据库中的数据

Army Green
Blue-Green
Bright Green
British Racing Green
Camouflage Green
Dark Green
Dark Pastel Green
Electric Green
Fern Green
Forest Green
Green
Green-Yellow
Hunter Green
India Green
Islamic Green
Jungle Green
Kelly Green
Lawn Green
Lime Green
Moss Green
MSU Green
Office Green
Pastel Green
Persian Green
Pine Green
Sea Green
Shamrock Green
Spring Green
Tea Green
Yellow-Green

5 个答案:

答案 0 :(得分:1)

...也许

SELECT *  
    FROM mytable 
    WHERE (CONTAINS(keyword,' "green" '))
    ORDER BY FIND_IN_SET('green', keyword);

Find_in_set MySQL;你可能没有。它只返回关键字列中“绿色”一词的位置。

如果有任何帮助,SQL Server似乎有CHARINDEX('green', keyword)

答案 1 :(得分:0)

嗯,你可以使用特殊情况完全匹配:

SELECT *  
  FROM mytable 
 WHERE keyword = 'green'
UNION ALL
SELECT *  
  FROM mytable 
 WHERE (CONTAINS(keyword,' "green" '))
   AND keyword <> 'green'

答案 2 :(得分:0)

我不确定你到底发生了什么,我对全文搜索不是很熟悉,但也许你可以按len(keyword)订购。

无论如何,这对你的例子都有效。但它不会优先考虑具有多个“绿色”实例的行。

答案 3 :(得分:0)

看起来您正在尝试查找“绿色”关键字的频率?

假设你的桌子看起来像这样 (提供完整,准确的描述。):

CREATE TABLE mytable (item VARCHAR(40), keyword VARCHAR(100) )

INSERT INTO mytable (item, keyword)
SELECT      'room 01', 'Green'              UNION ALL
SELECT      'room 02', 'Green'              UNION ALL
SELECT      'room 03', 'Green'              UNION ALL
SELECT      'room 04', 'Army Green'         UNION ALL
SELECT      'room 05', 'Army Green'         UNION ALL
SELECT      'room 06', 'Hunter Green'       UNION ALL
SELECT      'room 07', 'Some Other Color'

然后通过以下方式获得所需的结果:

SELECT      keyword, COUNT (item) AS cnt
FROM        mytable
WHERE       keyword LIKE '%green%'
GROUP BY    keyword 
ORDER BY    cnt DESC

/*
Yields:
    keyword         cnt
    ------------    ---
    Green           3
    Army Green      2
    Hunter Green    1
*/

或者,如果正在使用全文索引:

SELECT      keyword, COUNT (item) AS cnt
FROM        mytable
WHERE       (CONTAINS(keyword,' "green" '))
GROUP BY    keyword 
ORDER BY    cnt DESC


如果关键字是textntext列:

SELECT      CAST (keyword as VARCHAR(8000)), COUNT (item) AS cnt
FROM        mytable
WHERE       (CONTAINS(keyword,' "green" '))
GROUP BY    CAST (keyword as VARCHAR(8000))
ORDER BY    cnt DESC

答案 4 :(得分:-1)

我已经提出了一个解决方案,使用PATINDEX和CASE函数来创建假列并从假列中对其进行排序,它运行正常。

谢谢你们