我目前正在开发一个应用程序,其中有一个 SQL-Server 数据库,我需要进行全文搜索以允许我们搜索人员姓名。

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

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

1 - 菲利普 - J - 弗莱

2 - 艾米 - 空 - 黄

3 - 狮子座 - 空 - 黄

如果用户输入“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;  
....

有任何想法吗...?为什么全文搜索无法正常工作?

有帮助吗?

解决方案 3

感谢大家的回复,我终于能够让它工作了。包含 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;  
....

有更多字段正在搜索,我只是简化了问题,对此感到抱歉,我认为这不会影响答案。它实际上搜索一个包含昵称 csv 和注释列的列。

谢谢您的帮助。

其他提示

FreeTextTable 应该可以工作。

INNER JOIN FREETEXTTABLE(Person, (LastName, Firstname, MiddleName), @SearchString) 

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

如果您想搜索 Fr 或 Phil,您应该使用星号:菲尔*和神父*

“Phil”正在寻找“Phil”一词。“Phil*”正在查找以“Phil”开头的每个单词

如果您只是搜索人名,那么甚至不使用全文索引可能符合您的最佳利益。当您有大型文本字段时,全文索引很有意义,但如果您主要处理每个字段一个单词,我不确定您会从全文索引中获得多少额外的收益。在搜索新记录之前等待全文索引重新索引可能是众多问题之一。

您可以只进行如下查询。将搜索字符串拆分为空格,然后创建搜索词列表。

Select FirstName,MiddleName,LastName 
From person 
WHERE 
Firstname like @searchterm1 + '%'
or MiddleName like @searchterm1 + '%'
or LastName like @searchterm1 + '%'
or Firstname like @searchterm2 + '%'
etc....

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

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

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

您可能想查看 Lucene.net 作为全文的替代。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top