首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL Server全文搜索

SQL Server全文搜索
EN

Stack Overflow用户
提问于 2008-08-19 22:04:14
回答 4查看 3.8K关注 0票数 12

我目前正在开发一个应用程序,在该应用程序中,我们有一个SQL-Server数据库,我需要使用全文搜索功能来搜索人名。

目前,用户可以在搜索3个不同varchar的名称字段中输入a。名字,姓氏,中间名

假设我有3行,包含以下信息。

1- Phillip -J-油炸

2- Amy - NULL -王

3- Leo - NULL -王

如果用户输入名称,如' Fry‘,它将返回行1。但是,如果用户输入Phillip Fry、Fr或Phil,则什么也得不到。我不明白它为什么要这么做。如果他们搜索王,他们得到第2行和第3行,如果他们搜索艾米·王,他们同样什么也得不到。

当前查询使用的是CONTAINSTABLE,但我已经使用FREETEXTTABLE、CONTAINS和FREETEXT切换了这一点,结果中没有任何明显的差异。表方法是首选方法,因为它们返回相同的结果,但具有排名。

下面是查询。

代码语言:javascript
复制
....
@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;  
....

有什么想法...?为什么全文搜索不能正常工作?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2008-08-20 15:28:21

感谢大家的回复,我终于可以让它工作了。包含Biri和Kibbee答案的一部分。我需要将*添加到字符串中,并在空格中将其拆分才能正常工作。所以最后我得到了

代码语言:javascript
复制
....
@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;  
....

有更多的字段被搜索,我只是对问题进行了简化,很抱歉,我不认为这会影响答案。它实际上会搜索一个csv为昵称的列和一个备注列。

谢谢你的帮助。

票数 3
EN

Stack Overflow用户

发布于 2008-08-20 14:14:24

FreeTextTable应该可以工作。

代码语言:javascript
复制
INNER JOIN FREETEXTTABLE(Person, (LastName, Firstname, MiddleName), @SearchString) 

@SearchString应该包含像'Phillip Fry‘这样的值(一个长字符串,其中包含由空格分隔的所有查找字符串)。

如果你想搜索Fr或Phil,你应该使用星号: Phil*和Fr*

'Phil‘就是在找'Phil’这个词。“Phil*”正在查找以“Phil”开头的每个单词。

票数 4
EN

Stack Overflow用户

发布于 2008-08-20 14:51:03

另一种方法是将搜索从单个字段中抽象出来。

换句话说,在您的数据上创建一个视图,将所有拆分的字段(如名字、姓氏)转换为连接的字段,即full_name

然后在视图上进行搜索。这可能会使搜索查询变得更简单。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17056

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档