Показать сообщение отдельно
Старый 04.04.2005, 18:19     # 5
Sheryld
Full Member
 
Регистрация: 29.05.2002
Сообщения: 544

Sheryld Луч света в тёмном царствеSheryld Луч света в тёмном царствеSheryld Луч света в тёмном царствеSheryld Луч света в тёмном царствеSheryld Луч света в тёмном царстве
ну кстати 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 раза медленее!
__________________
убрано по просьбе администратора

Последний раз редактировалось Sheryld; 04.04.2005 в 17:52.
Sheryld вне форума