Как зайти в Даркнет?!
25th January, 01:11
6
0
Как в tkinter из поля ввода Entry получить значение в одну переменную и обновить строку кнопкой, затем получить ещё одно введённое значение и затем сложить их. Ниже пример кода
21st July, 19:00
895
0
Программа, которая создает фейковые сервера в поиске игровых серверов CS 1.6 Steam
21st March, 17:43
948
0
Очень долго работает Update запрос Oracle
27th January, 09:58
914
0
не могу запустить сервер на tomcat HTTP Status 404 – Not Found
21st January, 18:02
906
0
Где можно найти фрилансера для выполнения поступающих задач, на постоянной основе?
2nd December, 09:48
938
0
Разработка мобильной кроссплатформенной военной игры
16th July, 17:57
1724
0
период по дням
25th October, 10:44
3955
0
Пишу скрипты для BAS только на запросах
16th September, 02:42
3720
0
Некорректный скрипт для закрытия блока
14th April, 18:33
4613
0
прокидывать exception в блоках try-catch JAVA
11th March, 21:11
4381
0
Помогите пожалуйста решить задачи
24th November, 23:53
6086
0
Не понимаю почему не открывается детальное описание продукта
11th November, 11:51
4351
0
Нужно решить задачу по программированию на массивы
27th October, 18:01
4396
0
Метода Крамера С++
23rd October, 11:55
4309
0
помогите решить задачу на C++
22nd October, 17:31
4002
0
Помогите решить задачу на python с codeforces
22nd October, 11:11
4492
0
Python с нуля: полное руководство для начинающих
18th June, 13:58
2599
0
Используйте предложение LIKE в части внутреннего соединения
Могу ли я / должен ли я использовать критерий LIKE как часть внутреннего соединения при построении сохраненного procedure/query? я не уверен, что задаю правильный вопрос, поэтому позвольте мне объяснить.
Я создаю процедуру, которая будет принимать список ключевых слов для поиска в столбце, содержащем текст. Если бы я сидел за пультом, то выполнил бы его именно так:
SELECT Id, Name, Description
FROM dbo.Card
WHERE Description LIKE '%warrior%'
OR
Description LIKE '%fiend%'
OR
Description LIKE '%damage%'
Но трюк, который я немного подхватил, чтобы сделать разбор списка "strongly typed" в хранимой процедуре, заключается в том, чтобы разобрать список в табличную переменную/временную таблицу, преобразовать его в нужный тип и затем выполнить внутреннее соединение с этой таблицей в моем конечном результирующем наборе. Это отлично работает при отправке, скажем, списка целых чисел IDs в процедуру. Я заканчиваю тем, что у меня есть последний запрос, который выглядит следующим образом:
SELECT Id, Name, Description
FROM dbo.Card
INNER JOIN @tblExclusiveCard ON dbo.Card.Id = @tblExclusiveCard.CardId
Я хочу использовать этот трюк со списком строк. Но поскольку я ищу конкретное ключевое слово, я собираюсь использовать предложение LIKE. Поэтому в идеале я думаю, что мой последний запрос будет выглядеть следующим образом:
SELECT Id, Name, Description
FROM dbo.Card
INNER JOIN @tblKeyword ON dbo.Card.Description LIKE '%' + @tblKeyword.Value + '%'
Это possible/recommended?
Есть ли лучший способ сделать что-то подобное?
Причина, по которой я ставлю подстановочные знаки на обоих концах предложения, заключается в том, что в текстах карт используются термины "archfiend", "beast-warrior", "direct-damage" и "battle-damage".
У меня складывается впечатление, что в зависимости от производительности я могу либо использовать указанный запрос, либо использовать полнотекстовый поиск по ключевым словам для выполнения той же задачи?
Кроме того, что сервер делает текстовый индекс для полей, которые я хочу найти в тексте, есть ли что-то еще, что мне нужно сделать?
Ваш первый запрос будет работать, но потребует полного сканирования таблицы, потому что любой индекс в этом столбце будет проигнорирован. Вам также придется сделать некоторые динамические SQL для генерации всех ваших LIKE предложений.
Попробуйте выполнить полнотекстовый поиск, если вы используете сервер SQL, или проверьте одну из реализаций Lucene . Джоэл рассказывал о своем недавнем успехе с ним.
Лично я уже делал это раньше, и это хорошо сработало для меня. Единственные проблемы, которые я мог бы увидеть, это, возможно, проблемы с неиндексированной колонкой, но я думаю, что у вас будет такая же проблема с предложением where.
Мой вам совет - просто посмотрите на планы исполнения между этими двумя. Я уверен, что он будет отличаться, какой из них лучше в зависимости от ситуации, как и все хорошие задачи программирования.
@Dillie-O
Насколько велик этот стол?
Что такое тип данных поля описания?
Если любой из них мал, то полнотекстовый поиск будет излишним.
@Dillie-O
Может быть, не тот ответ, который вы ищете, но я бы выступил за изменение схемы...
предлагаемая схема:
create table name(
nameID identity / int
,name varchar(50))
create table description(
descID identity / int
,desc varchar(50)) --something reasonable and to make the most of it alwase lower case your values
create table nameDescJunc(
nameID int
,descID int)
Это позволит вам использовать индекс без необходимости реализации болта на решение, и сохраняет ваши данные атомарными.
связанный: рекомендуемый дизайн базы данных SQL для тегов или меток
трюк, который я подхватил совсем недавно.
чтобы сделать разбор списка "strongly typed" в
хранимая процедура предназначена для анализа
список в табличную переменную / временную
стол
трюк, который я подхватил совсем недавно. чтобы сделать разбор списка "strongly typed" в хранимая процедура предназначена для анализа список в табличную переменную / временную стол
Я думаю, что вы, возможно, намекаете здесь на то, чтобы поместить ключевые слова для включения в таблицу, а затем использовать реляционное разделение для поиска совпадений (можно также использовать другую таблицу для слов для исключения). Пример работы в SQL см. В разделе Поиск по ключевым словам от Joe Celko .
Производительность будет зависеть от фактического сервера, который вы используете, а также от схемы данных и объема данных. С текущими версиями MS SQL Server этот запрос должен работать просто отлично (MS SQL Server 7.0 имел проблемы с этим синтаксисом, но он был решен в SP2 ).
Вы прогнали этот код через профилировщик? Если производительность достаточно быстра и данные имеют соответствующие индексы на месте, вы должны быть полностью настроены.