[image]

[PHP] Поиск строки

 
RU Алдан-3 #25.11.2005 15:29
+
-
edit
 

Алдан-3

аксакал
★★☆
Пишу "умного" бота для чата.

Застрял на поиске в строке ключевых слов.

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

Но при колличестве ключей больше тысячи это может стать проблеммой.

Есть какое-нибудь альтернативное решение ?

Как-нибудь исхитрится скормить базе всю строку и получить только список совпадающих ключей. :rolleyes:

   
RU Balancer #25.11.2005 15:57  @Алдан-3#25.11.2005 15:29
+
-
edit
 

Balancer

администратор
★★★★★
Алдан-3> Пишу "умного" бота для чата.
Алдан-3> Застрял на поиске в строке ключевых слов.
Алдан-3> Можно конечно просто из базы доставать все ключевые слова и проверять последовательно строку на наличие одного из них.
Алдан-3> Но при колличестве ключей больше тысячи это может стать проблеммой.
Алдан-3> Есть какое-нибудь альтернативное решение ?
Алдан-3> Как-нибудь исхитрится скормить базе всю строку и получить только список совпадающих ключей. :rolleyes: [»]

Тысяча ключей - это совсем не проблема. У моего BaLaBOT'а ключевых фраз 883 + 36 случайных, так ни малейших задержек в переборе не было. Правда, он у меня на perl'е :)
   
+
-
edit
 

Balancer

администратор
★★★★★
Алдан-3> Есть какое-нибудь альтернативное решение ?

Да, а альтернативное решение - разбить фразу на слова, и сделать по ним цикл, извлекая из базы. Вместо тысячи проверок будет несколько (сколько слов в фразе).
   
RU Алдан-3 #25.11.2005 17:05  @Balancer#25.11.2005 16:00
+
-
edit
 

Алдан-3

аксакал
★★☆
Алдан-3>> Есть какое-нибудь альтернативное решение ?
Balancer> Да, а альтернативное решение - разбить фразу на слова, и сделать по ним цикл, извлекая из базы. Вместо тысячи проверок будет несколько (сколько слов в фразе). [»]

Гм... а что лучше десяток запросов к базе или цикл всего на тысячу переборов локально ? А то база у меня удалённая :)

...

Я тут подумал.... набор из кучи LIKE через OR решит всё одним запросом... надо только мусор из строки покилять снала :)
   
+
-
edit
 

Mishka

модератор
★★★
LIKE — очень дорогая операция. В наихудшем случае, она пролопатит всю таблицу.
   
RU Алдан-3 #26.11.2005 15:58
+
-
edit
 

Алдан-3

аксакал
★★☆
Результаты натурных испытаний.

code text
  1. SELECT `bkeys`
  2. FROM `bot`
  3. WHERE $msg LIKE `bkeys`

Ключи приходится оборачивать в % (для LIKE )

Быстрее прямого перебора в три-четыре раза получилось =)

code text
  1. SELECT `bkeys`
  2. FROM `bot`
  3. WHERE $msg RLIKE `bkeys`

Скорость прмерно сопоставима с прямым перебором (± лапоть).
Можно через | добавлять синонимы для ключей и другие фкусности регулярных выражений.

Чем больше вкусностей,тем дольше готовится :)

Это на локальной машине дома.

Думаю на реальном сервере, где БД удалённая, прямой пербор будет ещё медленнее.

Вот... где-то так.

P.S.> Теперь пытаюсь выбрать между вариантом с LIKE и RLIKE ... известный ослик нервно курит в сторонке, на меня глядя :D
   
Это сообщение редактировалось 26.11.2005 в 16:19
+
-
edit
 

Mishka

модератор
★★★
А ты, что, при прямом переборе каждый раз в базу лезешь? Таблица слов считывается один раз в массив и по ней шарится.
   
RU Алдан-3 #27.11.2005 16:41  @Mishka#27.11.2005 01:11
+
-
edit
 

Алдан-3

аксакал
★★☆
Mishka> А ты, что, при прямом переборе каждый раз в базу лезешь? Таблица слов считывается один раз в массив и по ней шарится. [»]

Бот вызывается при использовании команды на которую он реагирует, просто пишет сообщения будущим временем.

Как при таком раскладе "один раз считать таблицу слов в массив" ?

Всё равно при каждом вызове комманды приходится читать слова
   
+
-
edit
 

Mishka

модератор
★★★
Создать постоянно живущий процесс/нить (или на время сессии), через который и будет происходить запрос на поиск ключевых слов. Этот процесс и будет или подчитывать сразу, или по мере надобности — в первыйы проход. Кэш называется. :)
   
RU Алдан-3 #29.11.2005 03:16  @Mishka#27.11.2005 19:32
+
-
edit
 

Алдан-3

аксакал
★★☆
Mishka> Создать постоянно живущий процесс/нить [»]

Демона что-ли ?

Потом, будет постоянный процесс - ему придётся ещё и парсить выводимый текст (он в чате в базу пишется уже отформатированным для вывода, что есть геморой).

А так он работает только с вводимым.

Нет, если бы файл, обрабатывающий комманды, можно было запустить в непрерывное выполнение и не заново запускать, а новые параметры существующему передавать я бы только стчастлив был.

Но как это на РНР реализовать ? :)

   

Mishka

модератор
★★★
Mishka>> Создать постоянно живущий процесс/нить [»]
Алдан-3> Демона что-ли ?

Да почему обязательно демона? Как чат запускается? Небось через html сервер? Если да, то там можно thread запустить.

Алдан-3> Потом, будет постоянный процесс - ему придётся ещё и парсить выводимый текст (он в чате в базу пишется уже отформатированным для вывода, что есть геморой).

Упаси господь. У тебя, что СУБД парсит текст? Ты ему же уже выдаешь пропарсенный текст в виде параметров. Так и здесь — есть API — ты ему подсовываешь массив слов, а он проверяет и выдает назад битовую или байтовую шкалу — если слово не нейдено, то 0, если найдено, то 1. Просто, вместо SQL параметров создаешь массив и передаешь его параметром.

Алдан-3> А так он работает только с вводимым.

Ты никогда не слышал про multi tier?

Алдан-3> Нет, если бы файл, обрабатывающий комманды, можно было запустить в непрерывное выполнение и не заново запускать, а новые параметры существующему передавать я бы только стчастлив был.

Так это и есть отдельный процесс или нить.

Алдан-3> Но как это на РНР реализовать ? :) [»]

А какой у тебя версии PHP?
   
RU Алдан-3 #30.11.2005 12:13
+
-
edit
 

Алдан-3

аксакал
★★☆
Mishka> Как чат запускается? Небось через html сервер?

Гм. Ну да Apache+PHP+MySQL= чат :)

И, собственно говоря, чат не запускается.

Постоянного процесса нет, в смысле.

Просто набор РНРшных страничек, которые дёргаются юзером по мере
необходимости.

Mishka> Если да, то там можно thread запустить.

Э... :unsure:

Mishka> Упаси господь. У тебя, что СУБД парсит текст? Ты ему же уже выдаешь пропарсенный текст в виде параметров. Так и здесь — есть API — ты ему подсовываешь массив слов, а он проверяет и выдает назад битовую или байтовую шкалу — если слово не нейдено, то 0, если найдено, то 1. Просто, вместо SQL параметров создаешь массив и передаешь его параметром.


В базу ложится отформатированный текст: фонты, джабаскрипт, ещё всякий мусор.

При вводе это форматирует скрипт, при выводе просто всё выводится из базы "как есть".

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

Что такое "SQL-параметры" ?

Как параметром передать куда-то массив на тысячи слов ?

Вас не сильно затруднит это продемонстрировать кусочком кода ?

Я вас пока совершенно не понял, если честно. :(


Алдан-3>> А так он работает только с вводимым.
Mishka> Ты никогда не слышал про multi tier?

Нет.

Mishka> А какой у тебя версии PHP?

4.3.11

P.S. Честно говоря проблемма делится на две чати: как сделать, и как сделать правильно :) Первая часть уже решена, теперь меня интересует вторая. На случай если у меня действительно заведётся свой чат :)
   
+
-
edit
 

Mishka

модератор
★★★
Еще пара-тройка вопросов — какой Апач и в каком режиме работает и какая ОС? После выходных может что-то выложу.
   
RU Алдан-3 #02.12.2005 16:46
+
-
edit
 

Алдан-3

аксакал
★★☆
FreeBSD 5.4

Apache 1.3.27

PHP как модуль
   

в начало страницы | новое
 
Поиск
Настройки






Твиттер сайта
Статистика
Рейтинг@Mail.ru
АвиаТОП
 
Яндекс.Метрика
website counter
 
free counters