Подтвердить что ты не робот

Поиск по полнотекстовому поиску SQL Server

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

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

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

1 - Phillip - J - Fry

2 - Эми - NULL - Wong

3 - Лев - NULL - Вонг

Если пользователь вводит такое имя, как "Fry", он вернет строку 1. Однако, если они войдут в Phillip Fry или Fr или Phil, они ничего не получат.. и я не понимаю, почему это делается. Если они ищут Вонга, они получают строки 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 = '"'[email protected]+'"'
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;  
....

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

4b9b3361

Ответ 1

Спасибо за ответы, ребята, я наконец смог заставить его работать. С частью ответов 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 = '"*'[email protected]+'*"'

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

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

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

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

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

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

Ответ 3

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

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

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

Ответ 4

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

Другими словами, создайте представление о своих данных, которое превратит все поля разделения, такие как firstname lastname, в конкатенированные поля, то есть full_name

Затем выполните поиск по представлению. Вероятно, это упростит поисковый запрос.

Ответ 5

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