PostgreSQL

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

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

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

PostgreSQL

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

<<Назад  Вперед>>Страницы: 1 2 3 4 5 ... 10 11 12 13 14 15 16 17 18
Модераторы: aerograf, wsx
Печать
 
-KoT-
Почетный участник


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

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

Ссылка


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

XXXX Pro написал:
[q]
Слушай, а TRIGGER точно должен выполняться до вставки ряда (если я правильно понял, что значит BEFORE), а не после?
[/q]

Да, этим гарантируется заполнение поля fulltext_idx. Если по какой-либо причине транзакция не завершится (например, сбой сервера), отработает rollback и запись вообще не вставится.
-KoT-
Почетный участник


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

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

Ссылка


Дата регистрации на форуме:
26 апр. 2006
Сейчас обнаружил, что при поиске в запросе участвуют обе талицы:
INSERT INTO i_SearchResult (srid,srpid,relevancy) SELECT 23,p_id, rank(fulltext_idx,to_tsquery('трам-пам-пам')) FROM i_Forum f, i_Topic t, i_Post p WHERE (rank(fulltext_idx,to_tsquery('трам-пам-пам))>0) AND (true) AND p_tid=t_id AND t_fid=f_id AND p__premoderate=0   LIMIT 100и, естественно вылетает ошибка "ERROR: ссылка на колонку "fulltext_idx" неоднозначна" Нужно как-нибудь передать в rank() ссылу на таблицу: p.fulltext_idx

При поиске темы таблица только одна — prefix_Topic — ошибка не возникает, поэтому и не заметил сразу
-KoT-
Почетный участник


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

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

Ссылка


Дата регистрации на форуме:
26 апр. 2006
Попробовал добавить еще одну переменную в db_match.
в search.php: ......
$table="p.";
...... ".db_match($table,$modedata,$text,'p.p_text','p.p_title')."......
То же самое в misc.php, только $table="prefix_Topic.";
в pssql.php:function db_match($table,$mode,$text,$col1,$col2="") {
  return "rank(".$table."fulltext_idx,to_tsquery('$text'))";
Вроде работает....
-KoT-
Почетный участник


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

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

Ссылка


Дата регистрации на форуме:
26 апр. 2006
Я дико извиняюсь, давно добавил в функцию db_match  $text=preg_replace("/(?<!^)\s+(?!$)/is","|",$text);но забыл отразить это в форуме. Без этого многословный поиск работать не будет. Слегка модернизировал поиск, в pssql.php вместо function db_match($table,$mode,$text,$col1,$col2="") {
  $text=preg_replace("/(?<!^)\s+(?!$)/is","|",$text);
  return "rank(".$table."fulltext_idx,to_tsquery('$text'))";
добавил две функции:function db_match($table,$mode,$text,$col1,$col2="") {
  $text=preg_replace("/(?<!^)\s+(?!$)/is","|",$text);
  return "rank(".$table."fulltext_idx,to_tsquery('$text'))";
}

function db_match2($table,$mode,$text,$col1,$col2="") {
  $text=preg_replace("/(?<!^)\s+(?!$)/is","|",$text);
  return $table."fulltext_idx @@ to_tsquery('$text') AND rank(".$tab."fulltext_idx,to_tsquery('$text'))";
}
и в search.php: $sql = "INSERT INTO ".... SELECT... ".db_match(...)." FROM "....."WHERE (".db_match2(....).">0) AND....
    $res=db_query($sql,$link);
Теперь поиск работает корректно (раньше многословные запросы иногда давали неожиданный результат). Для MySQL db_match и db_match2 — одна и та же функция.

Если в поле поиска вводить "слово1 слово2 слово3", поиск будет работать по алгоритму "слово1 OR слово2 OR слово3". Если ввести "слово1&слово2&слово3", алгоритм — "слово1 AND слово2 AND слово3".
-KoT-
Почетный участник


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

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

Ссылка


Дата регистрации на форуме:
26 апр. 2006
Шлифуем поиск...
Функции полнотекстового поиска в pssql.php:function db_match($tab,$mode,$text,$col1,$col2="") {
  $text=trim($text);
  $text=preg_replace("/\s*(&amp;)+\s*/is","&",$text);                    //&amp; превращаем обрано в &
  $text=preg_replace("/[&|]{2,}/is","|",$text);        //задвоенные логические операторы превращаем в ИЛИ
  $text=preg_replace("/(\s*([&|])*\s+([&|])*\s*)+/is","|",$text);         //пробелы превращаем в ИЛИ
  return "rank(".$tab."fulltext_idx,to_tsquery('$text'))";
}

function db_match2($tab,$mode,$text,$col1,$col2="") {
  $text=trim($text);
  $text=preg_replace("/\s*(&amp;)+\s*/is","&",$text);
  $text=preg_replace("/[&|]{2,}/is","|",$text);
  $text=preg_replace("/(\s*([&|])*\s+([&|])*\s*)+/is","|",$text);
  return $tab."fulltext_idx @@ to_tsquery('$text') AND rank(".$tab."fulltext_idx,to_tsquery('$text'))";
}



P.S. C большой вероятностью можно утверждать, что теперь IntB подерживает PodtgreSQL
-KoT-
Почетный участник


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

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

Ссылка


Дата регистрации на форуме:
26 апр. 2006
Сразу не обратил внимания, что &amp; преобразовался в амперсанд...
4X_Pro
Руководитель Проекта
Настоящий Компьютерщик
4X_Pro
Откуда: Москва
Всего сообщений: 3299
Рейтинг пользователя: 70


Ссылка


Дата регистрации на форуме:
29 сен. 2001
Исправления внес. Завтра или послезавтра выложу обновление (сейчас просто занят тем, что привожу HTML-код к стандарту HTML 4.01 Transitional).

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


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

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

Ссылка


Дата регистрации на форуме:
26 апр. 2006
Пока не выложил — последний штрих (в переменную $text не всегда попадает &, иногда и &):function db_match($tab,$mode,$text,$col1,$col2="") {
  $text1=trim($text);
  $text1=preg_replace("/\s*(&amp;)*\s*&\s*/is","&",$text1); //&amp; превращаем обрано в &
  $text1=preg_replace("/[&|]{2,}/is","|",$text1);   //задвоенные логические операторы превращаем в ИЛИ
  $text1=preg_replace("/(\s*([&|])*\s+([&|])*\s*)+/is","|",$text1);   //пробелы превращаем в ИЛИ
  return "rank(".$tab."fulltext_idx,to_tsquery('$text1'))";
}

function db_match2($tab,$mode,$text,$col1,$col2="") {
  $text2=trim($text);
  $text2=preg_replace("/\s*(&amp;)*\s*&\s*/is","&",$text2);
  $text2=preg_replace("/[&|]{2,}/is","|",$text2);
  $text2=preg_replace("/(\s*([&|])*\s+([&|])*\s*)+/is","|",$text2);
  return $tab."fulltext_idx @@ to_tsquery('$text') AND rank(".$tab."fulltext_idx,to_tsquery('$text2'))";
}
-KoT-
Почетный участник


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

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

Ссылка


Дата регистрации на форуме:
26 апр. 2006
Блин, не с того файла скопировал, вот правильно (pssql.php):function db_match($tab,$mode,$text,$col1,$col2="") {
  $text1=trim($text);
  $text2=preg_replace("/\s*(&amp;)+\s*/is","&"",$text1); //&amp; превращаем обрано в &
  $text2=preg_replace("/\s*(&)+\s*/is","&",$text1);
  $text1=preg_replace("/[&|]{2,}/is","|",$text1);   //задвоенные логические операторы превращаем в ИЛИ
  $text1=preg_replace("/(\s*([&|])*\s+([&|])*\s*)+/is","|",$text1);   //пробелы превращаем в ИЛИ
  return "rank(".$tab."fulltext_idx,to_tsquery('$text1'))";
}

function db_match2($tab,$mode,$text,$col1,$col2="") {
  $text2=trim($text);
  $text2=preg_replace("/\s*(&amp;)+\s*/is","&",$text2);
  $text2=preg_replace("/\s*(&)+\s*/is","&",$text2);
  $text2=preg_replace("/[&|]{2,}/is","|",$text2);
  $text2=preg_replace("/(\s*([&|])*\s+([&|])*\s*)+/is","|",$text2);
  return $tab."fulltext_idx @@ to_tsquery('$text') AND rank(".$tab."fulltext_idx,to_tsquery('$text2'))";
}
-KoT-
Почетный участник


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

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

Ссылка


Дата регистрации на форуме:
26 апр. 2006
Спать, однако, пора... Предыдущий пост еще раз отредактирован...
<<Назад  Вперед>>Страницы: 1 2 3 4 5 ... 10 11 12 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.0315. Количество выполненных запросов: 17, время выполнения запросов 0.0000
Creative Commons License Rambler's Top100 Rambler's Top100 Рейтинг@Mail.ru Valid HTML 4.01 Transitional Valid CSS!