【问题标题】:How can I make keyword order more relevant in my search?如何使关键字顺序在我的搜索中更相关?
【发布时间】:2011-02-23 21:04:10
【问题描述】:

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

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

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 命令...但它是我想要完成的事情。

我的方法正确吗?

有可能做这样的事情吗?

这有意义吗?

【问题讨论】:

  • @serg555 目前是 SQL Server 2005。
  • 是否支持CHARINDEXPATINDEX?这些可以用来代替“INDEXOF”。
  • 它似乎支持它......但我在实现它时运气不佳。

标签: sql search full-text-search keyword


【解决方案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 就可以了。 (请注意,我对全文查询引擎的经验为零。它可能会也可能不会对这段代码产生影响。)

【讨论】:

  • 谢谢!我要试试这个!我遵循逻辑,其中有一些我没有想到的事情。
【解决方案2】:

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

如果有一个链接表 ProductKeywords:

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

这表达了上面的关系:关键字和产品之间的关系,以及特定关键字对特定产品的重要性(权重越高,索引越高)。

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

我的两分钱。

【讨论】:

  • 是的,我正在考虑将关键字重构到它自己的表中......但我不想弄乱数据结构,因为它现在用于生产代码。我还想让我的用户在不强迫他们考虑权重和排名的情况下尽可能轻松地进行更新。虽然我可以让 GUI 中的内容管理员对此透明。
猜你喜欢
  • 2011-06-14
  • 1970-01-01
  • 2012-03-02
  • 1970-01-01
  • 2018-03-27
  • 1970-01-01
  • 2017-12-19
  • 2021-07-26
  • 2017-02-18
相关资源
最近更新 更多