Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Поиск 
:(
    Опции темы
dm9
Дата 17.1.2005, 23:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дмитрий Копытин
****


Профиль
Группа: Vingrad developer
Сообщений: 3876
Регистрация: 22.7.2002
Где: Москва

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



Вопрос часто встречается, но почему-то в поиске толком ничего не нашёл.

Нужно осуществить поиск по базе.
Два поля: VARCHAR (255), TEXT.

Оптимален ли будет такой запрос:

SELECT
C.name, C.descr,
MATCH (name, descr) AGAINST ('word1') + MATCH (name, descr) AGAINST ('word2') As R
FROM sites C
WHERE (MATCH (name, descr) AGAINST ('word1')) OR (MATCH (name, descr) AGAINST ('word2'))
ORDER BY R DESC;

Ну, там могут добавиться ещё word3, word4...

Может быть, использовать для этой цели TEMPORARY TABLE, как это описано тут:
Поиск по двум ключам




Также не кинете ссылку или не опишете, как сделать поиск по части слова (а не по всему, как это сделано в моём запросе). Есть что-то быстрее, чем LIKE по каждому слову и затем соединение результатов всех этих запросов?
PM MAIL ICQ   Вверх
Kesh
Дата 17.1.2005, 23:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2488
Регистрация: 31.7.2002
Где: Германия, Saarbrü cken

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



Можно создавать MemotyTable - будет оч. быстро...
Можно индексировать поля поиска... Тогда и Like будет работать быстро...


--------------------
user posted image
PM MAIL WWW ICQ Skype   Вверх
dm9
Дата 18.1.2005, 01:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дмитрий Копытин
****


Профиль
Группа: Vingrad developer
Сообщений: 3876
Регистрация: 22.7.2002
Где: Москва

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



А как индексировать?
Просто CREATE INDEX не применяется к полю TEXT, использовать CREATE FULLTEXT INDEX?

Он LIKE убыстряет?

PM MAIL ICQ   Вверх
Kesh
Дата 18.1.2005, 01:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2488
Регистрация: 31.7.2002
Где: Германия, Saarbrü cken

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



Код

ALTER TABLE `cites` ADD FULLTEXT `fulltxt` (
`descr` (255)
)

Like вроде как должен быстрее работать... Насколько я знаю...
AFAIK LIKE работает с индексированными полями несколько иначе, чем с неидексированными... Ведь индексы в таблице упорядочены... А значит и поиск по ним ведется быстрее...

Это сообщение отредактировал(а) Kesh - 18.1.2005, 01:20


--------------------
user posted image
PM MAIL WWW ICQ Skype   Вверх
dm9
Дата 18.1.2005, 01:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дмитрий Копытин
****


Профиль
Группа: Vingrad developer
Сообщений: 3876
Регистрация: 22.7.2002
Где: Москва

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



1. Расскажи ламеру, что такое (255) у тебя в скобочках?
У меня descr может содержать до неск. килобайт текста.

2. Я смотрю по логике. Если индекс просто упорядочивает строки, то LIKE быстрее раотать не должен. Вот если он не просто по алфивиту их выстраивает, а что-то ещё особенное делает...
Но, в принципе, у меня нагрузка будет не очень большая на базу, так что...
PM MAIL ICQ   Вверх
Kesh
Дата 18.1.2005, 01:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2488
Регистрация: 31.7.2002
Где: Германия, Saarbrü cken

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



Ты же сравниваешь TEXT с varchar(255)... отсюда и длина индекса... другое дело, если ты делаешь полнотекстовый поиск... тут уже 255 не нужно...

Like быстрее работать и не будет... просто для сравнения строки будут выбираться быстрее... т.к. будут упорядочены...


--------------------
user posted image
PM MAIL WWW ICQ Skype   Вверх
dm9
Дата 18.1.2005, 01:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дмитрий Копытин
****


Профиль
Группа: Vingrad developer
Сообщений: 3876
Регистрация: 22.7.2002
Где: Москва

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



Цитата(Kesh @ 18.1.2005, 01:43)
Ты же сравниваешь TEXT с varchar(255)...


Я сравниваю два поля - name varchar (255) и descr text со строкой, которую ввёл пользователь.


Тогда я делаю LIKE по каждому слову и затем слепляю полученные результаты, так?
А нет более-менее нетормознутой возможности посмотреть, сколько раз входит слово в текст? Хочется сделать что-то типа сортировки по релевантности...


Это сообщение отредактировал(а) dm9 - 18.1.2005, 01:55
PM MAIL ICQ   Вверх
Kesh
Дата 18.1.2005, 04:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2488
Регистрация: 31.7.2002
Где: Германия, Saarbrü cken

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



Цитата(dm9 @ 18.1.2005, 01:51)
сортировки по релевантности...

Так ведь MATCH - AGAINST так и работает...


--------------------
user posted image
PM MAIL WWW ICQ Skype   Вверх
dm9
Дата 18.1.2005, 05:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дмитрий Копытин
****


Профиль
Группа: Vingrad developer
Сообщений: 3876
Регистрация: 22.7.2002
Где: Москва

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



Я говорил про LIKE smile

Ладно, я уже сделал некое подобие поиска.

Делаю SELECT ... LIKE по каждому слову и запихиваю данные в промежуточную таблицу (с двумя полями - id и rel - релевантность), причём за попадание слова в name даю два очка, если в descr - одно. Затем SELECT SUM(rel) As rel, ... FROM tmp ... GROUP BY id ORDER BY rel - и я счастлив... по крайней мере, пока база не очень большая.

Это сообщение отредактировал(а) dm9 - 18.1.2005, 05:04
PM MAIL ICQ   Вверх
Kesh
Дата 18.1.2005, 23:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2488
Регистрация: 31.7.2002
Где: Германия, Saarbrü cken

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



http://www.mysql.ru/docs/man/Fulltext_Search.html
Вот здесь рассказано про полнотекстовый поиск... и про релевантность...
Так что похоже ты с самого начала делал правильно... smile

Это сообщение отредактировал(а) Kesh - 18.1.2005, 23:25


--------------------
user posted image
PM MAIL WWW ICQ Skype   Вверх
dm9
Дата 19.1.2005, 01:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дмитрий Копытин
****


Профиль
Группа: Vingrad developer
Сообщений: 3876
Регистрация: 22.7.2002
Где: Москва

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



Я это читал smile

Вот только:

Простой полнотекстовый поиск - только по всему слову целиком. Зато с релевантностью.

IN BOOLEAN MODE - без релевантности. Везде выдаётся единичка. И вариации возможны только в конце слова, начало фиксированное.

Я сейчас сделал так.
Релизовал два поика. Первый - LIKE-ом, второй IN BOOLEAN MODE. Когда начнёт торозить LIKE, надо будет закомментировать одну строчку и поиск теоретически должен работать быстрее.

По-хорошему, тестануть бы это дело на базе этак в несколько тысяч записей... Думаю, чуть позже я это сделаю.
PM MAIL ICQ   Вверх
Kesh
Дата 19.1.2005, 01:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2488
Регистрация: 31.7.2002
Где: Германия, Saarbrü cken

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



dm9ОК, обязательно сообщи результаты...


--------------------
user posted image
PM MAIL WWW ICQ Skype   Вверх
dm9
Дата 19.1.2005, 04:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дмитрий Копытин
****


Профиль
Группа: Vingrad developer
Сообщений: 3876
Регистрация: 22.7.2002
Где: Москва

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



Везде будет приведено время выполнения скрипта. То есть это чуть больше, чем время запроса к БД.
Если это принципиально - машина Athlon 2,26 GHz, ОП - 512 MB.

LIKE проводился по каждому слову по каждому полю (name, descr) отдельно, результаты - в промежуточную таблицу, затем из неё SELECT.

IN BOOLEAN MODE - использовался один запрос вида MATCH (name, descr) AGAINST('word1* word2* word3* и так далее' IN BOOLEAN MODE).
Естественно, вначале был выполнен запрос CREATE FULLTEXT INDEX schidx ON sites (name, descr)

name - 64 байта.
description - 1000 байт.

Записей чуть больше ста (итого размер данных, по которым проводится поиск, около 110 КБ ).
Поиск по 1 слову, встречающемуся почти во всех записях
LIKE: 0.06 - 0.07
IN BOOLEAN MODE: 0.04

Записей чуть больше тысячи (итого размер данных, по которым проводится поиск, около 1,1 МБ ).
Поиск по 1 слову, встречающемуся почти во всех записях
LIKE: 0.20 - 0.28
IN BOOLEAN MODE: 0.16 - 0.22

Записей чуть больше десяти тысяч (итого размер данных, по которым проводится поиск, около 11 МБ ).
Поиск по 1 слову, встречающемуся почти во всех записях
LIKE: 2.0-4.0
IN BOOLEAN MODE: 1.4 - 1.7
Поиск по 2 словам, встречающимся почти во всех записях
LIKE: 3.5-4.0
IN BOOLEAN MODE: 3.3 - 3.4
Поиск по 5 словам, встречающимся почти во всех записях
LIKE: 7.0-8.0
IN BOOLEAN MODE: 4.8 - 5.0
Поиск по 1 слову, НЕ встречающемуся в записях
LIKE: 2.5-3.0
IN BOOLEAN MODE: 0.02 - 0.03

В общем, тенденция понятна, ещё тесты проводить мне в лом.

И ещё. Возможно, что-то можно сделать быстрее, если написать попрямее скрипт...

Это сообщение отредактировал(а) dm9 - 19.1.2005, 04:32
PM MAIL ICQ   Вверх
Kesh
Дата 19.1.2005, 20:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2488
Регистрация: 31.7.2002
Где: Германия, Saarbrü cken

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



Спасибо за инфу...


--------------------
user posted image
PM MAIL WWW ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MySQL | Следующая тема »


 




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


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

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