|
FAQ: обработка строк и парсинг текстов средствами MySQL
|
|||
---|---|---|---|
#18+
ну вот ... прошло 2 года с тех пор как занялся прсингом текстов силами Мускуля ... предлагаю организовать ФАК по работе с текстами и особенностях применения Locate(), Replace(), Find_in_set(), Substring_index() и прочих прелестей... Для начала: Запрос "разбивка текстового поля на слова по пробелу" (первые 10 слов): Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.
При необходимости можно заменить пробел чем-то другим - просто заменив вхождения его в обе функции как строки-разделителя. При необходимости можно создать отдельную табличку с чиселками и джойниться к ней и находить и большее количество слов или джойнить две таких группы для поиска до сотни слов или три для поиска до тысячи слов или ... :) Недостаток запроса - он выдает всегда то количество слов, скока цифирек сджойнено, и, если слов меньше - тупо повторяет последнее слово... как "поправить" - предлагаю дополнить после выделения темы. ... продолжение "типовых" запросов по текстовой обработке для начинающих - привествуется. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.11.2014, 18:01 |
|
FAQ: обработка строк и парсинг текстов средствами MySQL
|
|||
---|---|---|---|
#18+
Arhat109, да, хороший вариант. Он уже представлен по ссылке прямо в предыдушем посте 13640230 , там показан полный пример со джоинтом и сравнение с другими способами решения. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.11.2014, 18:12 |
|
FAQ: обработка строк и парсинг текстов средствами MySQL
|
|||
---|---|---|---|
#18+
Arhat109ну вот ... прошло 2 года с тех пор как занялся прсингом текстов силами Мускуля ... предлагаю организовать ФАК по работе с текстами и особенностях применения Locate(), Replace(), Find_in_set(), Substring_index() и прочих прелестей...В целом я только за! Возьметесь написать стартовый пост? P.S. Хотя сам парсинг силами MySQL мне кажется весьма неэффективным по скорости и ресурсам. Arhat109Недостаток запроса - он выдает всегда то количество слов, скока цифирек сджойнено, и, если слов меньше - тупо повторяет последнее слово... как "поправить" - предлагаю дополнить после выделения темы.А если в конец строки добить 9 пробелов? Arhat109... продолжение "типовых" запросов по текстовой обработке для начинающих - привествуется. 15921841 годится? буквально вчера было... ... |
|||
:
Нравится:
Не нравится:
|
|||
26.11.2014, 18:13 |
|
FAQ: обработка строк и парсинг текстов средствами MySQL
|
|||
---|---|---|---|
#18+
javajdbc, ну ... ваш запрос оригинален (снимаю шляпу :) ) и кажется вполне рабочим, но как понимаю применим к конкретной задаче хранения листьев в деревьях всеж-таки (как не надо делать). Я имел ввиду общую обработку текстов силами Мускуля. Например, часто требуется найти "похожие" строки, по алгоритму, отличному от full text search ... и народ часто решает вопрос путем выкачки данных в приложение и ваяет циклы на ЯП (С, PHP, кто на чем горазд). На самом деле, часто обработка внутри Мускуля может оказаться даже быстрее. Недостаток один - это как правило запросы типа "выверни моск наизнанку"... вот поэтому и предлагаю вынести и прикрепить в отдельной теме. Задолбало за 2 года разыскивать в своем коде эти чудесатые подходы, типа как запрос, что привел выше. Озадачился что тут нет такого фака, поскольку потерял свой запрос по разбивке товарной строки на слова, по заданному набору разделителей ("по или", а не одному!) из вспомогательной таблички с поиском полученных слов в словаре Зализняка и получением результата в виде: порядок, слово, часть_речи (если найдена). :) ... |
|||
:
Нравится:
Не нравится:
|
|||
26.11.2014, 18:45 |
|
FAQ: обработка строк и парсинг текстов средствами MySQL
|
|||
---|---|---|---|
#18+
miksoft, Предлагаю вынести мой пост в отдельный ФАК "для начала", а потом усложнять запрос постепенно до вменяемого результата. :) Вряд ли сподоблюсь написать целую статью ... ни умею. :) Я делал ограничение через переменные: как только "предыдущее" слово равно "новому" - значит "кончились". :) ... |
|||
:
Нравится:
Не нравится:
|
|||
26.11.2014, 18:57 |
|
FAQ: обработка строк и парсинг текстов средствами MySQL
|
|||
---|---|---|---|
#18+
Arhat109словарь ЗализнякаИз одного этого только словосочетания нужно сделать, как минимум, отдельный пост. А то и топик! :) ... |
|||
:
Нравится:
Не нравится:
|
|||
26.11.2014, 18:59 |
|
FAQ: обработка строк и парсинг текстов средствами MySQL
|
|||
---|---|---|---|
#18+
Arhat109Я делал ограничение через переменные: как только "предыдущее" слово равно "новому" - значит "кончились". :)А если по факту будут одинаковые слова? Да еще в середине строки? (У меня реально встречается, что одно слово в наименовании товара встречается даже трижды). ... |
|||
:
Нравится:
Не нравится:
|
|||
26.11.2014, 19:02 |
|
FAQ: обработка строк и парсинг текстов средствами MySQL
|
|||
---|---|---|---|
#18+
Arhat109Предлагаю вынести мой пост в отдельный ФАК "для начала", а потом усложнять запрос постепенно до вменяемого результата. :)Выделил. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.11.2014, 19:12 |
|
FAQ: обработка строк и парсинг текстов средствами MySQL
|
|||
---|---|---|---|
#18+
miksoft, Упс. Не было такого... да, тогда это работать будет некорректно: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22.
точнее он отдаст все одинаковые слова ровно по одному разу... :) ... |
|||
:
Нравится:
Не нравится:
|
|||
26.11.2014, 19:32 |
|
FAQ: обработка строк и парсинг текстов средствами MySQL
|
|||
---|---|---|---|
#18+
Arhat109, уточнение: "все одинаковые слова, стоящие подряд". Если они перемежаются другими словами, то выдаст "как надо". :) ... |
|||
:
Нравится:
Не нравится:
|
|||
26.11.2014, 19:36 |
|
FAQ: обработка строк и парсинг текстов средствами MySQL
|
|||
---|---|---|---|
#18+
Arhat109точнее он отдаст все одинаковые слова ровно по одному разу... :)Еще точнее - сократит одинаковые слова, идущие подряд в порядке чисел в результате подзапроса tmp, который внезапно может измениться, особенно если использовать настоящую таблицу. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.11.2014, 19:39 |
|
FAQ: обработка строк и парсинг текстов средствами MySQL
|
|||
---|---|---|---|
#18+
Arhat109Arhat109, уточнение: "все одинаковые слова, стоящие подряд". Если они перемежаются другими словами, то выдаст "как надо". :)я опоздал с уточнением :) ... |
|||
:
Нравится:
Не нравится:
|
|||
26.11.2014, 19:39 |
|
FAQ: обработка строк и парсинг текстов средствами MySQL
|
|||
---|---|---|---|
#18+
Вот такой вариант неожиданно, но работает верно (MySql 5.1.67? не помню какой стоит...) Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
, хотя "по идее" должен глотать последнее слово... ... |
|||
:
Нравится:
Не нравится:
|
|||
26.11.2014, 20:23 |
|
FAQ: обработка строк и парсинг текстов средствами MySQL
|
|||
---|---|---|---|
#18+
Разобрался. Работает верно, потому что блок проверки WHERE обрабатывается ранее блока выборки SELECT в силу оптимизации выполнения запроса. Логично, но не уверен что можно рекомендовать в ФАК. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.11.2014, 06:50 |
|
FAQ: обработка строк и парсинг текстов средствами MySQL
|
|||
---|---|---|---|
#18+
Arhat109Разобрался. Работает верно, потому что блок проверки WHERE обрабатывается ранее блока выборки SELECT в силу оптимизации выполнения запроса. Логично, но не уверен что можно рекомендовать в ФАК. ...это извесное правило: применение переменных в WHERE категорически запрешено всем кроме Бочкова. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.11.2014, 07:10 |
|
FAQ: обработка строк и парсинг текстов средствами MySQL
|
|||
---|---|---|---|
#18+
javajdbc, использовать можно. Изменять нельзя. :) Продолжаем. Наткнулся на вот это обсуждение: 16690327 по вопросу построения "сочинителя сказок" силами Мускуля, как понял задачу. Думаю дать ссылку тут - будет полезно. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.11.2014, 08:39 |
|
FAQ: обработка строк и парсинг текстов средствами MySQL
|
|||
---|---|---|---|
#18+
Задача2: обрезать последнее слово в строке: TRIM(TRAILING SUBSTRING_INDEX(#string#, #pattern#, -1) FROM #string#) обсуждение тут: 15548673 ... |
|||
:
Нравится:
Не нравится:
|
|||
27.11.2014, 09:11 |
|
FAQ: обработка строк и парсинг текстов средствами MySQL
|
|||
---|---|---|---|
#18+
miksoftArhat109словарь ЗализнякаИз одного этого только словосочетания нужно сделать, как минимум, отдельный пост. А то и топик! :) нашел. Начало было тут: 13369064 ... |
|||
:
Нравится:
Не нравится:
|
|||
27.11.2014, 09:51 |
|
FAQ: обработка строк и парсинг текстов средствами MySQL
|
|||
---|---|---|---|
#18+
Продолжаем сбор "полезностей" по работе с текстами. Нашел вот это: Есть таблица с полем `name`. В поле хранятся записи вида А. Пупкин, А. В. Бубликов и т.д. Проблема в том, что сортировать их нужно по фамилии, а потом по инициалам. Хранить имя, отчество и фамилию в разных полях или в другом порядке - не вариант, нужно работать с полем такого вида. В результате непродолжительных раздумий, родил запрос вида Код: sql 1.
Взято тут 12800557 ... |
|||
:
Нравится:
Не нравится:
|
|||
27.11.2014, 10:13 |
|
FAQ: обработка строк и парсинг текстов средствами MySQL
|
|||
---|---|---|---|
#18+
Arhat109javajdbc, использовать можно. Изменять нельзя. :) В обшем виде -- НЕЛЬЗЯ. Попробуем классифицировать контекстЫ для переменных. Нужна стабильность и предсказуемость. 1-1. Стабильно. Порядок вычисления внутри функций: Например, LEAST(A, B, C) всегда вычисляется слева направо. 1-2. Стабильно. Порядок вычисления строчек в SELECT блоке при наличии ORDER BY и отсутствии GROUP BY. Если есть ГРОУП БУ то надо вынести ORDER BY в окружной селект. 2. Недокументировано, но стабильно. Порядок вычисления полей в SELECT блоке. Т.е. SELECT A, B, C FROM... вычисляет A, B, C в указаном порядке. Стандарты СКЛ и MYSQL документация никак не прописывают порядок. Однако я не видел ни одного отрицательного примера. Параноикам советуется использование способа (1-1) вместо (2). 3-1. Нестабильно. порядок выполнения вычислений в WHERE и JOIN ON блоке. В литературе в ЯВНОМ виде показано как ломаются вычисления с переменными. Из-за того что порядок зависит от плана. Из-за того что план зависит от статистики, индексов и фазы луны. 3-2. Нестабильно. Использовать переменные в SELЕCT и WHERE блоках одновремено. Во-первых (3), во вторых даже если в WHERE только читать переменную, все равно не доказан строгий ход вычислений между двумя блоками. В целом -- мускл переменные -- полезная но капризная штука. Попытки использования переменных в "нестабильном" контексте приводит к "нестабильным" результатам. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.11.2014, 17:44 |
|
FAQ: обработка строк и парсинг текстов средствами MySQL
|
|||
---|---|---|---|
#18+
javajdbc, согласен. В целом, переменные в запросе - это не совсем скуль где-то даже... но, многое что можно сделать в части парсинга текстов - без них, увы силами "чистого sql", возможно и не решаемо совсем. В частности, разбивка строки на слова не по пробелу или другому одиночному символу, а по заданному набору разделителей - как? Пример: Альб д/рис,40л.,картон-А4,"Алые Паруса" надо получить: Альб -- вид товара д/рис -- подвид товара 40л. -- параметр "количество листов" картон -- параметр "материал обложки" А4 -- параметр "формат" "Алые Паруса" -- параметр "картинка на обложке" Разделители: пробел, запятая, тире. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.11.2014, 19:27 |
|
FAQ: обработка строк и парсинг текстов средствами MySQL
|
|||
---|---|---|---|
#18+
Arhat109, Ну с разделителями -- достаточно просто : свести все разделители к одному путем нескольких замен -- пробел на запятую, точку на запятую.... а потом разбивать по запятой как мы уже знаем... ... |
|||
:
Нравится:
Не нравится:
|
|||
27.11.2014, 19:38 |
|
FAQ: обработка строк и парсинг текстов средствами MySQL
|
|||
---|---|---|---|
#18+
javajdbc, Можно. Предположим что список разделителей лежит в табличке. Запрос, который делает замену в строке одной таблички по набору записей образцов из другой - приведете? (потом усложню задачу) :) ... |
|||
:
Нравится:
Не нравится:
|
|||
28.11.2014, 08:14 |
|
FAQ: обработка строк и парсинг текстов средствами MySQL
|
|||
---|---|---|---|
#18+
Arhat109, все одинаковые слова, стоящие подряд". Если они перемежаются другими словами, то выдаст "как надо". :) ... |
|||
:
Нравится:
Не нравится:
|
|||
17.03.2016, 23:39 |
|
FAQ: обработка строк и парсинг текстов средствами MySQL
|
|||
---|---|---|---|
#18+
Arhat109, этот весь топик - извращение какое-то, разбирать текст надо не на SQL, для этого полно средств от строковых функций и регулярных выражений до компиляторов и их генераторов. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.03.2016, 08:55 |
|
|
start [/forum/topic.php?fid=47&fpage=8&tid=1828040]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
74ms |
get topic data: |
14ms |
get forum data: |
3ms |
get page messages: |
61ms |
get tp. blocked users: |
2ms |
others: | 233ms |
total: | 418ms |
0 / 0 |