SQL Server Полнотекстовый поиск

В настоящее время я работаю над приложением, в котором у нас есть база данных SQL-Server, и мне нужно, чтобы работал полнотекстовый поиск, позволяющий нам искать имена людей.

В настоящее время пользователь может ввести в поле имени, которое ищет 3 различных столбца varchar. Имя, Фамилия, Отчество

Скажем, у меня есть 3 строки со следующей информацией.

1 - Филипп - Дж - Фрай

2 - Эми - НУЛЬ - Вонг

3 - Лев - НУЛЬ - Вонг

Если пользователь вводит имя, такое как «Фрай», он возвращает строку 1. Однако, если они вводят Филиппа Фрая, или Фр, или Фила, они ничего не получают ... и я не понимаю, почему он это делает. Если они ищут Вонга, они получают строки 2 и 3, если они ищут Эми Вонг, они снова ничего не получают.

В настоящее время запрос использует 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;  
....

Есть идеи...? Почему этот полнотекстовый поиск не работает правильно?

19.08.2008 22:04:13
5 ОТВЕТОВ

FreeTextTable должен работать.

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

@SearchString должен содержать такие значения, как 'Phillip Fry' (одна длинная строка, содержащая все строки поиска, разделенные пробелами).

Если вы хотите найти Fr или Phil, используйте звездочку: Phil * и Fr *

«Фил» ищет именно слово «Фил». «Фил *» ищет каждое слово, начинающееся с «Фил»

4
20.08.2008 14:14:24

Если вы просто ищете имена людей, в ваших же интересах не использовать даже полнотекстовый индекс. Полнотекстовый индекс имеет смысл, когда у вас большие текстовые поля, но если вы в основном имеете дело с одним словом на поле, я не уверен, сколько вы получите от полнотекстовых индексов. Ожидание переиндексации полнотекстового индекса до того, как вы сможете искать новые записи, может быть одной из многих проблем.

Вы можете просто сделать запрос, такой как следующий. Разделите строку поиска по пробелам и создайте список условий поиска.

Выберите Имя, Отчество, Фамилия 
От человека 
ГДЕ 
Имя как @ searchterm1 + '%'
или MiddleName, например @ searchterm1 + '%'
или Фамилия как @ searchterm1 + '%'
или Имя как @ searchterm2 + '%'
и т.д....
4
20.08.2008 14:25:57

Другим подходом может быть абстрагирование поиска от отдельных полей.

Другими словами, создайте представление для ваших данных, которое превращает все разделенные поля, такие как имя и фамилия, в объединенные поля, то есть полное имя

Тогда поиск по виду. Это, вероятно, сделает поиск проще.

2
20.08.2008 14:51:03
РЕШЕНИЕ

Спасибо за ответы, ребята, я наконец-то смог заставить его работать. С частью как Бири, так и ответов Кибби. Мне нужно было добавить * к строке и разбить ее на пробелы, чтобы работать. Итак, в конце концов я получил

....
@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
17.04.2012 19:44:13
Обратите внимание, что звездочки как символы подстановки работают только при использовании в конце поискового запроса. Звездочки в начале поискового запроса просто игнорируются полнотекстовой поисковой системой.
RSW 26.01.2013 16:05:31
Спасибо за ответ. Вы забыли Лилу и Бендера. Могу ли я использовать Lucene для этого?
Rony Tesler 25.09.2014 16:59:14

Возможно, вы захотите проверить Lucene.net в качестве альтернативы полному тексту.

2
20.08.2008 16:27:25