На самом деле запрашивает
SELECT [...] CONTAINS ([...], '"6662211 *"') - ничего не получает
против 'Call only at weekends +7-999-666-22-11'
и
SELECT [...] CONTAINS (Name, '"zimuth *"') - ничего не получает
против 'PJSC Azimuth'
делает работает как положено .
См. Термин префикса . Поскольку 6662211*
не является префиксом из +7-999-666-22-11
, а zimuth*
не является префиксом из Azimuth
Что касается
SELECT [...] СОДЕРЖИТ ([...], '"sm s@gmail.com*"') - строка не получается
Это, вероятно, из-за разбиения по словам, как всегда учится в комментариях. См. разбиение по словам
Я не думаю, что полнотекстовый поиск применим для вашей задачи.
Зачем использовать FTS в тех же задачах, что и оператор LIKE используется для? Если бы был лучший тип индекса для запросов LIKE ... тогда был бы лучший тип индекса , а не совершенно другая технология и синтаксис.
И это никоим образом не поможет вам соответствовать "6662211*"
против "666 некоторый произвольный символ 22 * 1053 * некоторый произвольный символ 11".
Полнотекстовый поиск не относится к регулярным выражениям (и "6662211*"
даже не является правильным выражением для работы - ничего не говорится о части "некоторого произвольного символа") речь идет о синонимах, словоформах и т. д. c.
Но возможно ли вообще эффективно искать подстроки?
Да, это так. Оставляя в стороне такие перспективы, как написание вашей собственной поисковой системы, что мы можем сделать в SQL
?
Прежде всего - это крайне важно для очистки ваших данных! Если вы хотите вернуть пользователям точные введенные строки
, пользователи могут указать контактные данные в произвольной форме
... вы можете сохранить их как есть. ... и оставьте их вместе.
Затем вам нужно извлечь данных из текста произвольной формы (это не так сложно для электронной почты и телефонных номеров) и сохранить данные в некоторой канонической форме. Для электронной почты единственное, что вам действительно нужно сделать - сделать их все строчными или прописными (не имеет значения), а затем разделить их на @
. Но в телефонных номерах нужно оставлять только цифры
(... И тогда вы даже можете хранить их как номера . Это может сэкономить вам место и время. Но поиск будет другое ... А пока давайте углубимся в более простое и универсальное решение с использованием строк.)
В качестве MatthewBaker , упомянутом , вы можете создать таблицу суффиксов. Тогда вы можете искать вот так:
SELECT DISTINCT * FROM NewCompanies JOIN Sufficies ON NewCompanies.Id = Sufficies.Id WHERE Sufficies.sufficies LIKE 'some text%'
Подстановочный знак %
следует ставить только в конце . В противном случае в таблице суффиксов не будет никакой пользы.
Давайте возьмем, например, номер телефона
+ 7-999-666-22-11
После того, как мы избавимся от ненужных символов, в нем будет 11 цифр. Это означает, что нам понадобится 11 суффиксов для одного телефонного номера
1
11
211
2211
62211
662211
6662211
96662211
996662211
9996662211
79996662211
Таким образом, сложность пространства для этого решения линейна ... не так уж и плохо, я бы сказал ... Но подождите это сложность в количестве записей. Но в символах ... нам нужно N(N+1)/2
символов для хранения всех суффиксов - это квадратичная c сложность ... не хорошо ... но если у вас сейчас 100 000
записей и у вас нет планов на миллионы в ближайшее будущее - вы можете go с этим решением.
Можем ли мы уменьшить сложность пространства?
Я только опишу идею, реализация которой потребует некоторых усилий. И, вероятно, нам нужно пересечь границы SQL
Допустим, у вас есть 2 строки в NewCompanies
и 2 строки текста произвольной формы:
aaaaa
11111
Как большой должен быть стол Suffixes? Очевидно, нам нужны только 2 записи.
Давайте рассмотрим другой пример. Также 2 строки, 2 строки свободного текста для поиска. Но теперь это:
aa11aa
cc11cc
Давайте посмотрим, сколько суффиксов нам нужно сейчас:
a // no need, LIKE `a%` will match against 'aa' and 'a11aa' and 'aa11aa'
aa // no need, LIKE `aa%` will match against 'aa11aa'
1aa
11aa
a11aa
aa11aa
c // no need, LIKE `c%` will match against 'cc' and 'c11cc' and 'cc11cc'
cc // no need, LIKE `cc%` will match against 'cc11cc'
1cc
11cc
c11cc
cc11cc
Не так плохо, но и не так хорошо.
Что еще мы можем сделать?
Допустим, пользователь вводит "c11"
в поле поиска. Тогда LIKE 'c11%'
требуется суффикс ' c11 cc' для успеха. Но если вместо поиска "c11"
мы сначала ищем "c%"
, затем "c1%"
и так далее? Первый поиск даст только одну строку из NewCompanies
. И не было бы необходимости в последующих поисках. И мы можем
1aa // drop this as well, because LIKE '1%' matches '11aa'
11aa
a11aa // drop this as well, because LIKE 'a%' matches 'aa11aa'
aa11aa
1cc // same here
11cc
c11cc // same here
cc11cc
, и в итоге мы имеем только 4 суффикса
11aa
aa11aa
11cc
cc11cc
Я не могу сказать, какова будет сложность пространства в этом случае, но такое чувство, что быть приемлемым.