我试图弄清楚加密术语在SQL SERVER中的ISABOUT查询中的确切工作方式.这是我目前所处的位置:
每个查询都返回以下行:
QUERY 1(重量1): 初始排名
SELECT * FROM CONTAINSTABLE(documentParts, title, 'ISABOUT ("e" weight (1) ) ') ORDER BY RANK DESC, [KEY]
KEY RANK
306342 249
272619 156
221557 114
Run Code Online (Sandbox Code Playgroud)
QUERY 2(权重0.8): 排名增加,保留初始订单
SELECT * FROM CONTAINSTABLE(documentParts, title, 'ISABOUT ("e" weight (0.8) ) ') ORDER BY RANK DESC, [KEY]
KEY RANK
306342 321
272619 201
221557 146
Run Code Online (Sandbox Code Playgroud)
QUERY 3(权重0.2): 排名增加,保留初始订单
SELECT * FROM CONTAINSTABLE(documentParts, title, 'ISABOUT ("e" weight (0.2) ) ') ORDER BY RANK DESC, [KEY]
KEY RANK
306342 998 …Run Code Online (Sandbox Code Playgroud) 我在启用了文件流的varchar(max)类型的列上创建了全文索引。文件流包含诸如JPG,TIF,PDF和XML的数据(尽管我认为这与问题几乎无关)。
我创建了两个查询,这些查询使我可以搜索索引。
全文搜索#1--
select
parentObj.ObjectID as 'GroupingID',
parentObj.Name as 'Grouping',
childObj.ObjectID as 'FileObjID',
childObj.Name as 'FileName',
fs.FileStreamID
from dbo.dat_FileStream fs
inner join dbo.dat_Object childObj
on fs.ObjectID = childObj.ObjectID
inner join dbo.dat_Collection c
on fs.ObjectID = c.ObjectID
inner join dbo.dat_Object parentObj
on c.ParentID = parentObj.ObjectID
where contains(FileStreamData, @srchTerm)
and parentObj.ObjectTypeID = 1
ORDER BY 'Grouping'
Run Code Online (Sandbox Code Playgroud)
全文搜索#2--
select
KEY_TBL.RANK,
parentObj.ObjectID as 'GroupingID',
parentObj.Name as 'Grouping',
childObj.ObjectID as 'FileObjID',
childObj.Name as 'FileName',
fs.FileStreamID
from dbo.dat_FileStream fs
inner join containstable(dbo.dat_FileStream, FileStreamData, @srchTerm, 1000) as …Run Code Online (Sandbox Code Playgroud) 例如我有一张桌子Companies.其中有一个字段FullName,我有一个全文索引.然后,我加入一个表CONTAINSTABLE有@search_word像"company*" AND "name*" AND "oil*" AND "propan*" AND "liquid*"...从1到10个字.
而且我知道单词(带变体*)得到了这么多匹配:
所以,如果我按顺序搜索:
@search = '"company*" AND "name*" AND "oil*" AND "propan*" AND "liquid*"'
并按此顺序:
@search = '"liquid*" AND "propan*" AND "oil*" AND "name*" AND "company*"'
SELECT [FullName]
FROM dbo.Companies c
INNER JOIN CONTAINSTABLE (dbo.Companies, [FullName], @search) as s ON s.[KEY] = …Run Code Online (Sandbox Code Playgroud) 下面是我的SQL查询的简化版本,它使用CONTAINSTABLE进行全文搜索.
DECLARE @pSearchFor AS NVARCHAR(100);
SET @pSearchFor = 'SomeKeyword';
SELECT MS.[ModuleScreenID] AS ScreenID
,MS.[ModuleScreenCode] AS ScreenCode
,M.[Description] AS ModuleDescription
,M.[ModuleCode] AS ModuleCode
,FT.[Rank]
FROM ModuleScreen MS
JOIN Module M ON MS.ModuleID = M.ModuleID
JOIN CONTAINSTABLE(ModuleScreen, *, @pSearchFor) FT ON MS.ModuleScreenID = FT.[KEY]
Run Code Online (Sandbox Code Playgroud)
我想为@pSearchFor参数传递空值或空值,以便通过全文搜索返回所有记录.但是当我传递空值或空值时,我得到一个"空或空全文谓词"错误.谷歌搜索后,我发现CONTAINSTABLE不能为关键字取一个空参数.我也在SO中看过这个问题,但它对我没有帮助.
我可以使用CONTAINSTABLE进行条件连接(仅当为@pSearchFor参数指定了值时)吗?我不知道如何实现这一目标.非常感谢任何指针.
我很惊讶地发现,它们都不支持CONTAINS或CONTAINSTABLE似乎不支持以下语法,您在其中为最后一个Search Condition参数传递了列名。
SELECT *
FROM dbo.Articles AS a
WHERE EXISTS
(
SELECT *
FROM dbo.Terms AS t
INNER JOIN CONTAINSTABLE(dbo.Articles, (ArticleBody), t.FulltextTerm)
AS ct ON ct.[Key] = a.ArticleId
)
Run Code Online (Sandbox Code Playgroud)
上面的查询返回“ t附近的语法不正确”错误消息。
该Terms表包含带有一行的多行FulltextTerm,并且如果FulltextTermArticleBody 中包含这些值中的任何一个,则该值应为匹配项,以便选择特定的Article。这就是我要实现的目标。
CONTAINS并且CONTAINSTABLE似乎仅支持字符串文字或变量作为“搜索条件”参数,这是非常有限的。如果那是唯一的选择,则它需要更多的代码,并且如果我需要Terms使用游标或循环遍历表,肯定会慢很多。
我是否在这里缺少技巧或有人可以建议的任何解决方法-最好是基于集合的解决方案,即避免循环。
t-sql sql-server full-text-search containstable sql-server-2008-r2
我CONTAINSTABLE用于我的搜索算法。我想在特定列值中忽略破折号来搜索列值。例如,列包含 '12345-67' 那么它应该使用 '1234567' 进行搜索,如下查询。
SELECT *
FROM table1 AS FT_Table
INNER JOIN CONTAINSTABLE(table2, columnname, '1234567') AS Key_Table ON FT_Table.ID = Key_Table.[Key]
Run Code Online (Sandbox Code Playgroud)
在搜索不包含破折号 (-) 的字符串时,有没有办法忽略破折号 (-)?
sql-server full-text-search freetexttable containstable sql-server-2014
我正在使用 SQL Server 2014 Express,并在表上设置了全文索引。
全文索引仅索引单个列,在此示例中名为foo.
该表中有 3 行。3 行中的值,对于全文索引列,就像这样......
test 1
test 2
test 3 test 1
Run Code Online (Sandbox Code Playgroud)
上面的每一行都是表中的一个新行,该文本实际上就是全文索引列中的内容。因此,使用 SQL Server 的CONTAINS函数,如果我执行以下查询,我会按预期将所有行作为匹配项返回。
SELECT * FROM example WHERE CONTAINS(foo, 'test')
Run Code Online (Sandbox Code Playgroud)
但是,如果我运行以下查询,我也会将所有行作为匹配项返回,这是我不期望的。在以下查询中,我只希望有一行作为匹配项。
SELECT * FROM example WHERE CONTAINS(foo, '"test 3"')
Run Code Online (Sandbox Code Playgroud)
最后,简单地搜索“3”不会返回匹配的行,这也是我没想到的。我希望以下查询中有一个匹配的行,但没有。
SELECT * FROM example WHERE CONTAINS(foo, '3')
Run Code Online (Sandbox Code Playgroud)
我已经阅读了 MSDN 页面CONTAINS和全文索引,但我无法弄清楚这种行为。我一定做错了什么。
有人能向我解释发生了什么以及如何执行我所描述的搜索吗?
我使用目录和索引创建了一个全文搜索,当我运行一个如下所示的单词查询时,包含查询工作正常.
SELECT Name
FROM dbo.Gifts
WHERE CONTAINS(Name, 'gift')
Run Code Online (Sandbox Code Playgroud)
它返回'测试礼物'
我在表中只有一行,而Name列中的数据如下所示:'test gift'
但是当我用这个语句运行conaints查询时:
SELECT Name
FROM dbo.Gifts
WHERE CONTAINS(Name, 'test gift')
Run Code Online (Sandbox Code Playgroud)
它会抛出错误说明:全文搜索条件"测试礼物"中"礼物"附近的语法错误.
我认为包含可以查询短语和多个匹配和听起来相似的单词?
sql-server full-text-search containstable sql-server-2014-express
我正在尝试更新存储过程以便能够比较不区分重音的数据。当前存储过程使用 Containstable 进行全文搜索,但比较是重音敏感的。是否有机会为包含表设置排序规则(例如Latin1_General_CI_AI)?
db 的排序规则区分重音。
我正在使用 MS SQL Server 2012 Express。