如何在搜索中使关键字顺序更具相关性?

时间:2010-05-25 19:46:27

标签: sql search full-text-search keyword

在我的数据库中,我有一个关键字字段,用于存储以逗号分隔的关键字列表。

例如,史瑞克娃娃可能有以下关键字:

ogre, green, plush, hero, boys' toys

“豆豆宝贝”娃娃(恰好是食人魔)可能有:

beanie baby, kids toys, beanbag toys, soft, infant, ogre

(这是一个完全做作的例子。)

我想做的是,如果消费者搜索“食人魔”,我会希望“史瑞克”玩偶在搜索结果中更高。

我的内容管理员认为,如果关键字在列表中较早,则应获得更高的排名。 (这对我来说很有意义,这让我很容易让他们控制搜索结果的相关性。)

这是一个简化的查询:

SELECT
p.ProductID         AS ContentID
, p.ProductName     AS Title
, p.ProductCode     AS Subtitle
, 100               AS Rank
, p.ProductKeywords AS Keywords
FROM Products AS p
WHERE FREETEXT( p.ProductKeywords, @SearchPredicate )

我正在考虑用以下代码替换RANK:

, 200 - INDEXOF(@SearchTerm)            AS Rank

此“应该”按关键字对关键字结果进行排名

我知道INDEXOF不是一个SQL命令......但它是我想要完成的事情。

我是以正确的方式接近这个吗?

是否可以做这样的事情?

这有意义吗?

2 个答案:

答案 0 :(得分:1)

我可以建议另一种方式吗?

如果有一个链接表ProductKeywords:

ID_ProductKeyword(pk)
ProductID(int)
KeywordID(int)
Weight(int)

这表达了上述关系:关键字和产品之间的关系,以及特定关键字对特定产品的重要程度(较高的权重对应较高的索引)。

另一个好处是,您可以根据关键字为用户提供正确产品的频率来动态更新权重。或者,如果您发现错过了关键字关联,他们可以轻松添加关键字关联(在记住史莱克是一个食人魔之前,他们是否搜索了 myers ?)

我的两分钱。

答案 1 :(得分:1)

根据您拥有的内容以及您不需要修改现有结构的情况,这很好地说明了SQL Server在字符串操作方面的蹩脚,但它可以正常工作。走过逻辑:

DECLARE
  @ProductKeywords varchar(100)
 ,@SearchPredicate varchar(10)

SET @ProductKeywords = 'The,quick,brown,fox,jumps,over'
SET @SearchPredicate= 'fox'

--  Where in the string your search value is
print charindex(@SearchPredicate, @ProductKeywords)

--  The string up through but not including your search string
print left(@ProductKeywords, charindex(@SearchPredicate, @ProductKeywords))

--  Remove the commas (your delimiter) from the above
print replace(left(@ProductKeywords, charindex(@SearchPredicate, @ProductKeywords)), ',', '')

--  This is how many characters are left
print len(replace(left(@ProductKeywords, charindex(@SearchPredicate, @ProductKeywords)), ',', ''))

--  This is how many delimiters you removed,
--  = the number of words (minus one) from the "first" the found word was,
--  = a weighting factor you can use
print charindex(@SearchPredicate, @ProductKeywords) - len(replace(left(@ProductKeywords, charindex(@SearchPredicate, @ProductKeywords)), ',', ''))

用p.ProductKeywords替换@ProductKeyword,它应该可以解决问题。 (请注意,我对全文查询引擎没有任何经验。它可能会也可能不会对此代码产生影响。)