Рейтинг полнотекстового поиска (SQL Server) - PullRequest
6 голосов
/ 26 ноября 2008

Последние пару часов я возился со всевозможными вариациями полнотекстового поиска 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;

Таким образом, если я найду 11/05/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 должна иметь наивысший ранг, если смотреть далеко, поскольку строка поиска также совпадает с именем и фамилией. как дата рождения.

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

Ответы [ 4 ]

6 голосов
/ 27 ноября 2008

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

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

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

2 голосов
/ 28 ноября 2008

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

1 голос
/ 02 декабря 2008

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

Фрэнк, вы были правы в том, что AND и OR не идут по столбцам, это было то, чего я сначала не заметил.

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

Моя настоящая строка поиска после преобразования оказалась "Word1 *" И "Word2 *"

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

1 голос
/ 27 ноября 2008

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

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

...