Рейтинг полнотекстового поиска (SQL Server)

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

У меня есть таблица с 5 столбцами + еще, которые не индексируются. Все поля nvarchar.

Я выполняю этот запрос (ну почти .. я перепечатал с другими именами)

SET @SearchString = REPLACE(@Name, ' ', '*" OR "') --Splits words with an OR between
SET @SearchString = '"'+@SearchString+'*"'
print @SearchString;

SELECT ms.ID, ms.Lastname, ms.DateOfBirth, ms.Aka, ms.Key_TBL.RANK, ms.MiddleName, ms.Firstname
FROM View_MemberSearch as ms
INNER JOIN CONTAINSTABLE(View_MemberSearch, (ms.LastName, ms.Firstname, ms.MiddleName, ms.Aka, ms.DateOfBirth), @SearchString) AS KEY_TBL
    ON ms.ID = KEY_TBL.[KEY]
WHERE KEY_TBL.RANK > 0
ORDER BY KEY_TBL.RANK DESC;

Таким образом, если я буду искать 05.11.1964 ДЖОН ДЖЕКСОН, я получу "11.05.1964" ИЛИ "ДЖОН *" ИЛИ "ДЖЕКСОН *" и следующие результаты:

ID -- First Name -- Middle Name -- Last Name -- AKA -- Date of Birth -- SQL Server RANK
----------------------------------------------------------------------------------
1  |  DAVE       |  JOHN        |  MATHIS     | NULL | 11/23/1965    |  192
2  |  MARK       |  JACKSON     |  GREEN      | NULL | 05/29/1998    |  192
3  |  JOHN       |  NULL        |  JACKSON    | NULL | 11/05/1964    |  176
4  |  JOE        |  NULL        |  JACKSON    | NULL | 10/04/1994    |  176

Итак, наконец, мой вопрос. Я не вижу, как строки 1 и 2 ранжируются над строкой 3 и почему строка 3 оценивается так же, как строка 4. Строка 2 должна иметь самый высокий рейтинг, поскольку строка поиска также соответствует имени и фамилии. как Дата рождения.

Если я изменю ИЛИ на И, я не получу никаких результатов.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
6
0
10 111
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Что произойдет, если вы удалите критерии DoB?

Полнотекстовый поиск MS - это действительно черный ящик, который сложно понять и настроить Вы в значительной степени воспринимаете это КАК ЕСТЬ, в отличие от Lucene, который отлично подходит для настройки

Ответ принят как подходящий

Я обнаружил, что предложения AND и OR неприменимы к столбцам. Создайте индексированное представление, объединяющее столбцы, и вы получите лучшие результаты. Посмотрите на мои прошлые вопросы, и вы найдете информацию, которая соответствует вашему сценарию.

Я также обнаружил, что лучше не добавлять "*". Я думал, что будет больше совпадений, но он, как правило, давал худшие результаты (особенно для длинных слов). В качестве компромисса вы можете добавлять * только к более длинным словам.

Пример, который вы приводите, определенно странный.

как слить столбцы и точно использовать? у меня такая же проблема.

zsharp 11.12.2009 09:01

Лучше иметь вычисляемый столбец и полный текстовый индекс по этому столбцу, чем искать по отдельным столбцам?

user636525 23.02.2016 07:52

Это не эквивалент полностью, но, возможно, этот вопрос, который я задал (Практическое руководство: ранжирование результатов поиска), может помочь?

Спасибо вам, ребята.

Фрэнк, вы были правы, что И и ИЛИ не пересекают столбцы, это то, чего я сначала не заметил.

Чтобы получить наилучшие результаты, мне пришлось объединить все 5 столбцов в 1 столбец в представлении. Затем выполните поиск в этом единственном столбце. Это дало мне точные результаты, которые я хотел, без каких-либо дополнений.

Моя фактическая строка поиска после преобразования оказалась «Слово1 *» И «Слово2 *»

Использование знака% по-прежнему не делает того, что, по утверждению msdn, должно делать. Это означает, что если я искал слово josh, и оно было заменено на "Josh%" при поиске, то "Joshua" не было бы найдено. Однако довольно тупой с «Джош *» тогда будет найден Джошуа.

Другие вопросы по теме