你如何获得领先的通配符的全文搜索工作SQL服务器?
-
08-06-2019 - |
题
注: 我 我 使用SQL的全文搜索功能,包含的条款和所有本*是通配符的全文,%是用于像条款只。
我读过在几个地方现在认为"领先通配符的"搜索(例如使用"*溢出",以配合"计算器")不支持在MS SQL。我在考虑使用 CLR的功能以增加regex匹配, 但我想看看有什么其他的解决方案的人可能拥有的。
更多信息: 你可以添加星号只有在最后的单词或短语。 -带着我的实际经验:当匹配"myvalue","我的*"工作,但"(星号)价值"没有返回匹配,这样做时查询这么简单:
SELECT * FROM TABLENAME WHERE CONTAINS(TextColumn, '"*searchterm"');
因此,我需要一个解决办法。我只是使用的搜索,在我的网站上一个实际搜索页面,所以它需要的工作基本上相同的方式,谷歌作品(在眼睛上乔适类型的用户)。几乎不复杂,但是这种比赛真不应该失败。
没有正确的解决方案
其他提示
解决方法仅用于领先通配:
- 储存的文字颠倒在一个不同的领域(或者在现实图)
- 创建一个完整的文索引在此列
找到逆转的文字与*
SELECT * FROM TABLENAME WHERE CONTAINS(TextColumnREV, '"mrethcraes*"');
当然有许多缺点,只是为了快速的解决方法...
不要说CONTAINSTABLE...
该问题导致通配符:他们不能被编入索引的,因此你做一个完整的表格的扫描。
它是能够使用通配符的"*"结尾的字或短语(前缀搜索)。
例如,这种查询将找到的所有"。","数据库","数据库"...
SELECT * FROM SomeTable WHERE CONTAINS(ColumnName, '"datab*"')
但是,unforutnately,这是不可能的搜索与领先的配符。
例如,这种查询不会找到"数据库"
SELECT * FROM SomeTable WHERE CONTAINS(ColumnName, '"*abase"')
或许添加澄清这个线程,从我的测试在2008年R2,Franjo是正确上面。在处理全文搜索,至少有时使用的包含短语,你不能使用领先的 , ,只有一个结尾 功能。*是通配符,不%,全文。
有人建议,*将被忽略。这似乎不是这种情况下,我的结果似乎显示,尾*功能的工作。我认为领先*将被忽略通过发动机。
我的添加问题,但是,同样的查询,随后*,使用全文中使用通配符的工作相对较快在2005年(20秒),并且减缓了12分钟后迁移的数据库于2008年R2。它似乎至少一个其他用户有类似的结果,他开始了一个论坛后,我加入到...一般工作速度快,但一些东西"似乎"有改变的方式2008年进程后*在包含的内容。他们得到各种警告在升级顾问,他们"改善"的全文本,以便你的代码可以打破,但不幸的是,他们不给你任何具体的警告有关某些过时的代码等。...只是一个声明,他们改变了它,使用在自己的风险。
http://social.msdn.microsoft.com/Forums/ar-SA/sqlsearch/thread/7e45b7e4-2061-4c89-af68-febd668f346c
也许,这是最近的MS击中有关这些问题... http://msdn.microsoft.com/en-us/library/ms143709.aspx
有一件事值得铭记的是,领先的配符查询来在明显的性能高,相对于其他通配符的用途。
通配符SQL服务器的 %
签署和它工作得很好,领先的,后或以其他方式。
这就是说,如果你不会做任何种类的严重的全文搜索然后我会考虑利用全文检索的能力。使用 %
和 _
野卡将引起你的数据库采取的一个严重性的打击。
从SQL服务器书在线:
写全文查询 Microsoft SQL Server2005年,你必须 学习如何使用含有 一般Transact-SQL谓, CONTAINSTABLE和FREETEXTTABLE 行集值的功能。
这意味着所有的查询,上面写的与%和_不是有效的全文查询。
这里是一个什么样的查询看起来像当调CONTAINSTABLE功能。
选择排名,*FROM TableName, CONTAINSTABLE(TableName,*,' "*通配符"')searchTable在哪里 [KEY]=TableName.pk以通过 searchTable.排名DESC
为了CONTAINSTABLE功能知道我的使用通配符搜索时,我得把它双引号。我可以使用通配符*在开始或结束。还有很多其他的事情可以做,当你建立的搜索字符串CONTAINSTABLE功能。你可以寻找一个词附近的另一个词,搜索变的话(驱=驱动,开车,驾车,并带动),并寻找的同义词的另一个词(金属可以有同义词,如铝和钢)。
我刚创建了一个表,把一个完整的文索引表,并做了几个试验搜索和没有一个问题,因此通配寻找工作为目的。
[新]
我看到你就更新你的问题,并且知道你需要使用一种功能。
你仍然可以搜索的通配符的开始,但如果这个词不是一个完整的词下的通配符的,你需要添加的另一个通配符的结束。
Example: "*ildcar" will look for a single word as long as it ends with "ildcar".
Example: "*ildcar*" will look for a single word with "ildcar" in the middle, which means it will match "wildcard". [Just noticed that Markdown removed the wildcard characters from the beginning and ending of my quoted string here.]
[更新#2]
戴夫*沃德-使用通配符的一个功能不应该是一个巨大的性打击。如果我创建了一个检索字符串只有"*",它将不会回返的所有行,在我的测试情况下,返回0记录。
仅供参考,谷歌不会做任何子串的搜索或截断,左右。他们有一个配符*找到未知的话,在一个短语,但没有一个字。
谷歌,随着最全文搜索引擎,设立了一个反向索引的基础上按字母顺序排列的话,链接到其来源的文件。二进制的搜索是邪恶的快,即使是庞大的索引。但这是真的真的很难做到的左截断在这种情况下,因为失去优势的指标。
作为一个参数,在一个存储程序的你可以用它作为:
ALTER procedure [dbo].[uspLkp_DrugProductSelectAllByName]
(
@PROPRIETARY_NAME varchar(10)
)
as
set nocount on
declare @PROPRIETARY_NAME2 varchar(10) = '"' + @PROPRIETARY_NAME + '*"'
select ldp.*, lkp.DRUG_PKG_ID
from Lkp_DrugProduct ldp
left outer join Lkp_DrugPackage lkp on ldp.DRUG_PROD_ID = lkp.DRUG_PROD_ID
where contains(ldp.PROPRIETARY_NAME, @PROPRIETARY_NAME2)
也许下面的链接将提供最后的答复,以这种使用通配符: 执行FTS通配符搜索.
注意到该通道,即各国:"然而,如果指定的"链"或"Ch是不是"你将不会获得预期的结果。星号将被视为一个正常的标点符号不通配符。"
如果你有访问的名单的话,全文搜索引擎,你可以做一个"喜欢"搜索这个名单上的匹配数据库的话发现的,例如表'改为'与以下文字:
pie
applepie
spies
cherrypie
dog
cat
匹配的所有词语的含'馅饼'在这个数据库上fts表'full_text'有领域"文本":
to-match <- SELECT word FROM words WHERE word LIKE '%pie%'
matcher = ""
a = ""
foreach(m, to-match) {
matcher += a
matcher += m
a = " OR "
}
SELECT text FROM full_text WHERE text MATCH matcher
%匹配的任何数字 _匹配一个单字
我从来没有使用全文检索但你可以完成相当复杂和快速搜索的查询只是使用建立在T-SQL串职能。