cor*_*ews 12 sql-server search full-text-search
我目前正在开发一个应用程序,我们有一个SQL-Server数据库,我需要进行全文搜索工作,以便我们搜索人的名字.
目前,用户可以在名称字段中输入搜索3个不同varchar列的名称.第一,最后,中间名
所以说我有3行以下信息.
1 - 菲利普 - J - 弗莱
2 - 艾米 - 空 - 黄
3 - Leo - NULL - Wong
如果用户输入诸如'Fry'之类的名称,它将返回第1行.但是,如果他们进入Phillip Fry,或者Fr,或者Phil,他们什么也得不到......我不明白为什么这样做.如果他们搜索Wong,他们会获得第2行和第3行,如果他们搜索Amy Wong他们又一无所获.
目前查询使用的是CONTAINSTABLE,但我已使用FREETEXTTABLE,CONTAINS和FREETEXT切换,结果没有任何明显的差异.表格方法是首选,因为它们返回相同的结果,但具有排名.
这是查询.
....
@Name nvarchar(100),
....
--""s added to prevent crash if searching on more then one word.
DECLARE @SearchString varchar(100)
SET @SearchString = '"'+@Name+'"'
SELECT Per.Lastname, Per.Firstname, Per.MiddleName
FROM Person as Per
INNER JOIN CONTAINSTABLE(Person, (LastName, Firstname, MiddleName), @SearchString)
AS KEYTBL
ON Per.Person_ID = KEYTBL.[KEY]
WHERE KEY_TBL.RANK > 2
ORDER BY KEYTBL.RANK DESC;
....
Run Code Online (Sandbox Code Playgroud)
有任何想法吗...?为什么这个全文搜索无法正常工作?
如果您只是搜索人名,那么甚至不使用全文索引可能符合您的最佳利益。当您有大型文本字段时,全文索引很有意义,但如果您主要处理每个字段一个单词,我不确定您会从全文索引中获得多少额外的收益。在搜索新记录之前等待全文索引重新索引可能是众多问题之一。
您可以只进行如下查询。将搜索字符串拆分为空格,然后创建搜索词列表。
选择名字、中间名、姓氏 从人 在哪里 名字,如 @searchterm1 + '%' 或中间名,如 @searchterm1 + '%' 或姓氏,如 @searchterm1 + '%' 或名字,如 @searchterm2 + '%' ETC....
感谢大家的回复,我终于能够让它工作了。包含 Biri 和 Kibbee 的部分答案。我需要将 * 添加到字符串中并用空格将其分解才能工作。所以最后我得到了
....
@Name nvarchar(100),
....
--""s added to prevent crash if searching on more then one word.
DECLARE @SearchString varchar(100)
--Added this line
SET @SearchString = REPLACE(@Name, ' ', '*" OR "*')
SET @SearchString = '"*'+@SearchString+'*"'
SELECT Per.Lastname, Per.Firstname, Per.MiddleName
FROM Person as Per
INNER JOIN CONTAINSTABLE(Person, (LastName, Firstname, MiddleName), @SearchString)
AS KEYTBL
ON Per.Person_ID = KEYTBL.[KEY]
WHERE KEY_TBL.RANK > 2
ORDER BY KEYTBL.RANK DESC;
....
Run Code Online (Sandbox Code Playgroud)
有更多字段正在搜索,我只是简化了问题,对此感到抱歉,我认为这不会影响答案。它实际上搜索一个包含昵称 csv 和注释列的列。
谢谢您的帮助。