PostgreSQL

Intellect Board — cистема управления сайтом

Построение сайта на основе форума

Intellect Board — cистема управления сайтом »   Техническая поддержка версии 2.18 »   PostgreSQL
RSS

PostgreSQL

Текущий рейтинг темы: Нет
Выводить сообщения
Правила раздела

<<Назад  Вперед>>Страницы: 1 2 3 4 5 6 7 ... 13 14 15 16 17 18
Модераторы: aerograf, wsx
Печать
 
4X_Pro
Руководитель Проекта
Настоящий Компьютерщик
4X_Pro
Откуда: Москва
Всего сообщений: 3299
Рейтинг пользователя: 70


Ссылка


Дата регистрации на форуме:
29 сен. 2001
В итоге я написал вот так:
  if (preg_match("/\s*?INSERT\s+?INTO\s+?(\w+?)\s+?SET\s+?(.*)/is",$query,$match)) {
    preg_match_all("/([\w\d]+)\s*=\s*(\".*(?<!\\\)\"\")/is",$match[2],$fields1);
    preg_match_all("/([\w\d]+)\s*=\s*(\d+)/is",$match[2],$fields2);
    $fnames=join(",",array_merge($fields1[1],$fields2[1]));
    $fdata=join(",",array_merge($fields1[2],$fields2[2]));
    $query="INSERT INTO ".$match[1]." (".$fnames.") VALUES (".$fdata.")";
  }

Вроде бы работает. Завтра доработаю запросы на создание таблиц, и выложу все это дело. А то, как выяснилось, в PostgreSQL в добавок ко всему еще и индексы создавать внутри CREATE TABLE нельзя, как это в MySQL делалось...

---
Спорить со мной по поводу того, что в IntB будет, а чего нет -- бесполезно!
-KoT-
Почетный участник


Откуда: Красноярский край
Всего сообщений: 153
Рейтинг пользователя: 6

Репутация пользователя: 1

Ссылка


Дата регистрации на форуме:
26 апр. 2006
И кроме всего прочего, есть различия в типах данных:
мускульному BLOB примерно соответсвтует тип BYTEA,
наиболее близким к TINYINT (однобайтовое целое) является SMALLINT (двухбайтовое целое), но предпочтительне использовать INT (INTEGER),
BOOL и BIT в MySQL не соответствуют таким же в PostgreSQL
Это то, что всмоинилось навскидку, есть и еще различия — нужно в доки заглянуть...

Еще вспомнил — в Постгри есть типы SERIAL и BIGSERIAL - аналог INT (BIGINT) с флагом AUTOINCREMENT
4X_Pro
Руководитель Проекта
Настоящий Компьютерщик
4X_Pro
Откуда: Москва
Всего сообщений: 3299
Рейтинг пользователя: 70


Ссылка


Дата регистрации на форуме:
29 сен. 2001
Да, как оказалось, "не все так просто, как на самом деле". Вопрос такой: есть ли в Postgres FULLTEXT-поиск и как он делается? И как создаются FULLTEXT-индексы?

---
Спорить со мной по поводу того, что в IntB будет, а чего нет -- бесполезно!
-KoT-
Почетный участник


Откуда: Красноярский край
Всего сообщений: 153
Рейтинг пользователя: 6

Репутация пользователя: 1

Ссылка


Дата регистрации на форуме:
26 апр. 2006
В PostgreSQL мощный и гибкий полнотекстовый поиск с возмоностью подключения словарей, но реализуется в корне отличным то MySQL способом, индексов типа мускульного FULLTEXT, в Постгри не существует. Full-text-поиск обеспечивает модуль contrib/tsearch2, для поиска используются тополнительные поля типа tsvector.
Например, создание таблицы prefix_Post, для полнотекстового поиска добаляется еще одно поле (fulltext_idx) типа tsvector:


  CREATE TABLE prefix_Post (
  p_id SERIAL,
.....
  p_text TEXT NOT NULL,
.....
  p_title VARCHAR(64) NOT NULL,
.....
  fulltext_idx tsvector,
  PRIMARY KEY(p_id)
);
  

  UPDATE prefix_Post SET fulltext_idx = to_tsvector('default',coalesce(p_text,'') ||' '|| coalesce(p_title,''));

  VACUUM FULL ANALYZE prefix_Post;

  CREATE INDEX idx_fulltext_idx ON prefix_Post USING gist(fulltext_idx);

Автозаполнение этого поля можно обеспечить разными способами, на мой взгляд, самый удобный — через триггер:

  CREATE TRIGGER tg_fulltext_prefix_Post
  BEFORE UPDATE OR INSERT ON prefix_Post
  FOR EACH ROW EXECUTE PROCEDURE
    tsearch2(fulltext_idx, p_text, p_title);

Поисковый запрос будет выглядеть примерно так:

  SELECT p_id, p_text FROM prefix_Post
          WHERE fulltext_idx @@  to_tsquery('слово1 & слово2 & слово3 ...');


P.S. Разумеется, модуль tsearch2 к моменту создания таблиц должен быть подключен к базе.
wsx
Модератор форума

wsx
Всего сообщений: 256
Рейтинг пользователя: 12

Репутация пользователя: 2

Ссылка


Дата регистрации на форуме:
14 янв. 2005
Хотелось бы отметить, дабы воизбежать путаницы, что SERIAL, BIGSERIAL и их наследники - являются не ТИПАМИ, а АлиАсами к INTEGER, но с небольшим "триггером", который создаёт требуемую секвенцию.

---
Не всё так просто, как на самом деле!
-KoT-
Почетный участник


Откуда: Красноярский край
Всего сообщений: 153
Рейтинг пользователя: 6

Репутация пользователя: 1

Ссылка


Дата регистрации на форуме:
26 апр. 2006

wsx написал:
[q]
SERIAL, BIGSERIAL и их наследники - являются не ТИПАМИ, а АлиАсами к INTEGER, но с небольшим "триггером", который создаёт требуемую секвенцию.
[/q]

С точки зрения администратора БД - совершенно верно, но с точки зрения пользователя БД - это самый обыкновенный, кстати декларированный в описании, тип.
Оффтопик: Дабы воизбежать путаницы \":)\", триггера не создается - создается sequense, при этом SERIAL эквивалентен типу INT со значением DEFAULT nextval('имя_sequense')


XXXX Pro
Поковырялся с русским поиском... В связи с тем, что не всегда возможно изменять конфигурацию 'default', поиск по словоформам может быть недоступен (но по абсолютно точному совпадению с шаблоном работать будет).
В таком случае триггер не нужен, для автозаполнения поля типа tsvector после каждого INSERT'а добавлять запрос:
UPDATE prefix_Post set fulltext_idx = to_tsvector('default_russian',coalesce(p_text,'') ||' '|| coalesce(p_title,'')) WHERE p_id=currval('prefix_Post_p_id_seq');
Такой запрос вернет документы с подсвеченными найденными словами, отсортированные по релевантности:
SELECT headline(p_text, to_tsquery('default_russian', 'слово1 & слово2')),
                 rank(fulltext_idx, to_tsquery('default_russian', 'слово1 & слово2')) as rank
FROM prefix_Post WHERE fulltext_idx @@ to_tsquery('default_russian','слово1 & слово2') order by rank desc;

wsx
Модератор форума

wsx
Всего сообщений: 256
Рейтинг пользователя: 12

Репутация пользователя: 2

Ссылка


Дата регистрации на форуме:
14 янв. 2005
-KoT- имелось ввиду то, что сам по себе алиас является триггером, который и создаёт например id INTEGER default nextval(sequence&#180\";)\" и саму секвенцию.

Как отдельный ТИП - это имхо выносить не стоит, точнее не корректно, думаю это больше наследование от типа INTEGER. Хотя пофиг, главное суть ясна.

---
Не всё так просто, как на самом деле!
-KoT-
Почетный участник


Откуда: Красноярский край
Всего сообщений: 153
Рейтинг пользователя: 6

Репутация пользователя: 1

Ссылка


Дата регистрации на форуме:
26 апр. 2006
Оффтопик: wsx Согласен полностью


Вариант с трггером,однако, предпочтительней, только при коннекте к базе нужно устанавливать конфигурацию 'derfault_russian', сразу после коннекта:

SET client_encoding='win1251'  // на случай, если PHP5 работает с PostgreSQL так же,как и с MySQL
SELECT set_curcfg('default_russian')

В этом случае в поисковых запросах конфигурацию можно вообще не указывать:

SELECT headline(p_text, to_tsquery('слово1 & слово2')),
      rank(fulltext_idx, to_tsquery('слово1 & слово2')) as rank
      FROM prefix_Post WHERE fulltext_idx @@ to_tsquery('слово1 & слово2') order by rank desc;
-KoT-
Почетный участник


Откуда: Красноярский край
Всего сообщений: 153
Рейтинг пользователя: 6

Репутация пользователя: 1

Ссылка


Дата регистрации на форуме:
26 апр. 2006
В итоге создание таблицы prefix_Post:
  CREATE TABLE prefix_Post (
  p_id SERIAL,
.....
  fulltext_idx tsvector,
  PRIMARY KEY(p_id)
);
  CREATE INDEX ....
......
  CREATE INDEX idx_fulltext_idx ON prefix_Post USING gist(fulltext_idx);
  VACUUM FULL ANALYZE prefix_Post;

  CREATE TRIGGER tg_fulltext_prefix_Post  BEFORE UPDATE OR INSERT ON prefix_Post
  FOR EACH ROW EXECUTE PROCEDURE  tsearch2(fulltext_idx, p_text, p_title);

P.S. Все проверялось клиентами psql и EMS PostgreSQL Manager, как будет работать с php — не знаю...
4X_Pro
Руководитель Проекта
Настоящий Компьютерщик
4X_Pro
Откуда: Москва
Всего сообщений: 3299
Рейтинг пользователя: 70


Ссылка


Дата регистрации на форуме:
29 сен. 2001
По идее, запросы от клиента зависеть не должны...
Вопрос: а как быть с запросами вот такого вида:
SELECT u.*, ln.*, st.*, u__pmcount AS pmcount, u__warnings AS uw_count FROM( ib_User AS u, ib_Language AS ln, ib_StyleSet AS st )LEFT JOIN ib_LastVisit lv ON (lv.fid=0 AND lv.uid=u.u_id) WHERE ln.ln_id=u.u_lnid AND st.st_id=u.u_stid

PostgreSQL начинает ругаться на то, что таблицы из FROM( в )LEFT JOIN использовать нельзя:

ERROR: invalid reference to FROM-clause entry for table "u"
ПОДСКАЗКА: There is an entry for table "u", but it cannot be referenced from this part of the query.

---
Спорить со мной по поводу того, что в IntB будет, а чего нет -- бесполезно!
<<Назад  Вперед>>Страницы: 1 2 3 4 5 6 7 ... 13 14 15 16 17 18
Модераторы: aerograf, wsx
Печать
Intellect Board — cистема управления сайтом »   Техническая поддержка версии 2.18 »   PostgreSQL
RSS

1 посетитель просмотрел эту тему за последние 10 минут
В том числе: 1 гость, 0 скрытых пользователей

Последние RSS
Ограничение доступа
не отображаются разделы
Архив версий
Установка стиля на Intellect Board 2.22
Завершилась работа над новой версией 3.00

Самые активные 5 тем RSS


Время выполнения скрипта: 0.0378. Количество выполненных запросов: 18, время выполнения запросов 0.0000
Creative Commons License Rambler's Top100 Rambler's Top100 Рейтинг@Mail.ru Valid HTML 4.01 Transitional Valid CSS!