SQL Server Полнотекстовый поиск - PullRequest
12 голосов
/ 20 августа 2008

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

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

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

1 - Филипп - J - Фрай

2 - Эми - NULL - Вонг

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;  
....

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

Ответы [ 5 ]

4 голосов
/ 20 августа 2008

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

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

Select FirstName,MiddleName,LastName 
From person 
WHERE 
Firstname like @searchterm1 + '%'
or MiddleName like @searchterm1 + '%'
or LastName like @searchterm1 + '%'
or Firstname like @searchterm2 + '%'
etc....
4 голосов
/ 20 августа 2008

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

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

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

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

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

3 голосов
/ 20 августа 2008

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

....
@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 и столбцом примечаний.

Спасибо за помощь.

2 голосов
/ 20 августа 2008

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

2 голосов
/ 20 августа 2008

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...