Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [БД] поиск внутри строки, с поддержкой индексов 
V
    Опции темы
patap
Дата 11.5.2011, 15:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 893
Регистрация: 7.5.2005
Где: Украина, Зп

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



В общем будет на сайт добавляться категории. Также будет поиск по этим категориям.
Пока еще ничего не делал. На начальной стадии разработки решил позаботиться о дальнейшей производительности и гибкости поиска.

Вот что надумал:

будет две таблицы
Код

[groups] (будет хранить полное название категории, и всякие опции к ней)
id
name


Код

[separate] (эту таблицу сделал для того, чтобы можно было использовать индексы при поиске внутри строки)
id
group_id
content


Алгоритм работы:
при добавлении новой категрии - заносим ее сначала в таблицу groups
затем разбиваем и заносим в таблицу separate, по такому принцыпу:

(1, 1, 'привет как твои дела'),
(2, 1, 'как твои дела'),
(3, 1, 'твои дела'),
(4, 1, 'дела'),

запрос для поиска
Код

SELECT * FROM groups
JOIN separate ON separate.group_id = groups.id
WHERE separate.content LIKE 'вася%'




как думаете - нормальный вариант? или можно как-то по другому. В общем рад любой критике и советам



Код

-- phpMyAdmin SQL Dump
-- version 3.3.2deb1
-- http://www.phpmyadmin.net
--
-- Хост: localhost
-- Время создания: Май 11 2011 г., 14:45
-- Версия сервера: 5.1.41
-- Версия PHP: 5.3.2-1ubuntu4.9

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";


/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;

--
-- База данных: `humor`
--

-- --------------------------------------------------------

--
-- Структура таблицы `groups`
--

CREATE TABLE IF NOT EXISTS `groups` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(256) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=4 ;

--
-- Дамп данных таблицы `groups`
--

INSERT INTO `groups` (`id`, `name`) VALUES
(1, 'привет как твои дела'),
(2, 'особый привет, вася'),
(3, 'вася был особо опасен');

-- --------------------------------------------------------

--
-- Структура таблицы `separate`
--

CREATE TABLE IF NOT EXISTS `separate` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `group_id` int(11) NOT NULL,
  `content` varchar(45) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=12 ;

--
-- Дамп данных таблицы `separate`
--

INSERT INTO `separate` (`id`, `group_id`, `content`) VALUES
(1, 1, 'привет как твои дела'),
(2, 1, 'как твои дела'),
(3, 1, 'твои дела'),
(4, 1, 'дела'),
(5, 2, 'особый привет вася'),
(6, 2, 'привет вася'),
(7, 2, 'вася'),
(8, 3, 'вася был особо опасен'),
(9, 3, 'был особо опасен'),
(10, 3, 'особо опасен'),
(11, 3, 'опасен');



--------------------
На боку кобура болталась, сзади шашка отцовская звякала. 
Впереди меня все хохотало, а позади все плакало (с)
PM MAIL ICQ   Вверх
ksnk
Дата 11.5.2011, 15:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

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



а fulltext index не тем-же самым занимается? Вроде он именно по словам может быстро искать?
К тому-же непонятно, с чего хранить имено фразы, а не слова. Так бы и полный индекс можно было иметь, без like'а  smile 


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
patap
Дата 12.5.2011, 09:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 893
Регистрация: 7.5.2005
Где: Украина, Зп

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



ksnk, блин, когда-то помню слыхал про fulltext, но я так и не нашел времени разобраться, так оно и забылось.
Действительно - это то что нужно, и мудрить ничего не надо.

достойный совет!  smile 

Цитата(ksnk @  11.5.2011,  14:46 Найти цитируемый пост)
К тому-же непонятно, с чего хранить имено фразы, а не слова.

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

WHERE separate.content LIKE 'твои дела%'

(1, 1, 'привет как твои дела'),
(2, 1, 'как твои дела'),
(3, 1, 'твои дела'),
(4, 1, 'дела'),


--------------------
На боку кобура болталась, сзади шашка отцовская звякала. 
Впереди меня все хохотало, а позади все плакало (с)
PM MAIL ICQ   Вверх
srt
Дата 9.6.2011, 12:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



мысль про разделение правильная, просто не везде применимая
в твоём случае нужно просто писать = а не LIKE
и всё будет очень шустро работать
имхо

Это сообщение отредактировал(а) srt - 9.6.2011, 13:58
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Базы Данных | Следующая тема »


 




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


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

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