ну кстати fulltext search не такой уж и быстрый. на 110 к записей поиск по часто встречающемуся слову(23к. раз) занимает примерно секунду(или даже больше — точно не помню уже). Это только count.
машинка:
athlon xp 1700+
512 ram ddr
mysql 3.23.58 d-max-nt under windows xp sp 2 beta
я придумал немного другое решение. но оно пока еще «сыровато». смысл такой:
1. все фразы разбиваем на слова(выкидываем предлоги и прочую муть).
2. записываем в таблицу(примерную структуру я описал выше).
3. создаем индекс(обычный) на поле со словом.
4. ищем только запросами типа like "kwrds%".
допустим было:
sonyericsson t620 se
pid pword
1 sonyericsson
1 t620
1 se
запрос будет такой:
Код:
SELECT count( * )
FROM price_word
as pw1
inner join price_word
as pw2
on pw1.pid = pw2.pid
inner join price_word
as pw3
on pw2.pid = pw3.pid
where pw1.pwword
like "sony%"
and pw2.pwword
like "se%"
and pw3.pwword
like "t630%"
идея примерно такая. что делать дальше — пока хз.
нужно сделать вот еще что:
каждое слово должно иметь n-представлений, где n=(wordlen-(minSearchWordLen)-1).
пример:
sonyericsson
onyericsson
nyericsson
yericsson
ricsson
icsson
sson
при minSearchWordLen = 4
поиск идет очень быстро, но конечно, если текста очень много данный вариант не пройдет
хотя последнее можно на любителя, т.к. мало кто не способен написать первые три-четрые буквы того, что ищет.
p.s. все вышесказанное относится конечно к специфическому(моему) случаю, когда нужно осуществлять поиск по базе с товарами(по большей части техника).
это был поиск в пределах одной записи(прайс-листа).
а как сделать поиск типа or — еще проще:
Код:
SELECT count( * )
FROM price_word
as pw1
where pw1.pwword
like "nok%"
or pw1.pwword
like "sam%"
у меня поулчается 45к.
но в новой таблице запрос выполняется за:
0.09 sec.
а в старой(это если хранить запись прайс-листа целиком), и тогда запрос будет:
Код:
SELECT count( * )
FROM price_word
as pw1
where pw1.pwword
like "%nok%"
or pw1.pwword
like "%sam%"
время выполнения:
0.27-0.30 sec.
т.е. в 3 раза медленее!