2015-09-29 1 views
0

Предположим, что есть стол с колоннами (UserID, FieldID, Value), с полмиллиона записей. Я хочу посмотреть, есть ли какой-либо поисковый термин T (N) где-нибудь в каждом Value (т. Е. Value.Contains(T(N))).Самый быстрый способ поиска столбца таблицы SQL Server (или индексированного представления) с "like"% search% '"?

Я думаю, что я просто нажимаю на стену тома, слишком много значений для просеивания. Я не думаю, что индекс Full Text поможет, потому что он полезен только для StartsWith запросов, которые смотрят на отдельные слова, а не на записи в любом месте строки.

Есть ли хороший подход к индексированию такого типа данных для такого поиска в SQL Server?

+0

Какое «значение»? Просто несколько слов, длинный текст? – Shnugo

ответ

0

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

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

Другой вариант для томов этого небольшого размера, если вам нужен только базовый поиск «содержит»: создайте еще две таблицы: ключевые слова и keyword_index (или что-то еще). При сохранении, токенизации текстового содержимого и выписывании любых новых ключевых слов в таблицу ключевых слов, а затем добавьте данные в таблицу соединений. Индексируйте все, а затем выполните поиск с таблицы ключевых слов, присоединившись к мастеру через промежуточную таблицу keyword_index.

Это довольно хаки, и получение ключевого слова, на которое действительно набирается (для стебля и т. Д.), Может быть болью. Это разумное быстрое решение & для небольших потребностей.

+0

Значения в среднем 7 символов с минимальной длиной 1 и максимальной длиной 88. Я решил реализовать 2-уровневый обратный индекс пар символов, который будет указывать на соответствующие записи (он будет фактически поддерживать глубину N-уровней). Есть 1311126 пар символов (заполнение с пробелом в конце каждого значения), но только 1,242 * уникальных * пар. Sqrt (1242) ~ 36, поэтому в среднем около 36 уникальных символов. Мне удалось реализовать такой индекс только с одним классом и примерно с 50 строками кода, что позволяет быстро выполнять поиск. Ура. – Triynko

+0

@Triynko - звучит как хороший подход и индекс пары символов, если я правильно представляю реализацию (или примерно так), чтобы устранить некоторые проблемы из подхода большого индекса большого грунта, о котором я упомянул в качестве второго варианта. –

Смежные вопросы