все-таки решил испробовать задумку с хранением не только отдельных слов, но и частей слов.
вот что получилось:
реальный запрос, поиск телефона Samsung d500(точнее подсчет предложений в базе по этому телефону(чтобы было посложнее, я добавил побольше ключевых слов).
Код:
SELECT count(distinct sci.str_cat_itm_ID) as cnt FROM store_pword as sw0 inner join store_pword as sw1 on sw0.str_cat_itm_ID = sw1.str_cat_itm_ID inner join store_pword as sw2 on sw1.str_cat_itm_ID = sw2.str_cat_itm_ID inner join store_pword as sw3 on sw2.str_cat_itm_ID = sw3.str_cat_itm_ID inner join store_category_item as sci on sw0.str_cat_itm_ID = sci.str_cat_itm_ID inner join store_category as sc on sci.str_cat_ID = sc.str_cat_ID where sc.str_cat_END_DATE>=1112712382 and sw0.str_PWORD like 'sung%' and sw1.str_PWORD like 'd500%' and sw2.str_PWORD like 'sgh%'
время выполнения запроса:
0.14 sec.(запрос помещен в файл и вызывается из консоли).
результат: 1000 записей.
теперь аналогичный запрос, но поиск обычным like:
Код:
SELECT count(sci.str_cat_itm_ID) as cnt FROM store_category_item as sci inner join store_category as sc on sci.str_cat_ID = sc.str_cat_ID where sc.str_cat_END_DATE>=1112712382 and sci.str_cat_itm_TITLE like '%sung%' and sci.str_cat_itm_TITLE like '%d500%' and sci.str_cat_itm_TITLE like '%sgh%'
время выполнения запроса:
0.25-0.27 sec.
результат: 1000 записей.
размеры таблиц:
store_category_item: 110.000
store_pword: 657.000
размер минимальной словоформы - 4 символа, т.е. в поиске я еще не ввел это ограничение, но ввел его при индексации, т.е. например:
если слово меньше или равно 4, то мы вносим его как есть в таблицу store_pword, если больше 4, тогда:
Код:
if ($wordLen >= 3)
{
for($i=0;$i<$wordLen-3;$i++)
{
//insert
substr($titleWord,$i);
}
}
p.s.
есть еще идея попробовать полнотекстный поиск по такой таблице и сравнить его с like, но думаю именно такой like будет быстрее.
кстати, кто может сказать, что лучше:
хранить текст в одной записи, типа:
это большой кусок текста (text)
или хранить его типа:
это (varchar)
большой
кусок
текста
при том, что используется полнотекстный индекс и поиск?