Несколько столбцов с ContainsTable и логической логикой с полнотекстовым индексом

StackOverflow https://stackoverflow.com/questions/1801285

  •  05-07-2019
  •  | 
  •  

Вопрос

У меня есть, как мне кажется, очень простой сценарий, но то, что я прочитал, звучит так, как будто это нелегко с использованием полнотекстового каталога и индексов SQL Server.

У меня есть 2 столбца: имя и фамилия. Я хочу поддерживать полнотекстовый поиск по ним, чтобы, если кто-то печатает "John Smith" люди с совпадением и первым и последним появляются первым.

Несмотря на то, что легко создать индекс по нескольким столбцам и легко искать по нескольким столбцам, оценка не отражает несколько столбцов.

SELECT [Key], Rank 
FROM CONTAINSTABLE([User], (FirstName,LastName), '<CLAUSE_HERE>')
<Ол>
  • Если CLAUSE_HERE - это "Джон Смит" Я не получил результатов, потому что эта фраза не существует ни в одном из полей.
  • Если это "Джон ИЛИ Смит" Я получаю всех пользователей с любым именем в любом поле, отсортированных в бесполезном порядке.
  • Если это "Джон И Смит" Я не получаю результатов, потому что ни одно из полей не содержит оба слова.
  • Похоже, что единственное решение состоит в том, чтобы автоматически генерировать запрос, который запускает containstable для каждого поля, выполняет некоторые математические операции, суммирует оценки и т. д. Это звучит правильно? Есть ли более простой способ обойти это? У моего фактического запроса гораздо больше полей - это упрощенный пример.

    Это было полезно?

    Решение

    Создайте вычисляемый столбец , который объединяет поля, которые вы Вы заинтересованы в поиске (таким образом, который имеет смысл для ваших форматов поиска) и полнотекстовом индексе.

    Насколько мне известно, это единственная возможность, если вы хотите сделать полный текст таким образом из-за поведения, которое вы описали в своем вопросе.

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

    Вам нужно было бы проверить это, но мне интересно, сможете ли вы использовать функцию ISABOUT (), чтобы применить вес к каждому ключевому слову. Ваше условие поиска может выглядеть примерно так:

    ISABOUT(john weight(0.2), smith weight(0.8))
    
    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top