如何在SQL Server中使用领先的通配符全文搜索?

Gre*_*man 42 sql-server full-text-search

注:正在使用SQL的全文搜索功能,蕴含条款和所有人-*是全文的通配符,%是只喜欢条款.

我已经在几个地方读过,因为MS SQL不支持"前导通配符"搜索(例如使用"*overflow"来匹配"stackoverflow").我正在考虑使用CLR函数来添加正则表达式匹配,但我很想知道人们可能会有哪些其他解决方案.

更多信息:您只能在单词或短语的末尾添加星号. - 以及我的经验经验:匹配"myvalue"时,"my*"有效,但"(星号)值"返回不匹配,执行查询时简单如下:

SELECT * FROM TABLENAME WHERE CONTAINS(TextColumn, '"*searchterm"');
Run Code Online (Sandbox Code Playgroud)

因此,我需要一个解决方法.我只在实际搜索页面上使用我的网站搜索 - 所以它的工作方式基本上与Google的工作方式相同(在Joe Sixpack类型的用户眼中).不是那么复杂,但这种匹配真的不应该失败.

xna*_*gyg 25

仅针对前导通配符的解决方法:

  • 将文本存储在不同的字段中(或在物化视图中)
  • 在此列上创建全文索引
  • 找到带有*的反转文本

    SELECT * 
    FROM TABLENAME 
    WHERE CONTAINS(TextColumnREV, '"mrethcraes*"');
    
    Run Code Online (Sandbox Code Playgroud)

当然有许多缺点,只是为了快速解决方法......

更不用说CONTAINSTABLE了......


Mic*_*tum 15

领先通配符的问题:它们无法编入索引,因此您正在进行全表扫描.


小智 9

可以在单词或短语(前缀搜索)的末尾使用通配符"*".

例如,此查询将找到所有"数据库","数据库","数据库"......

SELECT * FROM SomeTable WHERE CONTAINS(ColumnName, '"datab*"')
Run Code Online (Sandbox Code Playgroud)

但是,不可思议的是,无法使用前导通配符进行搜索.

例如,此查询将找不到"数据库"

SELECT * FROM SomeTable WHERE CONTAINS(ColumnName, '"*abase"')
Run Code Online (Sandbox Code Playgroud)

  • 我为此事做了很多搜索,可悲的是,大多数人都错了,认为他们可以进行领先的通配符搜索。前导通配符搜索不起作用。Franjo是正确的,通配符必须位于搜索词组的末尾。我正在使用SQL 2008 R2。它根本找不到它(它不执行表或索引扫描并找到它-根本找不到它) (2认同)

Kev*_*Kev 3

注意CONTAINS:这是我在修订版 #2 中引入关键字之前针对问题的原始版本 #1 提交的答案。事实上它仍然是准确的。

SQL Server 中的通配符是%符号,无论是前导、尾随还是其他方式,它都可以正常工作。

也就是说,如果您要进行任何类型的严肃全文搜索,那么我会考虑利用全文索引功能。使用%_通配符将导致数据库性能受到严重影响。