|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
20.06.2011, 20:37 | #1 |
Форумчанин
Регистрация: 20.02.2010
Сообщений: 229
|
одна из функций для поиск
Вообщем есть функция которая разбивает строку
PHP код:
и когда строка проходит explode не всегда верно разбивка происходит. ну что то вроде слово1:слово2 и после чего соответствие по такому слову где-то искать будет не правильно. Что привело меня к регулярным выражениям. Но с паттерном вот что-то никак не совладаю. Нужно найти как то паттерне эти символы, и если нашел то опять explode.
думай как баг, действуй как баг, и ты найдешь баг )
|
22.06.2011, 13:04 | #2 |
Форумчанин
Регистрация: 03.05.2011
Сообщений: 158
|
Что-то не понятно, что именно вы хотите сделать.
Вы хотите или НЕ хотите, что бы строка разбивалась, если там есть кавычки (какие-бы-то-ни-было) ? Если вы хотите разбить строку любым знаком из набора к примеру {",',:,`,<space>}, то гораздо проще было бы просто заменить их всех пробелами (воспользуйтесь $t=strtr($t,'\'":`',' '); ) а потом разбить всю строку по пробелам $words = explode(" ",$name);. Если же вы НЕ хотите этого делать в присутствии кавычек - детекте кавычки if ($name[0]==$name[strlen($name)-1] && in_array($name[0],array('\'','"','`'))) и не разбивайте строку в этом случае. Последний раз редактировалось graymaster; 22.06.2011 в 13:24. |
24.06.2011, 11:44 | #3 |
Форумчанин
Регистрация: 20.02.2010
Сообщений: 229
|
Да действительно проще заменить их все пробелами! Спасибо!
Но тут возникла еще одна проблема, после разбивки строки на слова. Мне нужно съездить в базу и посмотреть где совпадают строки по 1 до 3х слов чтоб не было дублирования в базе. Может есть какой фокус в sql запросах который позволяет делать то то подобное. А то у меня сейчас забираются все записи из тбалицы, так же разбиваются и сравниваются с пословно с той что пришла. но это сильно трудоемко при учете что база растет на записей 150 в год и одновременных стро для проверки может быть довольно много (появляются чтением xml файла).
думай как баг, действуй как баг, и ты найдешь баг )
|
26.06.2011, 13:53 | #4 |
Форумчанин
Регистрация: 03.05.2011
Сообщений: 158
|
Можно, конечно, задействовать LIKE и т.п. (в стиле SELECT * FROM THE_TABLE WHERE ARTICLE_TEXT LIKE ' %word1% ' AND ARTICLE_TEXT LIKE ' %word2% '), но это будет всего лишь перекладывание работы с httpd на mysql. Если работы реально много, то это не окажет сильного влияния. Можно ещё full-text индексацию добавить (даже нужно, на самом деле).
Но это всё меркнет по сравнения со скоростью обработки LIKE запросов. Это очень медленно. Если, конечно, у вас база - это 500 записей и +150 записей в год, и меньше 1000 поисковых запросов в день, то этим можно ограничиться, даже немощный mysql с этим справится. Если база больше - то вам, скорее всего придётся заняться индексацией поиска. Если подходить серьёзно и нормализовать базу, то надо будет сделать как-то так: Создать таблицу со связкой id<->слово праймари кей id+индексация по слову. Создать таблицу со связкой id слова<->id статьи и заполнить её всеми словами, что есть в статьях. При добавлении новой статьи она разбивается на слова. Все слова, коорых ещё нет в таблице слов, туда добавляются. Потом добавляются связки слово-статья во вторую таблицу. Поиск работает так: разбиваете поиск на слова. Вытаскиваете id статей таким вот образом примерно: $q="SELECT DISTINCT ID FROM ARTICLE_TABLE AS AT INNER JOIN ARTICLE_WORDS_TABLE AS AWT ON AWT.ARTICLE_ID=AT.ID INNER JOIN WORDS_TABLE AS W ON W.ID=AT.WORD_ID WHERE W.WORD IN ('".implode("','",$array_of_the_sea rch_words)."')"; /* это я так писал, без проверки, поэтому проверять и отлаживать - надо */ Плюс, что бы всё работало достаточно быстро, надо индексировать все поля, по которым идёт поиск. ключ id слова<->id статьи должен быть юник. (можно ещё каунт сделать, насколько часто это слово встречается в статье, но это уже дальнейшее развитие темы.) Последний раз редактировалось graymaster; 26.06.2011 в 13:57. |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
ещё одна прога для студентов, тестирование с помощью программы ADSoft Tester - взлом пароля | rpy3uH | Софт | 70 | 23.12.2021 21:47 |
Одна внешняя ссылка для большой формулы | almik | Microsoft Office Excel | 8 | 11.04.2011 14:48 |
Одна процедура для всех Edit(ов) | SoftKoc | Общие вопросы Delphi | 7 | 23.01.2010 13:44 |
Поиск экстремумов функций | DJEDY | Общие вопросы C/C++ | 2 | 07.04.2009 14:21 |
Одна функция для нескольких объектов | Salomon | Помощь студентам | 2 | 25.11.2008 16:32 |