Сведения о вопросе

Sadijon

03:11, 3rd August, 2020

Теги

SQL Сервер Полнотекстового Поиска

Просмотров: 474   Ответов: 5

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

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

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

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

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

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

Если пользователь вводит имя, например 'Fry', он возвращает строку 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;  
....

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



  Сведения об ответе

ITSME

17:49, 15th August, 2020

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

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

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

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

'Phil' ищет именно то слово 'Phil'. 'Phil*' ищет каждое слово, которое начинается с 'Phil'


  Сведения об ответе

screen

06:08, 19th August, 2020

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

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

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


  Сведения об ответе

lourence

05:41, 9th August, 2020

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

....
@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 псевдонимов и столбец notes, а также.

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


  Сведения об ответе

PROGA

09:27, 4th August, 2020

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

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

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


  Сведения об ответе

PROGA

22:39, 8th August, 2020

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


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться