在我的数据库中,我有一个关键字字段,用于存储以逗号分隔的关键字列表。
例如,史瑞克娃娃可能有以下关键字:
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命令......但它是我想要完成的事情。
我是以正确的方式接近这个吗?
是否可以做这样的事情?
这有意义吗?
答案 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,它应该可以解决问题。 (请注意,我对全文查询引擎没有任何经验。它可能会也可能不会对此代码产生影响。)