Поиск SQL Server - PullRequest
       16

Поиск SQL Server

0 голосов
/ 12 октября 2009

Меня попросили собрать поиск по одной из наших баз данных.

Критерий: пользователь вводит в поле поиска, затем SQL нужно разделить все слова в поиске и искать каждое из них по нескольким полям (вероятно, 2 или 3), затем ему нужно взвесить результаты для Например, результат, в котором отображаются все слова, будет лучшим результатом, а если появится только 1 слово, он будет взвешен ниже.

Например, если вы ищете "Это демонстрационный пост"

Результаты будут оцениваться следующим образом

Rank   Field1                 Field2
1:     "This is a demo post"  ""
2:     "demo post"            ""
3:     "demo"                 "post"
4:     "post"                 ""

Надеюсь, что это имеет какой-то смысл, своего рода базовый Google-подобный поиск.

В любом случае, я могу думать, что это очень грязно.

Любые предложения будут великолепны.

Ответы [ 3 ]

0 голосов
/ 12 октября 2009

«Поиск в Google» означает: полнотекстовый поиск. Проверьте это!

В SQL Server 2008 он полностью интегрирован в ядро ​​SQL Server.

До этого это было немного странное дополнение. Еще одна веская причина для обновления до SQL Server 2008! (и SP1 уже вышел!)

Марк

0 голосов
/ 15 октября 2009

Я закончил тем, что создал полнотекстовый индекс для таблицы и соединил свои результаты поиска с FREETEXTTABLE, позволяя мне видеть ранжированное значение каждого результата

SQL в итоге выглядел примерно так

SELECT
    Msgs.RecordId,
    Msgs.Title,
    Msgs.Body
FROM
    [Messages] AS Msgs
    INNER JOIN FREETEXTTABLE([Messages],Title,@SearchText) AS TitleRanks ON Msgs.RecordId = TitleRanks.[Key]        
ORDER BY
    TitleRanks.[Key] DESC

Я использовал полнотекстовые индексы в прошлом, но никогда не понимал, что вы можете использовать FullTextTable таким образом, был очень впечатлен тем, насколько легко было писать код и насколько хорошо он работает.

0 голосов
/ 12 октября 2009

Логически вы можете сделать это достаточно легко, хотя может быть трудно оптимизировать, особенно если кто-то использует особенно длинную фразу.

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

SELECT TOP 100 Score, Forename FROM
(
    SELECT
        CASE
            WHEN Forename LIKE '%Kerry James%' THEN 100
            WHEN Forename LIKE '%Kerry%' AND Forename LIKE '%James%' THEN 75
            WHEN Forename LIKE '%Kerry%' THEN 50
            WHEN Forename LIKE '%James%' THEN 50
        END AS Score,
        Forename
    FROM
        tblPerson
) [Query]
WHERE
    Score > 0
ORDER BY
    Score DESC

В этом примере я говорю, что точное совпадение стоит 100, совпадение с обоими терминами (но не вместе) стоит 75, а совпадение одного слова стоит 50. Вы можете сделать это настолько сложным, как Вы хотите и даже включите совпадения SOUNDEX - но это простой пример, чтобы указать вам правильное направление.

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