Зашто је потребна Луцене?
Претрага је једна од најчешћих операција коју радимо више пута дневно. Ова претрага може бити на више веб-страница које постоје на Вебу или у апликацији Музика или у спремишту кода или у комбинацији свих ових. Могло би се помислити да једноставна релациона база података такође може подржати претрагу. Ово је исправан. Базе података попут МиСКЛ подржавају претрагу пуног текста. Али шта је са Вебом или музичком апликацијом, спремиштем кода или комбинацијом свега овога? База података не може да чува ове податке у својим колонама. Чак и да јесте, биће потребно неприхватљиво време да се покрене оволика претрага.
Машина за претрагу пуног текста може покренути упит за претрагу на милионима датотека одједном. Брзина којом се подаци данас чувају у апликацији је огромна. Покретање претраживања целог текста на оваквом обиму података је тежак задатак. То је зато што информације које су нам потребне могу постојати у једној датотеци од милијарди датотека које се чувају на мрежи.
Како Луцене делује?
Очигледно питање које би требало да вам падне на памет је, како је Луцене тако брза у извршавању упита за пуни текст? Одговор на ово је, наравно, уз помоћ индекса које ствара. Али уместо да креира класични индекс, Луцене користи Обрнути индекси.
У класичном индексу, за сваки документ прикупљамо целу листу речи или израза које документ садржи. У обрнутом индексу, за сваку реч у свим документима чувамо у којем документу и положају се налази ова реч / појам. Ово је алгоритам високог стандарда који веома олакшава претрагу. Размотрите следећи пример креирања класичног индекса:
Доц1 -> "Ово", "је", "једноставно", "Луцен", "узорак", "класично", "обрнуто", "индекс"Доц2 -> "Покретање", "Еластицсеарцх", "Убунту", "Ажурирање"
Доц3 -> "РаббитМК", "Луцене", "Кафка", "", "Спринг", "Боот"
Ако користимо обрнути индекс, имаћемо индексе попут:
Ово -> (2, 71)Луцен -> (1, 9), (12,87)
Апачи -> (12, 91)
Оквир -> (32, 11)
Обрнути индекси су много једноставнији за одржавање. Претпоставимо да ако желимо да пронађемо Апацхе у мојим терминима, имат ћу непосредне одговоре с обрнутим индексима, док ће се код класичне претраге извршавати на комплетним документима које можда није било могуће покренути у сценаријима у стварном времену.
Ток рада луцена
Пре него што Луцене заиста може да претражује податке, потребно је да изврши кораке. Визуелизујмо ове кораке за боље разумевање:
Луцене Воркфлов
Као што је приказано на дијаграму, ево шта се дешава у Луцени:
- Луцене се храни документима и другим изворима података
- За сваки документ, Луцене прво претвара ове податке у обичан текст, а затим анализатори овај извор у обичан текст
- За сваки појам у обичном тексту креирају се обрнути индекси
- Индекси су спремни за претрагу
Уз овај ток посла, Луцене је врло снажан претраживач целокупног текста. Али ово је једини део који Луцене испуњава. Морамо сами да изведемо посао. Погледајмо компоненте индексирања које су потребне.
Луцене Цомпонентс
У овом одељку ћемо описати основне компоненте и основне класе луцена које се користе за креирање индекса:
- Директоријуми: Луцене индекс похрањује податке у уобичајене директоријуме система датотека или у меморију ако вам требају веће перформансе. Избор апликација је у потпуности за чување података где год жели, базе података, РАМ-а или диска.
- Документи: Подаци које доводимо у Луцене енгине морају се претворити у обичан текст. Да бисмо то урадили, правимо објекат Доцумент који представља тај извор података. Касније, када покренемо упит за претрагу, као резултат, добићемо листу докумената који задовољавају упит који смо проследили.
- Поља: Документи се попуњавају збирком поља. Поље је једноставно пар (име, вредност) предмета. Дакле, док креирамо нови објекат Доцумент, морамо га испунити том врстом упарених података. Када је поље обрнуто индексирано, вредност поља је токенизована и доступна је за претрагу. Сада, док користимо поља, није важно чувати стварни пар, већ само обрнуто индексирано. На овај начин можемо одлучити који подаци су само претраживи и који нису битни за чување. Погледајмо пример овде:
Индексирање поља
У горњој табели одлучили смо да сачувамо нека поља, а друга се не чувају. Поље тела није ускладиштено већ индексирано. То значи да ће се е-пошта вратити као резултат када се покрене упит за један од Услова за садржај тела.
- Услови: Термини представљају реч из текста. Термини су, дакле, извучени из анализе и токенизације вредности поља Термин је најмања јединица на којој се покреће претрага.
- Анализатори: Анализатор је најважнији део процеса индексирања и претраживања. Анализатор је тај који претвара обични текст у токене и термине како би се могли претраживати. Па, то није једина одговорност Анализатора. Анализатор користи токенизатор за израду жетона. Анализатор такође обавља следеће задатке:
- Стемминг: Анализатор претвара реч у матичну. То значи да се „цвеће“ претвара у матичну реч „цвет“. Дакле, када се покрене потрага за „цвећем“, документ ће бити враћен.
- Филтрирање: Анализатор такође филтрира зауставне речи попут 'Тхе', 'ис' итд. јер ове речи не привлаче никакве упите које треба покренути и нису продуктивне.
- Нормализација: Овај поступак уклања акценте и друге ознаке знакова.
Ово је само нормална одговорност СтандардАнализер-а.
Пример примене
Користићемо један од многих Мавенових архетипова да бисмо креирали пример пројекта за наш пример. Да бисте креирали пројекат, извршите следећу наредбу у директоријуму који ћете користити као радни простор:
мвн архетип: генериши -ДгроупИд = цом.линукхинт.пример -ДартифацтИд = ЛХ-ЛуценеЕкампле -ДарцхетипеАртифацтИд = мавен-арцхетипе-куицкстарт -ДинтерацтивеМоде = фалсеАко први пут покрећете мавен, требаће неколико секунди да се изврши команда за генерирање, јер мавен мора да преузме све потребне додатке и артефакте да би извршио задатак генерисања. Ево како изгледа резултат пројекта:
Постављање пројекта
Када креирате пројекат, слободно га отворите у свом омиљеном ИДЕ-у. Следећи корак је додавање одговарајућих Мавен зависности у пројекат. Ево пом.кмл датотеку са одговарајућим зависностима:
Коначно, да бисмо разумели све ЈАР-ове који су додати пројекту када смо додали ову зависност, можемо покренути једноставну Мавен наредбу која нам омогућава да видимо цело дрво зависности за пројекат када му додамо неке зависности. Ево наредбе коју можемо користити:
мвн зависност: стаблоКада покренемо ову наредбу, приказаће нам следеће стабло зависности:
Коначно, креирамо класу СимплеИндекер која се изводи
импорт јава.ио.Филе;
импорт јава.ио.ФилеРеадер;
импорт јава.ио.ИОЕкцептион;
увоз орг.апацхе.луцен.анализа.Анализер;
увоз орг.апацхе.луцен.анализа.стандард.СтандардАнализер;
увоз орг.апацхе.луцен.документ.Документ;
увоз орг.апацхе.луцен.документ.СторедФиелд;
увоз орг.апацхе.луцен.документ.Текстуално поље;
увоз орг.апацхе.луцен.индекс.ИндекВритер;
увоз орг.апацхе.луцен.индекс.ИндекВритерЦонфиг;
увоз орг.апацхе.луцен.продавница.ФСДирецтори;
увоз орг.апацхе.луцен.утил.Верзија;
јавни разред СимплеИндекер
привате статиц финал Стринг индекДирецтори = "/ Корисници / схубхам / негде / ЛХ-ЛуценеЕкампле / Индек";
приватни статички завршни низ дирТоБеИндекед = "/ Усерс / схубхам / негде / ЛХ-ЛуценеЕкампле / срц / маин / јава / цом / линукхинт / екампле";
публиц статиц воид маин (Стринг [] аргс) баца изузетак
Филе индекДир = нова датотека (индекДирецтори);
Датотека датаДир = нова датотека (дирТоБеИндекед);
Индексер СимплеИндекер = нови СимплеИндекер ();
инт нумИндекед = индекс.индекс (индекДир, датаДир);
Систем.напоље.принтлн ("Укупно индексираних датотека" + нумИндексирано);
привате инт индек (Филе индекДир, Филе датаДир) баца ИОЕкцептион
Анализатор анализатора = нови СтандардАнализер (верзија.ЛУЦЕНЕ_46);
ИндекВритерЦонфиг цонфиг = нев ИндекВритерЦонфиг (Верзија.ЛУЦЕНЕ_46,
анализатор);
ИндекВритер индекВритер = нови ИндекВритер (ФСДирецтори.отворен (индекДир),
цонфиг);
Датотека [] датотеке = датаДир.листФилес ();
за (Датотека ф: датотеке)
Систем.напоље.принтлн ("Датотека за индексирање" + ф.гетЦаноницалПатх ());
Документ документа = нови документ ();
доц.додај (нови ТектФиелд („садржај“, нови ФилеРеадер (ф)));
доц.адд (нев СторедФиелд ("филеНаме", ф.гетЦаноницалПатх ()));
индекВритер.аддДоцумент (доц);
инт нумИндекед = индекВритер.макДоц ();
индекВритер.Близу();
ретурн нумИндекед;
У овом коду смо управо направили инстанцу документа и додали ново поље које представља садржај датотеке. Ево резултата који добијемо када покренемо ову датотеку:
Датотека за индексирање / Корисници / схубхам / негде / ЛХ-ЛуценеЕкампле / срц / маин / јава / цом / линукхинт / екампле / СимплеИндекер.јаваУкупно индексираних датотека 1
Такође, унутар пројекта креира се нови директоријум са следећим садржајем:
Подаци о индексу
Анализираћемо шта су све датотеке креиране у овом индексу у више лекција о Луцене-у.
Закључак
У овој лекцији смо погледали како функционише Апацхе Луцене и направили смо и једноставан пример апликације која се заснивала на Мавен-у и јави.