我的标题听起来很复杂,但情况非常简单。人们在我的网站上使用“ blackfriday”之类的词进行搜索。

当他们进行搜索时,我的SQL代码需要在各个地方(例如ProductTitleProductDescription字段)查找以找到该术语。例如:

SELECT *
FROM dbo.Products
WHERE ProductTitle LIKE '%blackfriday%' OR
ProductDescription LIKE '%blackfriday%'


但是,该术语在数据库字段中的显示方式有所不同。它最喜欢出现在诸如“ Black Friday USA 2015”之类的词之间。因此,如果不经历和向WHERE子句添加更多组合(例如WHERE ProductTitle LIKE '%Black-Friday%')的话,是否有更好的方法来完成这种模糊搜索?

我在上述字段上启用了全文搜索,但是当我使用CONTAINS子句时,它的效果确实不那么好。当然,其他术语可能不如该示例那么简洁。

最佳答案

我首先要说“(字符串的变化)”有点含糊。您可能会说复数,动词时态,同义词和/或组合词(或忽略两个词之间的空格和标点符号),例如您发布的示例:“ blackfriday” vs.“ black friday” vs“ black-friday”。我有几种解决方案,根据您的用例,其中一种或多种可能对您有用。

忽略标点符号

全文搜索已经忽略标点符号,并将其与空格匹配。因此,无论使用FREETEXT还是CONTAINS,black-friday都将匹配black friday。但这与blackfriday不匹配。

同义词和组合词

使用FREETEXTFREETEXTTABLE进行全文搜索是处理同义词和组合词的某些匹配项的好方法(我不知道哪个)。您可以customize the thesaurus添加更多组合词,前提是您可以提出这样的列表。

处理任意2个单词的组合

也许您的用例要求您匹配格式不正确的文本或主题标签。在这种情况下,我有两个想法:


编写全文查询以使用字典覆盖单词的每个组合。例如,您的数据层可以将对black friday的搜索重写为CONTAINS(*, '"black friday" OR "blackfriday"')。这可能必须变得复杂,例如black friday treehouse必须是("black friday" OR "blackfriday") AND ("treehouse" OR "tree house")吗?您将需要一本字典来找出“ treehouse”是由2个​​单词组成的,因此可以拆分。
如果对要搜索的单词使用字典不切实际(我不知道为什么,也许是首字母缩写词或新的模因),则可以创建一个长查询以覆盖每个字母组合。因此搜索do-re-mi可能是"do re mi" OR "doremi" OR "do remi" OR "dore mi" OR "d oremi" OR "d o remi" ...。是的,它将有很多组合,但是令人惊讶的是,由于全文如何有效地查找索引中的单词,它可能会快速运行。

关于sql - 如何解决可能具有多个变体的字符串的有效搜索?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33925383/

10-11 07:52