ПредишенСледващото

Кратка информация за изпълнението на търсене на: технологични линии, рязане показатели услуги, съставяне на запитване до база данни, логика, номерацията на страниците, значение.

Част 1: Основни положения

Първата стъпка е да се намали низови дръжките.

$ Търсене = SUBSTR (търсене $, 0, 64);

64 знака потребител ще бъде достатъчен за търсене. Сега гореща ютия изгори всички "ненормално" характер.

$ Търсене = preg_replace ( "/ [^ \ т \ x7F- \ xFF \ S] /", "", $ търсене);

Идеята е, че не може да даде възможност на потребителя да погледнете твърде кратки думи - наред с други неща, това е много натоварване на сървъра. Така че, нека търсене само в думите, които са по-дълги от две букви (ако има такива по-висока, то е необходимо да се заменят с "" "").

$ Добро = отрежете (preg_replace ( "/ \ сек (\ S) \ п /", "", ereg_replace ( "+", "", "$ търсене")));

И след подмяна на лоши думи - това е необходимо, за да компресирате двойните пространства (те са направени специално за правилното търсене на кратки думи).

$ Добро = ereg_eplace ( "+", "", $ добра);

Да предположим, че искаме да се даде възможност на потребителя да избере за търсене логика - за да търсите всички думи или само една от няколко. Ако искате да направите в Yandex - две амперсанд означава "I" (slovo1slovo2slovo3) или нещо друго, аз не съм съветник. Шаманизъм с струни на малък IMHO сайт не оправдава времето, прекарано. Ето защо, за полето за търсене съставя, както следва:

И сценария за търсене отново да се провери дали потребителят е въвел:

Както може да се използва логика - по-долу.

Добра идея е да незабавно да информира потребителя, как е намерил редовете на таблицата. За да направите това, да направи допълнително искане към базата данни:

$ Query = "SELECT идентификационния номер от масата, където поле като"% ". str_replace ( "", "%" или област, като "%", $ добро). "%";

За статистически данни по отделни думи могат да направят следното:

пейджъра резултати

Е, когато трябва да се търси за разположението и броя на редовете на резултата от търсенето, направете пейджъра търсене - парче от тортата. Проверете променлива страницата $ (не по-малко от 0, не повече от $ results_amount / $ rows_in_page) искане .В който брои броя на редовете (виж по-горе), пишем желаното поле и полето за сортиране. И тогава ние завършим

(Синтаксис: ГРАНИЦА <кол-во строк> или LIMIT <кол-во строк отступа>, <кол-во строк>)

В резултат на такова искане, ние ще получите точно същите тези линии, които трябва да бъдат показани на навигацията stranitse.Dlya може или да изготвят връзки към следващите и предишните страници, или че по-трудно да се направи навигационна лента на няколко страници.

Към осветление светлината или смели условията вид търсене в текста, е необходимо да се направи точно това:

Пропуски (и те са между думите да съществуват самостоятелно, и никъде не е намерен двойно пространство, освен това, от краищата на низа, ние ги нарежете също), достатъчно е да се замени вертикалната линия - възможности сепаратора в регулярните изрази. "Лошите" думи, не са подчертани, тъй като те не потърси в основата им :). В кода, който показва текста пишем:

След написването на въпроса Тичах, беше себе си и "осветяване" писане. Ни най-малко от него! Аз не съм намерил в текста на HTML тагове, така че имахме много да си помисля. Резултатът е такова нещо (низ от думи, за да се подчертае има такива):

Ние трябва да се види дали има дума в тага. Въпреки това, има възниква проблемът за интензивност на ресурсите на такава смяна (моят K6-266 на текста 5 килобайта мислеха седем секунди). За съжаление.

Чрез прилагането на тези техники, възможно е, от една страна, да се ограничи свободата на действията на потребителя, а не го а) научите софтуера, използван структурата на сайта) причина сървъра претоварване (например изпращане на мегабайт на текст, съставен от думи с дължина по три букви (изразът е превърнал двусмислено, но да се пренапише даде аз няма да :), сценарият 250 хиляди пъти за катерене до основата) в) съобщение за грешка, в резултат на въвеждане на специални символи на езика на низ на заявката. Второ, потребителски опит - страниране и светлини.

Спомням си, статията "Безопасно и удобно търсене" е фраза,

Част 2. Кратко около значение

За да се показват резултатите от търсенето по уместност трябва:

  • Задължителните полета VARCHAR, или който и да е от полетата сортове Текст (SMALLTEXT, MEDIUMTEXT т.н.) правя ключове на пълен текст:

ALTER TABLE маса ДОБАВИ пълен текст (област)

  • Следваща - още по-лесно:

    $ Query = "SELECT *, MATCH поле СРЕЩУ (" $ searchwords ") като relev от таблица Подреди по relev DESC"

    След това можете да окачите на всички видове LIMIT'y и така нататък за по-лесно изход.

    • По подразбиране, търсенето на думи, които съдържат най-малко 4 знака. Правила за определяне на #define MIN_WORD_LEN 4 в източник ft_static.c, въпреки че правилата не се нуждаят от него, по мое мнение.
    • % Налични символи в фраза за търсене, думите в фраза за търсене, анализирани с помощта на списък razdeleteley.
    • Списък на думите в ft_static.c източник сепаратори права.
    • Най-малко десет записи в таблица, за да започне изчисляването на приложимостта.
    • Не може да се използва в клаузата за област relev КЪДЕ:

    SELECT *, MATCH поле СРЕЩУ ( "$ searchwords") като relev ОТ КЪДЕ маса relev> 0 ORDER BY relev DESC

    SELECT *, MATCH поле СРЕЩУ ( "$ searchwords") като relev от таблица мачовете поле СРЕЩУ ( "$ searchwords")> 0 ORDER BY relev DESC

  • достатъчно висока скорост, - дори и в някои случаи по-бързо търсене като
  • Всички по-горе дела, тъй като версия MySQL 23.03.23
  • При създаване на пълен текст индекси на няколко полета има 2 възможности:

    В първия случай може да поиска:

    SELECT *, MATCH Field1, Field2 СРЕЩУ ( "$ searchwords"), както relev от таблица ORDER BY relev DESC

    значение се изчислява във всички области едновременно. Във втория случай, такова искане ще генерира грешка. Тук ние се изчисли значението на следното:

    SELECT *, MATCH Field1 СРЕЩУ ( "$ searchwords") + MATCH Field2 СРЕЩУ ( "$ searchwords"), както relev от таблица ORDER BY relev DESC

    Вторият вариант е малко по-сложно в исканията, но по мое мнение е по-добре, защото повишаване гъвкавостта на търсенето - за всяка една от областите може да се настрои, например, значението на коефициента и полеви сумиране relevances на тях се размножават по този коефициент. Търсене фраза е "дълъг" Търси в области с висок коефициент. Например, ако искаме да търсите с индексиран директорията на страница с ресурси, полето за име на страницата обикновено се определя от по-голям фактор от областта на мета тагове, описание или ключови думи.

    Част 3: упражнения в значение

    Първо, как да добавите пълен текст-индекс:

    Текстови индекси могат да се извършват само в типа на MyISAM маса. Текстовете са взети от масата и изхвърлен в индекс файла и все по-голям база на обема. По отношение на исканията. Не може да се използва в клаузата за област relev КЪДЕ:

    SELECT *, MATCH поле СРЕЩУ ( "$ searchwords") като relev ОТ КЪДЕ маса relev> 0 ORDER BY relev DESC

    SELECT *, MATCH поле СРЕЩУ ( "$ searchwords") като relev от таблица мачовете поле СРЕЩУ ( "$ searchwords")> 0 ORDER BY relev DESC

    Изчислената областта, разбира се, не може да бъде използван в която всички правила на синтаксис, но може да се използва в които имат:

    SELECT *, MATCH поле СРЕЩУ ( "$ searchwords") като relev от таблица КАТО relev> 0 Подреди по relev DESC

    Търсене чрез минута Олег пише направено само за цялата дума. Въпреки това, от значение може да се сортира и подрежда по КАТО (това, разбира се, ще се отрази на работата, аз не знам как) само.

    Премахване състояние "relev> 0" на, оставяйки сортирането. Други, като по-рано - в резултат котлет линия и преобразуване на заявката с множество оператори, като:

    SELECT *, MATCH поле против ( '$ searchwords ") като relev от таблица КЪДЕТО област като"% $ word1% "или поле като"% $ WORD2%' Подреждане по relev Низходящо, datefield Низходящо

    Част 4: Prodolezhenie стартира

    MySQL осигурява най-новите версии на базата данни, използвана за пълния текст на индексирането за търсене и поле MATCH структура на пълен текст СРЕЩУ. Въпреки това, не всички сървъри трябва последната версия на MySQL и не всички хостинг доставчици искат да актуализирате софтуера от съображения за надеждност на системата.

    По това време, предположих, че търсенето, сортирани по значение ще трябва да направи няколко запитвания, и поради това, че е по-добре да не го задължава. Мисли, че от значение може да ми се зачитат от разстояние по искане на гостуващия, но ме беше страх и да се осигури такава структура.

    Въпреки това, служител на една от фирмите saytostroitelnyh H-ска похвалил да намеря системата, която те използват на техните сайтове. Аз не помня точно на искането, така че се опитват да го играят:

    SELECT заглавието, DATE_FORMAT (material_date, '% д.% С% Y'), както DATE1, IF (текст като "% word1 WORD2 word3% ', 3 * 10, 0) + IF (текст като"% word1%', 9, 0) + IF (текст като "% WORD2%", 9, 0) + IF (текст като "% word3%", 9, 0), както е от значение от таблица КЪДЕТО текст като "% word1%" или текст като " % WORD2% "или текст като"% word3% "ORDER BY значение DESC, material_date DESC

    Тя изглежда ужасно, но тя работи дори по-стари версии на MySQL. Опитах се да сравни скоростта на въпрос по следния начин:

    SELECT заглавието, DATE_FORMAT (material_date, '% д.% С% Y'), както DATE1, MATCH текст СРЕЩУ ( "word1 WORD2 word3") като значение от таблица КЪДЕТО текст като "% word1%" или текст като "% WORD2% "или текст като"% word3% "ORDER BY значение DESC, material_date DESC

    Като цяло, обща скорост заявка в два пъти по-малко в сравнение с използването на новия дизайн. Което е съвсем логично - по-голяма гъвкавост, по-голям интензитет на ресурсите.

    Нека се опитаме да изградим такова искане автоматично. Нарежете дългата опашка, както и всички погрешни символи и кратки думи. Начертайте поискване.

    $ Запитване = "SELECT заглавието, DATE_FORMAT (material_date, '% д.% С% Y'), както DATE1, IF (текст като"% ". $ Good_words."% ",". (Substr_count ($ good_words "," ) + 1). "* 10, 0) + IF (текст като"% ". str_replace (" ","% ", 9, 0) + IF (текст като"% ", $ good_words)."% ", 9, 0), КАКТО ОТ значение за масата, където текст като "%". str_replace ( "", "%" или текст като "%", $ good_words). "%" ORDER BY значение DESC, material_date DESC ";

    Не е много трудно. За надеждност и защита срещу наводнения, можете да ограничите броя на думите в заявката.

    Някои допълнения към предишни публикации

    Общият брой на мачове намерени в таблицата. За да се покаже резултатите от търсенето, разбира се, необходими, за да се използва клауза за LIMIT (да не пиша всеки път, когато формирането на този параметър, използвайте предварително определени функции). Ако не се групиране операции в искането не е направено, е добре да се разчита на броя на редовете наведнъж в заявката - COUNT (*), но не и чрез PHP mysql_num_rows () функция. Можете да проверите на големи маси. Ако са направени за дейността на групата, да отправи искане до броенето (DISTINCT (<поле, по которому группируем>)), Но без GROUP BY.

    Backlight. Освен ако не е, че текстът е HTML-тагове, е по-лесно да живеят

    $ Текст = preg_replace ( "/ word1 | WORD2 | word3 / аз", "\\ 0", $ Текст);

    Ако се използват тагове текстови, тогава има три варианта а) да не се правят на подсветката б), защото потребителят не виждате маркера (освен ако не е много любопитен потребител), можете да направите едно поле индекс, в който няма да има етикети и символи [^ \ w \ x7F- \ xFF \ и] ще бъдат заменени с интервали (тези знаци се изрязват от полето за търсене в самото начало, така че не се прави търсенето на тях). Търсене и осветление в този случай е да се направи на индекса. в) да изберете текста от обичайните полета, предварително нарязани тагове srip_tags) функция (.

    Пълна версия на кода за търсене на, както винаги, в списъка с файлове.

    Подкрепете проекта - споделете линка, благодаря!