|
Contains не ищет подстроку
|
|||
---|---|---|---|
#18+
В базе MSSQL в колонке Name есть значение ООО ПАО Азимут. Его необходимо найти по маске ООО зим. Я использую полнотекстовый поиск в MSSQL через команду Contains. Вот мой пример, но он не находит: SELECT * FROM Companies WHERE (Contains((Name), '"ооо*" AND "зим*"')) ORDER BY Id OFFSET 0 ROWS FETCH NEXT 50 ROWS ONLY ... |
|||
:
Нравится:
Не нравится:
|
|||
09.02.2020, 09:17 |
|
Contains не ищет подстроку
|
|||
---|---|---|---|
#18+
RusNafisovich, Азим* найдёте, у вас же слово не начинается с зим* ... |
|||
:
Нравится:
Не нравится:
|
|||
09.02.2020, 12:07 |
|
Contains не ищет подстроку
|
|||
---|---|---|---|
#18+
Владислав Колосов RusNafisovich, Азим* найдёте, у вас же слово не начинается с зим* https://docs.microsoft.com/ru-ru/sql/t-sql/queries/contains-transact-sql?view=sql-server-ver15 <prefix_term> Указывает совпадение слов или фраз, начинающихся с указанного текста. Префиксные выражения должны заключаться в двойные кавычки (""), и необходимо добавлять звездочку (*) перед закрывающей кавычкой, чтобы совпадал весь текст, начинающийся с простого выражения, заданного до звездочки. Предложение должно быть задано таким образом: CONTAINS (column, '"text*"'). Звездочка заменяет ноль, один или более символов (корневого слова или слов в слове или фразе). Если текст и звездочка не заключены в двойные кавычки и предикат выглядит как CONTAINS (column, 'text*'), то полнотекстовый поиск считает звездочку символом и ищет точное совпадение с text*. Полнотекстовое ядро не найдет слов со звездочкой (*), так как средства разбиения по словам обычно пропускают такие символы. Если параметр <prefix_term> является фразой, то каждое содержащееся во фразе слово считается отдельным префиксом. Этому запросу, задающему префиксное выражение «local wine*», отвечают все строки с текстом «local winery», «locally wined and dined» и т. д. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.02.2020, 13:15 |
|
Contains не ищет подстроку
|
|||
---|---|---|---|
#18+
Владислав Колосов RusNafisovich, Азим* найдёте, у вас же слово не начинается с зим* С этим согласен ... |
|||
:
Нравится:
Не нравится:
|
|||
09.02.2020, 13:21 |
|
Contains не ищет подстроку
|
|||
---|---|---|---|
#18+
court, да, ТС или опечатался или полагает, что "полнотекстный" означает "поиск любой подстроки". ... |
|||
:
Нравится:
Не нравится:
|
|||
09.02.2020, 13:51 |
|
Contains не ищет подстроку
|
|||
---|---|---|---|
#18+
Владислав Колосов, Да, я не опечатался. даже если значение лежит +79998887766, то я хочу найти по маске 7766, но он у меня не найдет. Каким образом еще можно найти эти строки в рамках MSSQL и без like, так как эти такую подстроку будет искать в 100К записей, то это займет более 5-10 секунд. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.02.2020, 07:03 |
|
Contains не ищет подстроку
|
|||
---|---|---|---|
#18+
RusNafisovich, https://habr.com/ru/company/microsoft/blog/470139/ ... |
|||
:
Нравится:
Не нравится:
|
|||
10.02.2020, 07:58 |
|
Contains не ищет подстроку
|
|||
---|---|---|---|
#18+
Massa52 RusNafisovich, https://habr.com/ru/company/microsoft/blog/470139/ Но часто бывает нужно искать произвольные подстроки, возможно, у RusNafisovich именно так. Тогда спасёт только вариант самодельного полнотекстового поиска имени Дмитрия Костылева: Что делать, когда Full-Text бессилен На SQL.RU есть копия, обсуждалось здесь: Настройка полнотекстового поиска на большой таблице (~2 млрд) ... |
|||
:
Нравится:
Не нравится:
|
|||
10.02.2020, 08:15 |
|
Contains не ищет подстроку
|
|||
---|---|---|---|
#18+
alexeyvg, Решение Костылева - хорошее решение. Я вот подсчитал... В таблице TableA в поле FieldA хранится значение: +79998887766 Разбиваем на значения: - 79998887766, 9998887766, 998887766, 98887766, 8887766, 887766, 87766, 7766, 766, 66, 6 Итог: за записью "+79998887766" в таблице TableА будет закреплено 11 записей в таблице TableB для поиска . Если нужно делать поиск по 4 полям в TableA, то в среднем 11 записей * 4 поля = 44 записей в таблице B. На текущий момент 100К записей = ~90Мб. Короче, грубо но если будет отдельная таблица, по которой будет выполняться поиск увеличится в 44 раза. Я правильно понимаю? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.02.2020, 08:56 |
|
Contains не ищет подстроку
|
|||
---|---|---|---|
#18+
RusNafisovich Короче, грубо но если будет отдельная таблица, по которой будет выполняться поиск увеличится в 44 раза. Я правильно понимаю? Тогда да, будет такой оверхед на хранение - 90 мегабайт. Конечно, если база 120 Мб/ то это много, а если база 10 Гб, то что такое 90 Мб? Но зато будет моментальная выборка по фрагменту слова. Конечно, если набор слов неуникален, то справочник будет меньше. Во сколько раз - посчитайте по вашим данным. Понятно, что если бы микрософтовский FTS искал, как вы хотите, то размер справочника был бы ещё больше, правильно? Вы же ожидали, что он ищет по произвольному фрагменту? Значит, вы знали, что придётся сделать справочник такого размера (только оно будет сделано "само", внутри FTS) Альтернатива - делать скан. Других вариантов же нет, просто чисто теоретически, исходя из математических законов, никакой первейший гений программирования не сможет сделать по другому. Либо размер, либо скорость. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.02.2020, 11:22 |
|
Contains не ищет подстроку
|
|||
---|---|---|---|
#18+
RusNafisovich, Сомневаюсь, что время поиска сильно увеличится. Вы будете искать в словаре и получите ID записей, в которых содержится найденная подстрока. Вот подготовка словаря будет занимать время, возможно, это выгодно делать каким-то фоновым процессом для добавленных в основную таблицу записей. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.02.2020, 11:22 |
|
Contains не ищет подстроку
|
|||
---|---|---|---|
#18+
Владислав Колосов RusNafisovich, Сомневаюсь, что время поиска сильно увеличится. Понятно, что скорость тут получится независимая от размера, как у любого индекса. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.02.2020, 11:31 |
|
Contains не ищет подстроку
|
|||
---|---|---|---|
#18+
alexeyvg, если размер - то да. Иногда надо пожертвовать объемом хранения, чтобы выиграть в скорости получения. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.02.2020, 11:39 |
|
Contains не ищет подстроку
|
|||
---|---|---|---|
#18+
Спасибо за идею. Применил такое решение. Пока делаю) О результатах отпишусь ... |
|||
:
Нравится:
Не нравится:
|
|||
10.02.2020, 15:56 |
|
|
start [/forum/topic.php?fid=46&fpage=69&tid=1686478]: |
0ms |
get settings: |
9ms |
get forum list: |
16ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
32ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
56ms |
get tp. blocked users: |
2ms |
others: | 332ms |
total: | 471ms |
0 / 0 |