[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: поиск по сайту
ilma55
Здравствуйте!

вот, столкнулся с проблемой!

нужен поиск по сайту!

как любойй начинающий я пользуюсь конструкцией:

$query = "SELECT
*
FROM
content
WHERE
(title LIKE '%"
. mysql_real_escape_string($slovo) . "%' )
OR
(text LIKE '%"
. mysql_real_escape_string($slovo) . "%' )";

как бы все хорошо... НО!!!
мне нужно чтоб было как у гугла!
а точнее:
чтоб выводился кусок текста. результат чтоб был типа такого:
..... the most interesting and cognitive information on coffee from all over the world....



Спустя 4 минуты, 8 секунд (9.02.2010 - 12:28) ilma55 написал(а):
как вы догадались искомое слово это кофе

видите, текст тут обрезается и выводится отрывок...

и еще выводится только конкретный текст.

точнее если есть большая буква, то будет только с большой буквы...

идея есть - преобразовывать искомое слово через strtolower, strtoupper...
но как избавиться от повторений?

Спустя 1 месяц, 6 дней, 13 часов, 33 минуты, 45 секунд (16.03.2010 - 02:02) asim написал(а):

Спустя 4 часа, 18 минут, 32 секунды (16.03.2010 - 06:21) Игорь_Vasinsky написал(а):
опиши таблицу, какие столбцы (с пояснениями) ? опыт есть

можно не только строку(отрезок) текста выводить, но ещё и подсвечивать искомый кусок.

Вечером механизм опишу, сейчас на работу надо.

Лан есть пару минут, вообщем пока тока алгоритм:

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

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

пока всё. не успел, пора на работу, разбор полётов вечером,

хотелось бы увидеть от вас хот какой нибудь результат, если мы всё зделаем за вас - опыта это вам не добавит.

Спустя 1 час, 56 минут, 18 секунд (16.03.2010 - 08:17) Nikitian написал(а):
Цитата (Игорь_Vasinsky @ 16.03.2010 - 03:21)
Для начало текст, в котором заключается поиск должен находиться в ячейках "FULLTEXT" и обязательно добавляйте индекс, иначе загрузите сервер, а хостер за это не погладит вас по головке - а сделает ваш сайт нивидимкой

Fulltext-индекс существует только в myisam таблицах и используется только для выборок match-against. Для любой другой выборки он не используется и будет тупо грузить базу при обновлении индексов.

Спустя 1 час, 58 минут, 51 секунда (16.03.2010 - 10:16) Игорь_Vasinsky написал(а):
Nikitian, на скока я знаю - в mysql - myisam-тип по умолчанию...или чтото того, если не обозначать индекс - значит увеличить время поиска, т.к. поиск будет осуществлятся по всей базе, или я не прав ?

Спустя 5 минут, 55 секунд (16.03.2010 - 10:22) Nikitian написал(а):
Цитата (Игорь_Vasinsky @ 16.03.2010 - 07:16)
Nikitian, на скока я знаю - в mysql - myisam-тип по умолчанию...или чтото того, если не обозначать индекс - значит увеличить время поиска, т.к. поиск будет осуществлятся по всей базе, или я не прав ?

Да, myisam по умолчанию, но не факт, что его именно используют. Может человеку внешние ключи были нужны (innodb, berkeley), может важна скорость получения и не важна сохранность данных (heap, memory), может там вообще какой-нибудь federated. Ведь вероятно, что человек работает с уже готовым продуктом, дотачивая его, а что там разрабы придумали, неизвестно.

Ещё раз повторю: fulltext индекс работает только для match-against. В других выборках он не участвует. Если использовать like или поиск по сравнению ("<", ">", "=", "<>"), то будут использоваться только обычный и уникальный индексы.

Спустя 7 минут, 45 секунд (16.03.2010 - 10:30) Игорь_Vasinsky написал(а):
Дык критерии указаны не были, поэтому был предложен простейший работающий пример, после его тестирования - всплыли или не всплыли бы недостатки - которые мы здесь бы дружно решали - а возможно такой результат полностью был удовлетворён.

Предложь твой пример, алгаритм...

Спустя 3 минуты, 31 секунда (16.03.2010 - 10:33) Nikitian написал(а):
Я про то, что для
Цитата
$query = "SELECT * FROM content WHERE (title LIKE '%" . mysql_real_escape_string($slovo) . "%' ) OR (text LIKE '%" . mysql_real_escape_string($slovo) . "%' )";

fulltext index работать не будет.
Вот пример использования полнотекстового поиска по fulltext-index:

SELECT *,
MATCH (fild) AGAINST ($serch)
FROM BASE
AS Relevance
WHERE
MATCH
(fild) AGAINST ($serch IN BOOLEAN MODE)
ORDER BY Relevance DESC

Спустя 6 минут, 7 секунд (16.03.2010 - 10:39) Игорь_Vasinsky написал(а):
Цитата
$query = "SELECT * FROM content WHERE (title LIKE '%" . mysql_real_escape_string($slovo) . "%' ) OR (text LIKE '%" . mysql_real_escape_string($slovo) . "%' )";


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


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

а релевантность ? опять же критерий о котором ни кто ни чего не сказал

Спустя 1 час, 2 минуты, 55 секунд (16.03.2010 - 11:42) ilma55 написал(а):
Парни, спасибо за то что уделили время!

тут вы просите указать критерий, а что именно вы подразумеваете под критерием?

1, поиск производится в 2 полях - заголовок и текст
2, а вывод результата это часть фразы (кусок), в который входит наше искомое слово или сочетание
пример:
..... the most interesting and cognitive information on coffee from all over the world....

Спустя 3 минуты, 18 секунд (16.03.2010 - 11:45) Игорь_Vasinsky написал(а):
критерий пока допустим 2

1. Приоритетна релевантность ?
2. поиск по словам или фразе?

Цитата
$query = "SELECT * FROM content WHERE (title LIKE '%" . mysql_real_escape_string($slovo) . "%' ) OR (text LIKE '%" . mysql_real_escape_string($slovo) . "%' )";


запрос - результат выдаёт?

Спустя 10 минут, 52 секунды (16.03.2010 - 11:56) ilma55 написал(а):
проверить запрос пока не могу... на работе! дома вечером займусь!

относительно критерий:

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

2, относительно релевантности я пока не знаю, верннее не могу понять это. ведь если пользователь ввел слово coffee, то ему должен ведь быть выведен текст в котором есть это слово

Спустя 19 минут, 52 секунды (16.03.2010 - 12:16) Игорь_Vasinsky написал(а):
Цитата
2, относительно релевантности я пока не знаю, верннее не могу понять это. ведь если пользователь ввел слово coffee, то ему должен ведь быть выведен текст в котором есть это слово


а если гость ищет вкусный кофе ?

тогда приоритет попадает на "вкустный кофе", потом на чёрный кофе, а потом на просто кофе

лан будем считать что релевантность не вожна пока.

Потом: поиск слова и поиск фразы существенно разные вещи

Мала вероятность того что гость угадает положение слов в фразе - тогда как вариант -
взять фразу
str_replase(" ", "_", "$fraza")
- т.е. пока заменили пробел - на "_"
- кто его знает -может есть такая фраза
но перед этим - нужно содержимое ячеек тоже подвести к этому виду

А если совпадений нет то

разбить фразу на слова (разделитель пробел)
искать отдельно слова т.е. логика или OR

WHERE $text LIKE '%".$word[]."%' // может неработать

а вот
WHERE $text LIKE '%".$word[0]."%' || $text LIKE '%".$word[1]."%' b т.д. 


не забываем про инъекцию - это только алгоритм

Далее если результат есть то нужно подсчитать позицию первого вхождения этого слова/фразы в общем тексте отрезаем от этого слова до начала текст, так же отрезаем текст нужной длины (допустим 300 симв) после слова

а $word делаем str_replace($word, "<b><i>".$word."</i></b>", $text)

алгоритм таков....

строковые функции (string -функции) описаны в мануале.

я собирал такой поиск, замучался но сделал, у меня ещё логика была OR или AND

Спустя 6 минут, 42 секунды (16.03.2010 - 12:23) ilma55 написал(а):
а подсчет и обрезка делается при помощи substr ?

спасибо, обязательно вечером начну пробовать

Спустя 6 минут, 19 секунд (16.03.2010 - 12:29) Игорь_Vasinsky написал(а):
ну да тока сначала подсцитай поцицию первого вхождения слова а отрезай кусок от начала (поз 0) и до слова (допустим поз 148) значит тебе если 100 символов вначале хвати то от 48 до 148.

аналогично после слова (подстчитай длину слова или фразы) - потом сложи от 40 + длина слова + допустим 300 символов

вот такой блин алгоритм

Спустя 3 дня, 39 минут, 34 секунды (19.03.2010 - 13:09) ilma55 написал(а):
а как обойти "высоту" букв!

к примеру, юзер ввел слово кофе.
то, не смотря на то , что из БД извлекаются все (любые) слова (КОФЕ, Кофе, кофе, КоФЕ...), выделение искомого слова будет только кофе, а все остальные варианты в пролете.

как сделать чтоб все учитывалось???

Спустя 1 час, 39 минут, 14 секунд (19.03.2010 - 14:48) Игорь_Vasinsky написал(а):
Т.е. функция не должна быть чувствительной к регистру.

str_ireplace() - эта функция и не чувствительна к регистру использу её.

Тока учти я учился сам и допустим алгоритм правельный, а вот пример его решения я могу значительно усложнить.

Спустя 7 минут, 5 секунд (19.03.2010 - 14:55) ilma55 написал(а):
всмысле а вот пример его решения я могу значительно усложнить.
???????

Спустя 4 минуты, 51 секунда (19.03.2010 - 15:00) Игорь_Vasinsky написал(а):
код который алгортм воплотит в жизнь у меня на удивления велик и нечитабелен.. и вообще ...

талант у меня от бога такой есть

Спустя 16 минут, 52 секунды (19.03.2010 - 15:17) Nikitian написал(а):
Цитата (Игорь_Vasinsky @ 19.03.2010 - 11:48)
Т.е. функция не должна быть чувствительной к регистру.

str_replace() - эта функция и не чувствительна к регистру использу её.

Всё же, неправы вы. str_replace() очень даже чувствительна:
Цитата

Note: This function is case-sensitive. Use str_ireplace()  for case-insensitive replace.

Из этой же сноски в официальной документации можно сделать вывод, что регистронезависимой функцией является str_ireplace()

Спустя 4 минуты, 10 секунд (19.03.2010 - 15:21) Игорь_Vasinsky написал(а):
упсю лажанулся.. ни чё аборигенам скидка. спасибо за участие. исправлено

Спустя 4 минуты, 20 секунд (19.03.2010 - 15:25) ilma55 написал(а):
не помогла эта функция...

вот запрос
$query = "SELECT * FROM jos_content WHERE sectionid <> '0' AND ((title  LIKE '%" . mysql_real_escape_string($slovo) . "%' ) OR (introtext  LIKE '%" . mysql_real_escape_string($slovo) . "%' ))";


вот вывод
$pos = strpos($text, $slovo);
$text = str_replace($slovo, '<i>'.$slovo.'</i>', $text);
if ($pos == '0') {echo substr($text,0,200).'...</p>';}
else {echo '...'.substr($text,$pos-20,200).'...</p>';}

Спустя 3 минуты, 34 секунды (19.03.2010 - 15:29) Игорь_Vasinsky написал(а):
$query = "SELECT * FROM jos_content WHERE sectionid <> '0' AND ((title LIKE '%" . mysql_real_escape_string($slovo) . "%' ) OR (introtext LIKE '%" . mysql_real_escape_string($slovo) . "%' ))";

вывод есть - желаемый результат получен ?

там я ошибся используй str_ireplace()

$text = str_ireplace($slovo, "<i>".$slovo."</i>", $text); - подсветка есть?


Спустя 28 секунд (19.03.2010 - 15:29) ilma55 написал(а):
понятно, но мне кажется str_ireplace заменяет все не взирая на регистр к тому варианту, который ищется

то есть, если я ищю море, то слово Море тоже заменится на море

Спустя 4 минуты, 21 секунда (19.03.2010 - 15:34) Игорь_Vasinsky написал(а):
Я шас на левой таче, в браузере которой глючит JS... зарядник от ноута забыл..

Вообщем я просто в понедельник свой пример - рабочий выложу, а пока можешь искать причину


Спустя 8 минут, 18 секунд (19.03.2010 - 15:42) ilma55 написал(а):
вот еще такой глюк...

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

я отдыхал на <b>море< ...

то так как этот тэг не закрыт, то и все поплыло...

Спустя 1 минута, 1 секунда (19.03.2010 - 15:43) ilma55 написал(а):
Игорь_Vasinsky , огромное спасибо за помощь начинающему...

хороших выходных вам!

Спустя 1 минута, 54 секунды (19.03.2010 - 15:45) Игорь_Vasinsky написал(а):
значит сначала подсчитай длину слова а потом увелич его на 3 вначале и на 4 в конце.

стал быть длина слова = длина слова + 7


вот вся логика

Спустя 45 секунд (19.03.2010 - 15:46) Игорь_Vasinsky написал(а):
нет - я то онлайн , а так спасибо и вам тоже не хварать.

Спустя 1 час, 35 минут, 27 секунд (19.03.2010 - 17:21) ilma55 написал(а):
я вывожу информацию таким образом:

echo $pos = strpos($text, $slovo); // позичия слова
$pos2 = $pos-20;// позиция до искомого слова
$text = str_ireplace($slovo, '<b>'.$slovo.'</b>', $text);//выделение слова искомого
if (($pos == '0') or ($pos2 < $pos)) {echo substr($text,0,200).'...</p>';}
[b]elseif ($pos > $pos2) {echo substr($text,$pos-20,200).'.!!!!..</p>';}[/b]// !!!! не работает эта часть кода

он должен выводить
.... текст текст текс слово секст текат текс...

почему? что не так?

Спустя 36 минут, 16 секунд (19.03.2010 - 17:57) Игорь_Vasinsky написал(а):
Значит смотри алгоритм ещё раз:

1. сначала найти и подсветить искомое слово (после подсветки длина +7)
2. подсчитать позицию искомого подсвеченного слова
3. определить кусок текста к примеру 150 символов до слова
4. из п.п 1 взять позицию начала слова и + длина слова + 7 (на подсветку)
5. в п.п.4 определяется позиция начала текста после искомого слова
6. Вывод = ... $text_befor + $text_find + $text_after ...

где $text_before -> кусок текста до начала искомого слова 150 симв
$text_find -> искомое подсвеченное слово
$text_after -> кусок текста после искомого подсвеченного слова 150 симв

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

Спустя 18 минут, 38 секунд (19.03.2010 - 18:16) Игорь_Vasinsky написал(а):
Значит (подсветку делать не могу, чёто с браузером)

1. Определяем длину поискового запроса (искомого слова) $text_find, т.к. это первое что мы знаем (прилетело по GET):

$lenght = strlen($text_find);


(этим моментом можно ограничить min и max поисковый запрос)
к примеру минимальный запрос 3 буквы а максимальный 19 букв:

if ($lenght < 3)
{
echo "Вы ввели слишком короткий запрос";
}
elseif ($lenght > 19)
{
echo "Вы ввели слишком короткий запрос";
}
else { //пропускаем запрос дальше для операций над ним }


//////////////////////
операции по поиску слова в базе в столбце "сообщения", если есть ячейка с вхождением этого слова то далее
/////////////////////

2. Подсвечиваем поисковой запрос:

$text = str_ireplace($text_find, "<b>".$text_find."</b>", $text);
// тем самым увеличивается длина слова $text_find на 7 символов


$lenght = $lenght + 7;  



счас делаю дальше...чтоб не козалось что я срулил куда нить

Спустя 5 минут, 43 секунды (19.03.2010 - 18:22) ilma55 написал(а):
да спасибоо и на этом!
реально, спасибо огромное человеческое-прогерское

Спустя 3 минуты, 30 секунд (19.03.2010 - 18:25) Игорь_Vasinsky написал(а):
точно всё ?

Спустя 1 минута, 43 секунды (19.03.2010 - 18:27) ilma55 написал(а):
я в смысле что спасибо за то , что вы время свое мне уделяете!

пока еще не встречал так чтоб детально все расписывали, а бывало что еще и оскорбляли

Спустя 4 минуты, 44 секунды (19.03.2010 - 18:32) Игорь_Vasinsky написал(а):
а ну тогда продолжим
Только живим примером можно донести человеку, то что он хочет понять, меня хотели учить подругому, ничего из этого не вышло. Ах .... какая у меня раньше подпись была......

Спустя 28 минут, 39 секунд (19.03.2010 - 19:00) Игорь_Vasinsky написал(а):
3. Теперь необходимо определить точку первого вхождения (именно первого) искомого слова, длина которого изменилась слева на 3 символа,

а именно: <b>$text_find

strpos() - Находит позицию первого появления строки (а не символа, именно это нас интересует)

$start_find = strpos($text, $text_find);
$start_find = $start_find - 3; // сдвинули позицию в лево от слова из-за <b>

4. Определяем позицию начала текста после искомого слова $text_after

$start_text_after = $start_find + $lenght;


позиция слова нам была уже известна как и его "новая" длина


5. Определяем кусок $text_before // текст до начала слова
к примеру будем выводить 150 символов до слова, не важно да же если их
до слова и меньше

substr() - возвращает часть строки.

Примеры (есть в мануале по PHP)

$rest = substr("abcdef", 1);// возвращает "bcdef" // вот эта НЕ наша -
$rest = substr("abcdef", 1, 3); // возвращает "bcd"
$rest = substr("abcdef", 0, 4); // возвращает "abcd"// эта урезает справа
$rest = substr("abcdef", 0, 8); // возвращает "abcdef" вот - урезает слева

А у нас:

$end_find = $start_find - 150;


здесь мы нашли край слева для текста до слова $text_before, а край справа для него - точка вхождения $text_find ( -3 симола для <b>)


обрабатывай, пока я пишу

Спустя 2 минуты, 9 секунд (19.03.2010 - 19:02) ilma55 написал(а):
ok!
сейчас до дома доберусь и продолжу!
эт я на работе пока...

Спустя 28 минут, 9 секунд (19.03.2010 - 19:31) Игорь_Vasinsky написал(а):
Урезать будем всё сообщение:

$text_bef_start = $start_find - 150; //отрезали 150 симв влево

Нужно проверить - если число отрицательное (не хватило символов слева - то уровняем его к "0", т.к. это минимальная стартовая позиция отсчёча)

if($text_bef_start < 0) 
{
$text_bef_start = 0;
}


$text_before = substr($text, $text_bef_start, $start_find);



6. Определить кусок $text_after

Он у нас начинается - кагда кончается искомое слово ( + 4 симв для </b>)
и его мы просчитали в п.п.4 и кончается через 150 символов:

$text_after = substr($text, $start_text_after, 150);



7. ВЫВОД РЕЗУЛЬТАТА:

собираем пременные в строку

$need_text = "...".$text_before.$text_find.$text_after."...";



Было бы красивее делать подсветку не <b>$text_find</b>

если не где не использован тег <u>

<u>$text_find</u>

в style.css: u{background-color:yellow}

// желтая подсветка слова как у Yandex

//////////////////////////////
теперь нужно протестировать, возможно где то ошибился
//////////////////////////////

У google вывод поиска в формате:

1.<a href=$post."?id=."$id">$post</a> - тема сообщения
2. - ну и наш алгоритм поиска


Ну и на последок:

В сообщении искомое слово может встретиться не 1 раз:

для этого подсчитать количество вхождений запроса и нужно разбить всё сообщение на такие куски и прогнать в цикле, но с этим я не эксперементировал, а сейчас провести тест и откладку возможности нету.

Спустя 3 минуты, 58 секунд (19.03.2010 - 19:35) Игорь_Vasinsky написал(а):
Если всё сработало как надо, то спомощью кнопочек выдели синтаксис php чтоб пост смотрелся читабельно. Возможно это поможет кому нибудь ещё


А вообще я опять сморозил и увеличил сам себе работу:

подсветку слова - намноОоОого удобнее делать в при выводе, когда строка уже собрана.

Запрос в базу рекомендую делать как LIKE %text% и выдовать по релевантности.

Ну лан, поймёш как всё здесь работает - сделаешь всё правильно.

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

Спустя 2 дня, 19 часов, 26 минут, 48 секунд (22.03.2010 - 15:01) ilma55 написал(а):
Добрый день, Игорь!

сделал код. почти!!! все работает.
я понял смысл...
вот код:
$start_find = strpos($text, $slovo);// nahodim pozitsiiu prvoi bukvi iskomogo slova

$start_text_after = $start_find + $len;//pozitsie posle iskomogo slova

$text_bef_start = $start_find - 150; // pozitsiea do iskomogo slova
if($text_bef_start < 0)
{$text_bef_start = 0;}

$text_before = substr($text, $text_bef_start, $start_find);
$text_after = substr($text, $start_text_after,150);// text posle slova
$slovo = '<b>'.$slovo.'</b>';
echo $need_text = "...".$text_before.$slovo.' '.$text_after."...";


но я заметил ткую вещь, что код не всегда ищет первое вхождение, а начинает со второго инногда

Спустя 9 минут, 34 секунды (22.03.2010 - 15:11) Игорь_Vasinsky написал(а):
Здаров, всмысле ? а превое в резуоьтат выводит ?

Спустя 9 минут, 37 секунд (22.03.2010 - 15:21) Игорь_Vasinsky написал(а):
Вообще по логике он должен только первое совпадение ловить, возможно дело в регистре, обрати внимание - оба слова одинакого ?

Спустя 24 секунды (22.03.2010 - 15:21) ilma55 написал(а):
работает $text_after

скажем так из echo $need_text = "...".$text_before.$slovo.' '.$text_after."..."; работает только то что я выделил

Спустя 8 минут, 52 секунды (22.03.2010 - 15:30) ilma55 написал(а):
нет, регистр тут не причем =(

может сделать проверку на удаление всех ненужных символов?
оставить только англ буквы и цифры

Спустя 1 минута, 17 секунд (22.03.2010 - 15:31) Игорь_Vasinsky написал(а):
Цитата
может сделать проверку на удаление всех ненужных символов?
оставить только англ буквы и цифры


по подробней, это к чему?

Спустя 5 минут, 32 секунды (22.03.2010 - 15:37) ilma55 написал(а):
ну я задал в запросе latte art. то выдал один результат, а если без точки, то другой

Спустя 1 минута, 19 секунд (22.03.2010 - 15:38) Игорь_Vasinsky написал(а):
А код то написан на поиск слова, а не фразы...

Спустя 3 минуты, 37 секунд (22.03.2010 - 15:42) ilma55 написал(а):
код ищет конкретную фразу в тексте... будь то слово или сочетание слов.

Спустя 2 минуты, 45 секунд (22.03.2010 - 15:44) Игорь_Vasinsky написал(а):
мой же код... я проверял. huh.gif

нужно использывать логику поиска OR или AND

И тогда логика пр OR : ищем хотябы одно слово из фразы
при AND - ищем чтоб в тексте были все слова из фразы

Спустя 3 минуты, 4 секунды (22.03.2010 - 15:47) Игорь_Vasinsky написал(а):
как говориться пользывателю выбирать самому... если чё мы не виноваты... laugh.gif

Спустя 10 минут, 47 секунд (22.03.2010 - 15:58) ilma55 написал(а):
вот мой запрос
$query = "SELECT * FROM content WHERE sectionid <> '0' AND (text LIKE '%".mysql_real_escape_string($slovo)."%')"; 



Спустя 6 минут, 38 секунд (22.03.2010 - 16:05) Игорь_Vasinsky написал(а):
Цитата
AND (text LIKE '%".mysql_real_escape_string($slovo)."%')


скобочки можно убрать


Цитата
<> '0'


а это что, я такое ни использую

Спустя 5 минут, 57 секунд (22.03.2010 - 16:11) ilma55 написал(а):
sectionid <> '0' этим я убираю не нужные данные

Спустя 4 минуты, 19 секунд (22.03.2010 - 16:15) Игорь_Vasinsky написал(а):
НУ вот значит решено - использывать логику... или можно ещё кого спросить..

Спустя 7 минут, 18 секунд (22.03.2010 - 16:22) Игорь_Vasinsky написал(а):
Цитата
sectionid <> '0'

\и всё же объясни логику как так отсеиваеш, я например вижу что где sectionid не равна нулю...

Спустя 20 секунд (22.03.2010 - 16:23) ilma55 написал(а):
спасибо огромное!!!

Спустя 1 минута, 21 секунда (22.03.2010 - 16:24) ilma55 написал(а):
это joomla!
в БД я ищю те поля, которые не равны 0 и из тех я выбираю информацию

Спустя 6 дней, 22 часа, 2 минуты, 17 секунд (29.03.2010 - 13:26) igor717 написал(а):
Ребята, хотел бы продолжить эту тему.
А если допустим человек ввел несколько слов в поисковый запрос, как бы сделать так чтоб запрос разбивался на отдельные слова (не зависимо от того сколько он их ввел) и поиск по базе осуществлялся по этим словам по отдельности, а не по фразе?

Спустя 22 минуты, 4 секунды (29.03.2010 - 13:48) ilma55 написал(а):

в запросе пиши like 'search' or like 'search2'

Спустя 46 минут, 42 секунды (29.03.2010 - 14:35) Nikitian написал(а):
Цитата (ilma55 @ 29.03.2010 - 10:48)
в запросе пиши like 'search' or like 'search2'

Всё же правильнее так:

[....] field like '%search%' or field like '%search2%' [....]

Спустя 2 минуты, 15 секунд (29.03.2010 - 14:37) ilma55 написал(а):
согласен...

вот еще ссылочка на поиск http://www.phparticles.ru/php/prostojj-sql...=1#comment-1440


тока не могу там разобраться

Спустя 22 минуты, 38 секунд (29.03.2010 - 15:00) ilma55 написал(а):
блин...
странно, но не работает корректно вывод, в том случае, если искомая инормация не равна нолю!


$destr_tag = array('img','em','table','tr','td','div','p','a','ol','li','strong','font','span', 'href', 'color', 'src','br');
$text = $row->introtext;
foreach ($destr_tag as $tag)
$text = preg_replace('/<[\/]?'.$tag.'[^>]*>/i', ' ', $text); // udaleaem nenujnie tegi
$text = ereg_replace(" +", " ", $text);
$start_find = stripos($text, $slovo);// nahodim pozitsiiu pervoi bukvi iskomogo slova
$start_text_after = $start_find + $len;//pozitsiea posle iskomogo slova
$text_bef_start = $start_find-150; // pozitsiea do iskomogo slova
$trt = '...';
if($text_bef_start < 0) { $text_bef_start = 0; $trt = ''; }
$text_before = substr($text, $text_bef_start, $start_find);
$text_after = substr($text, $start_text_after,150);// text posle slova
echo $need_text = $trt.$text_before.' <b>'.$slovo.'</b> '.$text_after."...";

Спустя 28 минут, 56 секунд (29.03.2010 - 15:29) igor717 написал(а):
да спасибо щас попробую

Спустя 6 минут, 24 секунды (29.03.2010 - 15:35) igor717 написал(а):
я пробовал делать так разбивал фразу на слова и записывал все в массив а потом доставал по очереди эти записи (искомые слова) и подставлял их в запрос (все это в цикле), но промблема в том что каждый последующий перезаписывает предыдущий

/*Разбиваем фразу на слова и записываем их в массив*/
$words = preg_split("|[\s]+|",$searching);

/*Достаем поочереди эти слова*/
while (list($key, $line) = each($words))
{

/*Поиск в таблицай*/
$result7 = mysql_query ("select id, headline, content, search from framework where publish='1' and content like '%$line%'",$db);
$myrow7 = $myrow7 + mysql_fetch_array ($result7);
}

Спустя 1 минута, 24 секунды (29.03.2010 - 15:37) ilma55 написал(а):
ёёёёёёё...

не то написал!!!

код не правильно работает, если количество символов до искомого слова/фразы больше ноля...

нифига не понимаю! вроде логично всё правильно

Спустя 4 минуты, 38 секунд (29.03.2010 - 15:41) ilma55 написал(а):
у меня другая идея.
вот щас ломаю голову..

короче, делаем так:
$start_query = select * from content where text=;

поехал цикл:
$end_query = $start_query. massiv[i];


вот такая каша... пытаюсь все вместе собрать

Спустя 51 секунда (29.03.2010 - 15:42) igor717 написал(а):
ilma55

сделай проверку

if($text_bef_start < 0) { $text_bef_start = 0;}

else
{
$text_bef_start = substr($текст, $начало, 150);
}

все должно работать если я не ошибся

Спустя 6 минут, 2 секунды (29.03.2010 - 15:48) igor717 написал(а):
не знаю есть ли в этом смысл:

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

$start_query = select * from content where text like '%$красивыйдиван%'

если я тебя правильно понял

Спустя 2 минуты, 16 секунд (29.03.2010 - 15:51) igor717 написал(а):
надо как-то сделать чтобы он не перезаписывал получившийся результат поиска по запросу "красивый" после ввода "диван", а добавлял к нему его

Спустя 11 секунд (29.03.2010 - 15:51) ilma55 написал(а):
Цитата (igor717 @ 29.03.2010 - 12:42)

$text_bef_start = substr($текст, $начало, 150);



вот тут то и вся фигня...

мне надо 150 символов до искомой фразы.

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

если <0 то эта позиция 0

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

Спустя 1 минута, 20 секунд (29.03.2010 - 15:52) ilma55 написал(а):
разбей предложение на отдельные слова и внеси их в массив

Спустя 2 минуты, 29 секунд (29.03.2010 - 15:55) igor717 написал(а):
if($text_bef_start < 0)
{
$text_bef_start = 0;;

$text_before = substr($text, $text_bef_start, $start_find);

}
else
{
$text_before = substr($text, $text_bef_start, 150);
}

Вот так должно вроде работать, там я записал не правильно

Спустя 49 секунд (29.03.2010 - 15:55) igor717 написал(а):
/*Разбиваем фразу на слова и записываем их в массив*/
$words = preg_split("|[\s]+|",$searching);

Спустя 2 минуты, 16 секунд (29.03.2010 - 15:58) igor717 написал(а):
сделай так я написал - должно работать ЭТО ПРО ТВОЙ ВЫВОД

Спустя 10 минут, 24 секунды (29.03.2010 - 16:08) ilma55 написал(а):
Цитата (igor717 @ 29.03.2010 - 12:55)
if($text_bef_start < 0){$text_bef_start = 0;
$text_before = substr($text, $text_bef_start, $start_find);
}else {$text_before = substr($text, $text_bef_start, 150);}

да да да!!!

вот где зарыт геморой!

и релиз не помогает! =)


Спустя 1 минута, 18 секунд (29.03.2010 - 16:09) igor717 написал(а):
я так подумал возможно ты и прав по поводу цикла в запросе
щас попробую сделать

Спустя 34 секунды (29.03.2010 - 16:10) igor717 написал(а):
так что работает?

Спустя 2 часа, 51 минута, 20 секунд (29.03.2010 - 19:01) igor717 написал(а):
Короче, решение этого вопроса есть!!!

/*Разбиваем фразу на слова и записываем их в массив*/
$words = preg_split("|[\s]+|",$searching);

foreach($words as $line)
{
/*Удаляем пробелы между словами в массиве*/
$line = trim($line);

/*Проверяем введённые данные на предмет SQL-инъекций*/
if (!get_magic_quotes_gpc())
{
$line = mysql_escape_string($line);
}

/*Формируем массив со словами запроса*/
$zapros[] = "(content like '%".$line."%')";
}

/*Поиск в таблицай*/
$result7 = mysql_query ("select id, headline, content, search from framework where publish='1' and ".implode(" or ", $zapros)."",$db);
$myrow7 = mysql_fetch_array ($result7);

Спустя 3 минуты, 16 секунд (29.03.2010 - 19:04) igor717 написал(а):
Теперь, если двигаться дальше, нужно определить какое слово из массива с запросами в поиске встретилось первым.

Это необходимо для корректного вывода. У кого-нибудь есть идеи?

Спустя 55 минут, 41 секунда (29.03.2010 - 20:00) igor717 написал(а):
Короче решение я нашел, кому надо - пишите могу выложить, а то уже пол дня общаюсь сам с собой!!! mad.gif

Спустя 3 часа, 29 минут, 9 секунд (29.03.2010 - 23:29) ilma55 написал(а):
да не... я слежу... я подписался на тему...
просто днем я на работе был...

а сейчас дома я. все файлы на работе. я дома action script штурмую.

конечно же надо!!! выкладывай!
топик хороший!

потом надо будет подумать над suggest'ом!

ну, как у google

впринципе, у меня был скрипт, но только он из текстового файла брал suggestions. надо переделать под вывод из БД...
я видел подобную реализацию на joomla.

там компонента называлась com_ajaxsearch

Спустя 14 часов, 26 минут, 48 секунд (30.03.2010 - 13:56) igor717 написал(а):
Я думаю по поводу suggest'а пока замарачиваться не стоит есть куда более актуальные проблемы, к примеру вопрос РЕНТАБЕЛЬНОСТИ!!! Вот над этим я думаю стоит подумать...
Есть идеи?

Спустя 5 минут, 36 секунд (30.03.2010 - 14:02) igor717 написал(а):
/*Ищем какое из слов запроса было найдено первым*/
foreach($rez as $line)
{
/*Удаляем пробелы между словами в массиве*/
$line = trim($line);

/*Приводим всю строку к нижнему регистру*/
$content1 = strtolower($content);

/*Ищем начальную точку схождения. Если такой нет, то удаляем эту пару переменных. Если есть - формируем 2 массива: в 1-ом - начальная точка вхождения, во 2-ом - слово*/
$coincidence = strpos($content1, $line);
if ($coincidence == false)
{
unset ($coincidence);unset ($line);
}
else
{
$begin_counting[] = $coincidence;
$request[] = $line;
}
}



Если кому нужно...
Но меня тут не все устраивает, здесь в массивы попадают точки вхождения и лова попарно(соответственно друг другу), но проблема в том, что если в тексте встречается 2 слова, то выделится только первое.

Если у кого есть идеи как это исправить, просьба - ПИШИТЕ!!!

Спустя 11 месяцев, 29 дней, 5 часов, 31 минута, 23 секунды (29.03.2011 - 19:33) Гость_Michael написал(а):
случайно наткнулся на эту тему...
нужно было подсветить искомые слова в тексте

что-то тут как-то все очень трудно сделано, я нашел более простой способ, может кому-то понадобится:

$search="текст для"; // хотим подсветить совпадения для этой фразы
$array = split(" ", $search); // отделяем слова, записываем их в массив
$string="этот текст нужен для проверки выделения слов текста"; // здесь мы ищем совпадения
foreach ($array as $search_words): // заменяем каждое слово на такое же, только с жирным шрифтом

$string = str_replace ($search_words,'<strong>'.$search_words.'</strong>',$string);

endforeach;
echo $string; //выводим

вот, что получилось на выходе:
этот текст нужен для проверки выделения слов текста

Спустя 4 часа, 14 минут, 47 секунд (29.03.2011 - 23:48) ilma55 написал(а):
ух ты... спасибо... заценим...
я тогда долго игрался и уж больно интересно мне было тогда это сделать...
и igor помог =)

и тебе тож спасибо!


_____________
Программист – это не деятельность, это иной образ жизни!
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.