怎么努力,它将全文搜索与SQL服务器?
-
03-07-2019 - |
题
我建立一个C#/ASP。网络应用程序与SQL后端。我在最后期限,并完成了我的网页,左外野我的一个设计师纳入一个全文搜索我的一页。我的"搜索"直到这点已经过滤器,能够狭窄的结果设定的某些因素和列价值观。
是,我在最后期限(你知道的3小时的睡眠一个夜晚,在那里我在找样东西的猫吃了,扔了),我期待这个网页应非常类似的是其他人和我在试着决定是否做出臭味。我从来没有做过一个全文搜索页面上。这是一个山爬上或是有简单的解决方案吗?
谢谢你。
解决方案
首先,需要启用全文检索索引的生产服务器,因此,如果这不是在范围上,你不会想要去与此有关。
然而,如果这已经准备就绪,全文搜索比较简单。
T-SQL有4谓词用于全文搜索:
- 一般
- FREETEXTTABLE
- 包含
- CONTAINSTABLE
一般是简单的,可以做这样的:
SELECT UserName
FROM Tbl_Users
WHERE FREETEXT (UserName, 'bob' )
Results:
JimBob
Little Bobby Tables
FREETEXTTABLE的作用相同一般,除了返回的结果作为一个表中。
真正的力量的T-SQL的全文搜索来自包含(和CONTAINSTABLE)谓...这个是巨大的,因此,我将只是其用途:
CONTAINS
( { column | * } , '< contains_search_condition >'
)
< contains_search_condition > ::=
{ < simple_term >
| < prefix_term >
| < generation_term >
| < proximity_term >
| < weighted_term >
}
| { ( < contains_search_condition > )
{ AND | AND NOT | OR } < contains_search_condition > [ ...n ]
}
< simple_term > ::=
word | " phrase "
< prefix term > ::=
{ "word * " | "phrase * " }
< generation_term > ::=
FORMSOF ( INFLECTIONAL , < simple_term > [ ,...n ] )
< proximity_term > ::=
{ < simple_term > | < prefix_term > }
{ { NEAR | ~ } { < simple_term > | < prefix_term > } } [ ...n ]
< weighted_term > ::=
ISABOUT
( { {
< simple_term >
| < prefix_term >
| < generation_term >
| < proximity_term >
}
[ WEIGHT ( weight_value ) ]
} [ ,...n ]
)
这意味着你可以写查询的,例如:
SELECT UserName
FROM Tbl_Users
WHERE CONTAINS(UserName, '"little*" NEAR tables')
Results:
Little Bobby Tables
祝你好运:)
其他提示
SQL Server中的全文搜索非常简单,有点配置,并且对queryside进行了轻微的调整,你很高兴!我已经在20分钟之内为客户完成了这个过程,熟悉了这个过程
以下是 2008 MSDN文章,链接指出那里的2005年版本
之前我使用过dtSearch来添加对文件和数据库的全文搜索,而且它们的东西非常便宜且易于使用。
除了添加所有内容并配置SQL之外,此脚本将搜索数据库中的所有列,并告诉您哪些列包含您要查找的值。我知道它不是“适当的”解决方案,但可能会给你买一些时间。
/*This script will find any text value in the database*/
/*Output will be directed to the Messages window. Don't forget to look there!!!*/
SET NOCOUNT ON
DECLARE @valuetosearchfor varchar(128), @objectOwner varchar(64)
SET @valuetosearchfor = '%staff%' --should be formatted as a like search
SET @objectOwner = 'dbo'
DECLARE @potentialcolumns TABLE (id int IDENTITY, sql varchar(4000))
INSERT INTO @potentialcolumns (sql)
SELECT
('if exists (select 1 from [' +
[tabs].[table_schema] + '].[' +
[tabs].[table_name] +
'] (NOLOCK) where [' +
[cols].[column_name] +
'] like ''' + @valuetosearchfor + ''' ) print ''SELECT * FROM [' +
[tabs].[table_schema] + '].[' +
[tabs].[table_name] +
'] (NOLOCK) WHERE [' +
[cols].[column_name] +
'] LIKE ''''' + @valuetosearchfor + '''''' +
'''') as 'sql'
FROM information_schema.columns cols
INNER JOIN information_schema.tables tabs
ON cols.TABLE_CATALOG = tabs.TABLE_CATALOG
AND cols.TABLE_SCHEMA = tabs.TABLE_SCHEMA
AND cols.TABLE_NAME = tabs.TABLE_NAME
WHERE cols.data_type IN ('char', 'varchar', 'nvchar', 'nvarchar','text','ntext')
AND tabs.table_schema = @objectOwner
AND tabs.TABLE_TYPE = 'BASE TABLE'
ORDER BY tabs.table_catalog, tabs.table_name, cols.ordinal_position
DECLARE @count int
SET @count = (SELECT MAX(id) FROM @potentialcolumns)
PRINT 'Found ' + CAST(@count as varchar) + ' potential columns.'
PRINT 'Beginning scan...'
PRINT ''
PRINT 'These columns contain the values being searched for...'
PRINT ''
DECLARE @iterator int, @sql varchar(4000)
SET @iterator = 1
WHILE @iterator <= (SELECT Max(id) FROM @potentialcolumns)
BEGIN
SET @sql = (SELECT [sql] FROM @potentialcolumns where [id] = @iterator)
IF (@sql IS NOT NULL) and (RTRIM(LTRIM(@sql)) <> '')
BEGIN
--SELECT @sql --use when checking sql output
EXEC (@sql)
END
SET @iterator = @iterator + 1
END
PRINT ''
PRINT 'Scan completed'
我去过那儿。它就像一个魅力,直到你开始考虑可扩展性和高级搜索功能,如搜索多个列,并给出每个不同的权重值。
例如,搜索标题和摘要列的唯一方法是使用 SearchColumn = CONCAT(标题,摘要)的计算列代码>和索引
SearchColumn
。权重? SearchColumn = CONCAT(CONCAT(Title,Title),Summary)
之类的东西。 ;)过滤?算了吧。
“它有多难”这是一个难以回答的问题。例如,已经完成10次的人可能会认为这很容易。我真正可以说的是,如果你使用像 NLucene 而不是自己动手。