olegy123 писал(а):"*" - любые буквы..
Строка (для наглядности).
- Код: Выделить всё
Тюль красная с цветами на кольцах высота 2,5м [УльтраКолор]
Так я ищу, только через LIKE
- Код: Выделить всё
SELECT * FROM table where UPPER(text) LIKE UPPER('%тюль%');
Могу искать и так:
- Код: Выделить всё
SELECT * FROM table where UPPER(text) LIKE UPPER('%Тюль%высота%2,5м%');
Это не проблема, проблема в том, что запрос
- Код: Выделить всё
SELECT * FROM table where UPPER(text) LIKE UPPER('%Тюль%с%цветами%красная%');
не даст результата.
Это задача, которую я пытаюсь решить.
Возникла идея (все одно LIKE заставляет сервер перебирать все записи) написать UDF модуль для FireBird, который будет реализовывать один из алгоритмов нечеткого поиска (расстояние Левенштейна, шинглы и т.п.), если разорбаться с построением нужного индекса в БД и научиться его использовать, то может получиться не сильно медленнее, чем LIKE (так как LIKE %text%, если верить руководству по языку FireBird - не использует индексы).
Но прежде хотелось бы услышать кто как ищет, если это не тайна конечно
Добавлено спустя 3 минуты 4 секунды:Vadim писал(а):Ещё можно присобачить полнотекстный индекс. В FB по умолчанию его нету, а вот в RedBase он уже подключён в комплекте.
Читал, там он на Lucene основан. Имхо громоздко как-то - еще и Java машину тащить с собой. Чай не корпоративный сервер, а всего-лишь небольшая утилитка для личного пользования.
Добавлено спустя 5 минут 4 секунды:Мне не нужна морфология и прочие плюшки. На данном этапе мне нужно лишь искать слова в разнобой.
Добавлено спустя 2 минуты 28 секунд:Для полноценного поиска соответствий я думаю о модуле UDF (ибо меня очень устраивал (кроме скорости) алгоритм шинглов). Но не хотелось бы использовать такое ресурсоемкое решение для обычного поиска. Возможно, что я чего-то недопонимаю в SQL и поиск с перестановкой слов можно организовать малой кровью.