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

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

Така че при разработването на следващия проект е да се намери проблем. В таблиците в базата данни не са малки (100 000 записи), плюс все още трябва да се търсят няколко, така че, като възможността за конвенционалния "% заявка%" отпадна от само себе си.

По-рано аз бях mnoGoSearch на търсачката. но помня помия му API (понякога skaladyvalos впечатление, че той е написал индианците с 5 класа на енорийски училище) спадна и тази версия.

В резултат на това имаше 2 възможности:

  1. напиши търсене въз основа на изграждане на своите индекси, както и съхраняване на тези индекси, например, в BerkleyDB;
  2. не изобретяваме колелото и да вземат един от най-бързите търсачки - Сфинкса.

Аз избрах втория вариант :)

Между другото, Сфинкса - е проект на нашия сънародник Андрей Aksenov. Заслужава да се отбележи, че Андрей достатъчно време и усилия, а не само за непрекъснато подобряване на проекта, но също така и да участва активно в подкрепа на потребителите opreativno отговори на въпроси по английски и руски език форума. За това той благодаря много!

И така, нека започнем да практикуват. Създаване на стандарта и не създава никакви проблеми.

Изтеглете архива с източника (най-новата версия, както и на това писание), разопаковането и инсталирате:

# ./configure
# грим
# Уверете се инсталира (в корена)

Като следвате тези три отбора FreeBSD получих готовия за употреба продукт. Но в Debian имаше една минута да се забъркваш (въпреки че за първи път отне половин час :) и изпълнете:

# Sudo правоспособност инсталирате libmysql ++ - Дев libmysqlclient15-Dev checkinstall

След това всичко е добре спечелени.

обучение

Вече сте готови да създадете индекса (предполагам, че имате проект с готова база данни). Нашата база данни има следната структура:

Ние ще търсим в името на продукта, описанието и маркерите на. По този начин, ние трябва да се създаде индекс на тези области. За да направите това, създайте 2 директорията / Начало / Larin / данни / - тук ние съхраняваме файловете на индекса, и / Начало / Larin / дневник / - веднага влиза и конфигурационен файл /home/larin/sphinx.conf

Това е всичко, конфигурацията, Сфинкса е готов да започне да индексира вашите данни с гигантска скорост :) За повече информация относно конфигурирането на дневник на официалния уебсайт в раздела за документация. Той е на английски, но трудностите не могат да бъдат причина, тя е написана просто и изгодно.

морфология

Spninx поддържа индексиране (и следователно търсенето), като се вземат предвид морфологията на български и английски език. Подкрепа морфология осъществява чрез използване на Изхождайки.

Изхождайки - процес, който води до изолиране на стволови на дума от сложните форми на думите.

Тук са най-линии в довереник отговорен за конфигурация:

индексиране

Започнете създаването на индекса:
# Indexer -config /home/larin/sphinx.conf -всички

Всичко се създава индекс! Нека да търсите!

инструмент за търсене е подходящ за отстраняване на грешки и тестване на производителността на индекс. Пример за приложение:
# Търсене -config търсене /home/larin/sphinx.conf фраза

Но за истинска работа, трябва да се започне демон сфинкса - searchd:
# Searchd -config /home/larin/sphinx.conf

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

скрипт например

Това е всичко. И ние отново (както е в случая с UML и кеширане) Уверете се, че всички гений е проста :)

За съжаление, аз направих всичко както е описано и на английски език, отиде да търсите гръм и трясък, и руски voobsche не търси.
Хвърля: Забележка: Неопределен индекс: мачове в /bhome/part3/03/avenirru/avenir.ru/www/test.php по линия 37

Умения 37 линия е: ако ($ резултат is_array ($ резултат [ 'мачове']))

т.е. в масива не съществува, тъй като не намери нищо (((
Тема, който е изправен пред трудности в руски?

тук съм забелязал
за индексиране при настройките, които са описани произтича изход: "новини" индекс индексиране ...
ГРЕШКА: индекс "новини": sql_query_pre [0]: Няма системни променливи имената "(DSN = MySQL: // avenir_ru: ***@baze.avenir.ru: 64000 / avenir_ru).
общо 0 документи, 0 байта
общо 0.051 сек, 0.00 байта / сек, 0.00 документи / сек

Той казва, че не разбира ред: sql_query_pre = SET NAMES cp1251

Коя версия на MySQL?

С версия 5 и сложи измисли тази грешка изчезна. Но руската търсене не излиза, сегашната англичаните

Тук е моят довереник помощ, за да се коригира това, което не е наред (таблици и бази данни към utf8):
източник новини
тип = MySQL
sql_host = mysql.baze.avenir.ru
sql_user = avenir_ru
sql_pass = ******
sql_db = avenir_ru
sql_port = 64547

sql_query_pre = SET CHARACTER_SET_RESULTS = utf8
sql_query_pre = SET ИМЕНАТА utf8
sql_query_pre = набор от символи SET utf8

sql_query = SELECT n.news_id, n.title, n.body ОТ `news` п

sql_query_info = SELECT * от 'news` WHERE` news_id` = $ номер
sql_ranged_throttle = 0
>

индекс новини
източник = новини
път = / bhome / Част 3/03 / avenirru / сфинкс / sphinks / Var / данни / новини
docinfo = екстернант
mlock = 0
морфология = stem_ru, stem_en
min_word_len = 2
charset_type = UTF-8
charset_table = 0-9, A..Z-> a..z, _, a..z, U + A8-> U + B8, U + B8, U + C0..U + DF-> U + E0..U + FF, U + E0..U + FF
min_infix_len = 2
enable_star = 1
>

searchd
адрес = 127.0.0.1
порт = 3312
влезте = /bhome/part3/03/avenirru/sphinx/sphinks/var/searchd.log
query_log = /bhome/part3/03/avenirru/sphinx/sphinks/var/query.log
read_timeout = 5
max_children = 30
pid_file = /bhome/part3/03/avenirru/sphinx/sphinks/var/searchd.pid
max_matches = 1000

// Сега получаваме тези продукти сортирани по уместност
$ ID_LIST = свие ( ',', $ идентификатори);
$ Sql ​​= sprintf ( "SELECT * от 'product` WHERE` product_id` В (% S) РЕД ОТ ОБЛАСТ (` product_id`,% т) ", $ ID_LIST, $ ID_LIST);

// Всички допълнително да изпълните тази молба, и да се насладите на резултатите

и заявката се изпълнява от някой от Сфинкса.

Тази заявка се извършва на класа си работа с базата данни, добре, или просто mysql_query () функция)))

))) Благодаря ти, че това е само ако не е много ясно за какво усилване на скоростта? Ако се окаже, вече изпълнен 2 заявка. Първо той Сфинкса в техните индекси, а след това друг, и ние сме в базата данни?
Съжалявам за глупавите въпроси.)))

))) Благодаря ти, че това е само ако не е много ясно за какво усилване на скоростта? Ако се окаже, вече изпълнен 2 заявка. Първо той Сфинкса в техните индекси, а след това друг, и ние сме в базата данни?
Съжалявам за глупавите въпроси.)))

Печалбата е, че Сфинкса, за разлика от MySQL търси записи в индекса си с гигантска скорост и във всички области.
И ние правим само една молба (този с най-IN), който е много бърз. защото търсене е основният ключ в таблицата. Къде виждате искане 2.

Когато индексиране? Тъй като този процес тече много по-рядко, отколкото с препратки към търсенето. Имам някои сайтове Повторно писти само веднъж на ден)

Pol_uha. че все още не разбирам?

И ако имах нужда от полета в таблицата са индексирани, защо Сфинкса просто просто не ги вземе и не показва, и все още трябва да направи заявка към базата данни?
Благодаря ви много, супер блог. Прочети други статии.)))

Индексът на Сфинкса, съхранявани на данните, а не самите данни. Виждате ли разликата?

Радвам се, че блогът е като и помощ)

Разберете)))
Или пък може да ви помогне в тази задача:
Има маса с имената на животни и лична градове, в които те се намират)))
Индексирани таблица 2 съответно: това и това.
Мъжът донесе костенурка или костенурка София в Москва, и т.н.
Как мога да направя на взаимодействието между тези 2 таблици? Т.е. Дали всички костенурки и проверен за самоличност градове, в които живеят и са сравнени с идентификационния номер на градовете на масата, където са имената и в сравнение с 2-ра дума, в този случай, "София"?
OWL. ))))

И така, има 2 таблици:
град [town_id, town_title] и
животните [animal_id, animal_title, town_id]

В съответствие с това е необходимо да ги комбинирате, за да създадете правилната индекса. защото Ние ще търсим животни е основният ключ в резултатите от заявката, ние ще animal_id.
получаваме:
sql_query = SELECT animal_id, animal_title, town_title ОТ `animal` отляво JOIN` town` т ON a.town_id = t.town_id

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

ZY НАЛЯВО JOIN е направен за случая, когато не е на всички малки животни, дадени градския живот.

Здравейте))) да се карат отново. И не подкани да се направи абсолютно Сфинкса търсене. Т.е. Когато напишете "Black хипопотам"
Той не даде всички записи, където пише "черен" и "хипопотам" отделно, но само там, където има една фраза изцяло?

Проблемът е, че обикновено търсене на MySQL е много бавен.

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

Т.е. използван като "% ...%". Документацията се казва, че когато се използва като "% ...%" индекси не работят и да се използват някои "Turbo Бойер-Мур алгоритъм" (уж).
Той работи много бавно. Никога не съм се изчака края на търсенето, дори и двете автономни.

Търсене по договора - е търсенето на тримата. Реших да използвам Сфинкса. SphinxQL, защото е по-лесно за него да копирате.

Сега, както аз го разбирам, че трябва да направим три източника:
1.) Изток. клиенти.
2.) Изток. TC.
3.) Изток. договори.

И трите индекса:
1.) За нуждите на клиентите индекс от 1.
2.) Притежателят има TS, т.е. TC нуждае индекс от 1 и 2.
3.) За договори от 1, 2, 3.

Проблемът се състои в това, че, от една страна, в себе си, аз не се чака изтичането на създаването на индекса, най-малко на клиенти (в таблицата, но само

15500 записи).
индекс Тест маса е създадена с 149 записа.
Защо сте го направили толкова дълго? Какво съм аз греша?
На второ място, бих искал да получава данни и не самоличност.
Може би това се прави с помощта на Сфинкса (това, че, например, прави заявка към MySQL)?

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