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

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

Но в същото време тя налага някои ограничения, по-специално, се възползва MyISAM маса тип, не търсите думи с по-малко от 4-EX знаци, създаване на допълнителни показатели. Търсене чрез изражение е по-малко удобен за предприемача, тъй като по-бавното усложнява фразите за търсене. Често срещан недостатък на двата подхода е невъзможността за спиране. Така например, в каталога на продукти prisutstvet продукт "Букет от жълти рози", при търсене на фразата "червени рози" на потребителя няма да видите тази позиция в резултатите. И аз бих искал да машина малко да се разбере естествен език. За да се реши този проблем е лесно в PHP и това ще ни помогне phpMorphy. phpMorphy следните задачи:

  • Лематизацията (на нормалната форма на думата)
  • Първи всички форми на думата
  • Първи граматическа информация за думата (част от речта, случай, спрежение, и т.н.)
  • Повторно оформяне думи, в съответствие с предварително определени граматични характеристики
  • Промяна на формата на думи в даден модел

Тя поддържа различни кодировки:

  • всички еднобайтовата (прозорци-1251, ISO-8859- *, и т.н.)
  • Unicode кодировки - UTF-8, UTF-16LE / са, UTF-32, UCS2, ucs4.

Трябва да се отбележи, че използването на тази библиотека ще създаде допълнително натоварване на сървъра по време на инициализация и експлоатация.

За да започнете, изтеглете файла библиотека и го разархивирайте, например, в "phpmorphy" папка. Доколкото е възможно в директорията на разположение на уеб сървър. На следващо място, изтеглите речника на конкретен език и набор от символи и да ги извлечете в папка "phpmorphy / dicts" на библиотеката. За да нулирате библиотеката, свържете common.php файл от папката "phpmorphy / SRC" и ще изложи на настройките:

За да търсите, ние ще използваме следния подход: думи от израза за търсене ще доведе до първоначалната си форма, индекс на съдържание за търсене, както и, в резултат на което няколко думи по оригиналния начин, както и в зависимост от честотата на повторение и местоположението на думите - да го попитам тегло и т.н. - за да търсите индекс на маса фраза за търсене и класиране на резултатите от теглото.

За да започнете и индексиране на съдържанието на която ще настъпи на търсенето. В този пример, търсенето е по цветове в каталога. Ние имаме продукт, ID, име, кратко и пълно описание. Encoding - UTF-8, съпоставя - utf8_bin. Създайте таблица със стоките:

и таблица, в която индексът ще се съхраняват:

Ето `word` - ключова дума,` prod_id` - идентификационен номер на продукта, `weight` - теглото на думи. Всеки запис се характеризира с уникална двойка дума продукт.

На следващо място, да вземе от базата данни на всички записи, за продуктите:

Когато се работи с библиотеката PhpMorphy трябва да се помни, че условията в речника, се съхраняват в горния случай, за удобство превежда съдържание само с главни букви. Също така, може да получите на думата с буквата "Е". съпоставя utf8_bin ни гарантира да няма грешки, свързани с уникални ключове в `prod2search` маса. като буквата "д" и "е" няма да бъде един знак, но това ще бъде погрешно, ако думите "зелена" и "зелена" ще бъдат индексирани отделно. Ето защо, ние замени буквата "Е" до "д". Подробното описание може да съдържа HTML-тагове тях, ние няма да ги индексира и трябва да се отървете от.

Ето един скрипт, който индексира продукти и дават допълнителни обяснения.

Това регулярен израз разделя съдържанието на отделни думи. "U" модификатор се използва за кирилица. Трябва да се помни, че буквата "Е" не попада в обхвата на "аз". Регулярният израз правилно обработва следния ред:

Array $ word_pma [1] съдържа списък на отделни думи.

под $ Морфи имаме предвид phpMorphy инстанция на класа. $ Morphy-> lemmatize () води до една дума в ред или набор от думи към първоначалната форма и връща масив от формата "оригиналния думата" => масив със списък от думи във всяка граматическа форма. По подразбиране lemmatize () метод сравнява дума в речниците, с отрицателен резултат от опита си да формират основната форма на вътрешни правила, а ако това не помогне се връща FALSE вместо масив. В нашия пример, ние използвахме само руската лексика, но също така да изберете английски думи. Ето защо, когато не е възможно да се образува първоначалната форма ние индексирани входящо дума:

се повтаря няколко пъти в кода, защото трябва да се постави различен грамаж според, в зависимост от тяхното местоположение. Според титлата си поставихме теглото 3, се казва в кратко описание - 2, в пълен размер - 1. повторение на думи се увеличи теглото му.

В резултат на това, ние получаваме масив $ дума за един и същ продукт, който има формата на "дума" => "тегло". Тези данни са въведени в таблица `prod2search`:

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

Този скрипт ви позволява да нулев индекс на цялото съдържание, и служи само като допълнителен инструмент. В реално прилагане, трябва да индексираме само текстово съдържание, когато добавяте или редактирате даден запис. За да индексира съдържанието използвате скрипта по-горе, но ние няма да използва една линия и ще работи с един профил. При редактиране, преди да извършат индекс маса `prod2search` или преместване на стоки на - да се премахнат остарелите записи:

където $ prod_id - ID, за да редактирате или изтриете продукта.

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

В крайна сметка съдържанието се индексира и таблицата `prod2search` изпълнен с данни, вие сте готови да приложат на търсенето.

Нека разгледаме искането. Ние считаме, записа в `prod2search` масата. в които по думите на списъка на думите в фраза КЪДЕ търсене `s`.`word` ПО (". спуквам ( ",", $ SQL). "). Когато търсите няколко думи, няколко думи са един и същ продукт, за да се гарантира, че стоките не са дублирани като резултат ние група резултатите по продукти GROUP BY `s`.`prod_id`. В този случай, ние добавяме теглото намери думи за един продукт SUM ( `weight`) AS` weight_sum`. Например, ние търсим "червени рози" - стоките, в които и двете думи се появяват в описанието, а теглото е по-голяма от тази на продукта, с една дума. Примерни резултати класираме по уместност, т.е. теглото на ORDER BY `weight_sum` DESC. Да, когато се търсят няколко думи в резултат имаме само тези стоки, описанието на които всички там са хванати в капана на думите на заявката, ние смятаме, колко много думи за едни и същи продукти намерени COUNT ( `s`.`prod_id`) AS` num` и определя условия и КАТО `num` =" .count ($ SQL). ". В този случай, реализираните логически "и" свързващи думи в една фраза за търсене, за логическо "ИЛИ" състояние трябва да се пропуска. В резултат на това, ние получаваме списък с идентификатори на продукти, които отговарят на критериите за търсене. За по-голяма яснота, записът с стоките вземем вложено заявка, но на практика, може би, най-доброто решение е да се вземе списък с продукти за индивидуална заявка от техните документи за самоличност. Заявки за логическото "ИЛИ" и границите ще работи много по-бързо.

По този начин, в примера въведохме цвят на стоките търсене морфологичен на руски, използвайки PHP, MySQL и PhpMorphy. Този метод може да се приложи към всеки участък от посетителя на сайта, а вие да се обединим, само чрез даване на потребителя информацията, която търсеше.

Свързани статии

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