Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вопрос по индексации 
:(
    Опции темы
Ccoder
Дата 19.4.2012, 13:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 188
Регистрация: 15.2.2011

Репутация: нет
Всего: нет



У меня есть код поиска
Дата может быть введена не полной, например 12 день либо 12:00. И имя с фамилией вводятся в одной ячейке и "могут вводится абы как" (для удобства пользователя всё)
Код
        sessionFactory.getCurrentSession().createQuery(
                "FROM Visit a "+            
                "WHERE lower(a.specialist.name||' '||a.specialist.surname) LIKE lower('%namE3% %surname3%') "+
                "AND TO_CHAR(a.timestamp) LIKE '%2012.05.30 14:00%'").
                list();


он рабочий, всё хорошо показывает, только боюсь что при большой базе дынных будет тормозить.
Думаю что это можно улучшить при помощи индексации, только не знаю как точно
Можете ктонибудь объяснить как это дело делается
PM MAIL   Вверх
lazycat
Дата 19.4.2012, 13:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 227
Регистрация: 15.7.2007

Репутация: нет
Всего: 1



Цитата(Ccoder @ 19.4.2012,  13:49)

Думаю что это можно улучшить при помощи индексации ...  

Если у Вас значение для LIKE начинается с %, то никакой индекс не поможет.

Это сообщение отредактировал(а) lazycat - 19.4.2012, 13:54
PM MAIL   Вверх
Ccoder
Дата 19.4.2012, 14:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 188
Регистрация: 15.2.2011

Репутация: нет
Всего: нет



А реально-ли сделать индекс на TO_CHAR(a.timestamp)
чтобы при запросе брались заранее подсчитанные значения TO_CHAR(a.timestamp).
Другими словами не вводить столбец TO_CHAR(a.timestamp) в таблицу где будет хранится заранее подсчитанные значения TO_CHAR(a.timestamp)?
PM MAIL   Вверх
0x00
Дата 2.5.2012, 15:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 192
Регистрация: 3.4.2006

Репутация: нет
Всего: нет



для начала на больших объемах данных будет тормозить в первую очередь Lower/Upper, построй индекс lower(<поле>)
сталкивался с подобной проблемой на ~70 млн. записей (порядка 5 столбцов для поиска) СУБД - ORACLE

Код

CREATE INDEX YOU_IDX ON VISIT (LOWER(NAME), LOWER(SURNAME));


также можеш подготовить мат. представления для набора данных, в котором ищеш, и периодически эти представления обновлять

Это сообщение отредактировал(а) 0x00 - 2.5.2012, 15:37
PM MAIL   Вверх
chief39
Дата 3.7.2012, 14:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


карманная тигра
***


Профиль
Группа: Участник Клуба
Сообщений: 1631
Регистрация: 20.5.2005
Где: Киев

Репутация: 11
Всего: 77



Насколько я вчитался, могу предложить сделать так:

Если фамилия и имя для поиска вбиваются четко, просто в разном порядке(но мы умеем их переставить в нужный) и с неопределенным регистром, то можно попробовать хэш.
То есть брать lastname и firstname, ставить в нужном порядке, оба загонять в lovercase(), по каждому из них брать String.hashcode(), потом делать общий хэшкод(в идее сгенерить, например по двум этим стринг полям). Полученный числовой хэш хранить в отдельном инт поле, которое проиндексировать.
Эту функцию хешкода можно повесить на саму энтити, но обзывать не hashcode(), так как оно выполняет частную функцию.

Во время поиска вычислять хэш из условия поиска и отдавать его в запрос. Резалтсет будет вылетать моментально, просто надо быть готовым к тому что там может быть несколько строк, но их уже банальным перебором с прямым сравнением недолго перебрать. А оракл оно разгрузит прилично.

ЗЫ: оракл ничего знать не должен, все хеширование должно проводиться одним и тем же методом наверху, иначе хэшфункции оракла и джава кода могут в любой момент разъехаться и будет гемор.

Или реализовать это все с помощью function-based индекса где сделать то же самое (lovercase, concat, hash) и на поиск отдавать тоже через эти функции.


ЗЗЫ: Если в фамилиях допскаются опечатки (Сафронов-Софронов) - сделать или поискать словарик буквозамен. А-О, Ы-И. Все буквы заменяются через словарик, из Сафронова, Софронова и Сафранова получается Софронов и его-то мы хешируем.
То есть с т.з. хэша в БД у нас лежат только Софроновы мы их всех находим и потом уже наверху разбираемся кто Сафронов, а кто Софронов.
Если словарик будет реализован коряво - будут нюансы. Если не учитывает всех вариантов - может пропускать записи. Для поисковиков канает, для бухгалтерии - нихт :(


ЗЗЗЫ: Если могут вбивать "софр", "офро", "онов" - тогда ничего не попишешь :(
Хотя, посмотри на полнотекстовые индексы, я их в продакшне не пользовал, но подозреваю ;)


--------------------
Люди - это свечи. Они либо горят, либо их - в жопу!(с)

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.0700 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.