|
Волшебнику: поиск на форуме по теме без учета регистра... | ☑ | ||
|---|---|---|---|---|
|
0
valich
21.05.04
✎
02:00
|
Наткнулся тут на старую тему за номером 400 а вернее на пост номер 8...
ТехИнфо: Сделан поиск по форуму (версия 1.0) Попробовал потестить, вроде как не работает, хотя может я обглючился... С другой стороны режим поиска через Яndex решает эту проблему, и возможно вопрос исчерпан... Жаль я тогда ее пропустил :-( А вдруг это еще актуально? В общем, если я не ошибаюсь, сегодня наверное ни один SQL-сервер (РБД) не делает такой поиск с применением индекса. Почему я так уверен? Не будут же они хранить в индексе все варианты разности регистров для поля, это слишком накладно. Так что конструкция типа LIKE отпадает, она всегда работает по "PLAN NATURAL". С другой стороны в MySQL есть вариант с применением регулярных выражений, но это встроенная функция сервера, и как любая функция она "по-умолчанию" перебирает всю таблицу... Тут я бы попробовал обойти это ограничение следующим образом, хотя вариант и не совсем оптимальный в смысле требований к ресурсам. - Делаем еще одно поле в таблице с теми же параметрами. - В него будем параллельно заносить значение первого поля, только переведя его в верхний регистр. - Делаем по этому "искусственному" полю индекс. - А поисковое значение перед поисковым запросом переводим тоже в верхний регистр. Способ конечно не ахти, размер таблицы, да и "лишняя" PHP-обработка будет при вводе... Но с другой стороны получаем оптимизированный способ поиска... Не знаю, стал ли бы я применять это на форуме, тут ресурсы со всех сторон ограничены. Но, мне кажется, это единственный возможный способ. P.S.: Так на всякий случай, вдруг ты еще хочешь свой поиск использовать. Хотя Яндексу надо отдать должное, сильно работает. Сам скоро проектик буду сдавать, обязательно использую... |
|||
|
1
Волшебник
21.05.04
✎
02:09
|
Прочитал, начал думать. :)
Размер базы увеличится не сильно, что-то около 500К. По времени тоже замедление не почувствуется. Наверное, надо делать. |
|||
|
2
valich
21.05.04
✎
08:48
|
С утра на свежую голову :-)
Что-то не сходится... тебе ведь подстроку искать надо, а в Ibase LIKE по любому не использует индексы... Счас проверю... |
|||
|
3
romix
21.05.04
✎
09:43
|
В MySQL в настройках вроде есть таблица перекодировки и таблица перевода в верхний регистр. То есть все это уже зашито в ядро (а иначе никак и нельзя).
|
|||
|
4
romix
21.05.04
✎
09:47
|
Кстати, поиском невозможно пользоваться - я могу искать СВОИ ПОСЛЕДНИЕ ветки?
(или ветки где есть мои посты). |
|||
|
5
valich
21.05.04
✎
10:28
|
(3) Очень возможно...
(1) В общем верно, и MySQL и Firebird при использовании поиска по шаблону (LIKE) использует индекс только если первый символ шаблона указывается явно... Regexp на моей машине в любом случае не использует индекс. Так что мой первый вариант актуален только при поиске подстроки начиная с первого символа поля. К сожалению других возможностей я не нашел :-( |
|||
|
6
valich
21.05.04
✎
11:06
|
Есть правда еще один момент в MySQL, но сначала вопросик... Ты используешь для поиска функцию Match? Вроде как она решает эту задачу...
|
|||
|
8
Волшебник
21.05.04
✎
12:17
|
(6) При полнотекстовом поиске используется MATCH (col1) AGAINST (str)
|
|||
|
9
Волшебник
21.05.04
✎
12:18
|
(6) Но полнотекстовый поиск возможен только для строковых полей неограниченной длины, а поле для заголовка темы ограничено. Пока другого варианта, кроме как введения специального поля для поиска, я не вижу.
|
|||
|
10
valich
21.05.04
✎
12:37
|
(9) У меня есть закачка мануала по MySQL, правда довольно старенькая, на русском. Так там к этой функции MATCH примерчик дан:
mysql> CREATE TABLE articles ( id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, title VARCHAR(200), body TEXT, FULLTEXT (title,body) ); И запрос: mysql> SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('database'); Я попробовал, правда у меня не все так скоро, я консолью пользуюсь... У меня есть одно поле varchar(100) в табличке. В общем работает. На версии 4.0.12 |
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |