Fulltext vyhľadávanie v CouchDB, pokročilé hľadanie.

V minulej časti sme sa naučili, ako pomocou Lucene rýchlo a jednoducho vyhľadávať v CouchDB. Dnes sa pozrieme okrem iného na to, ako sa vysporiadať s použitím diakritiky pri vyhľadávaní v našej databáze.

Diakritika

Pri revidovaní prvého článku o vyhľadávaní v CouchDB ma editor M.Malý upozornil na skutočnosť, na ktorú mnohí vývojári veľmi radi zabúdajú. Citujem:

“Diakritika! Nelze psát bez diakritiky. Nejsme geekovský hackazin z roku 1994, takhle by mi to korektorka hodila na hlavu, nehledě na to, že v slovenštině nejsem tak dobrý, abych dokázal říct, kde budou mäkčene a dĺžne. :)”

S týmto názorom sa samozrejme plne stotožňujem. Publikovať akékoľvek texty bez použitia diakritiky je možné v súčasnosti prirovnať k spáchaniu ťažkého trestného činu (nadsazujem).

Dnes začneme presne tam, kde sme v minulej časti skončili. Namiesto latinského textu (lorem ipsum) ale použijeme v našej databáze text s diakritikou.

Možnosť č. 1 – Lucene Analyzér

Lucene nám dáva možnosť všetky záznamy, ktoré vkladáme do indexu, zároveň analyzovať a upravovať. Existuje veľké množstvo, či už vstavaných, ale aj analyzérov tretích strán, ktoré poskytujú užívateľovi množstvo zaujímavých funkcií. Základný vstavaný analyzér napríklad dokáže vložený text previesť na malé písmená a odstráni všetky anglické spojky a predložky („the“, „and“, …). Existuje analyzér určený pre texty v češtine a slovenčine. V rámci textu korektne vyhľadáva aj pri použití diakritiky, správne rozlišuje malé/veľké písmená, no podobne ako anglická verzia má problémy so skloňovaním.

Príklad:

"fulltext": {
      "showName": {
          "index": "function(doc)
             {
                result = new Document();
                result.add(doc.title, {'field':'title', 'store':'yes','analyzer':'czech'});
                return result;
             }"
          }
      }
}

Ďaľší problém sa objaví až pri multijazyčných projektoch. Pri vytváraní view s použitím analyzéru na odstránenie diakritiky by sme preto mali najprv zistiť jazykovú mutáciu prichádzajúceho textu a na základe toho zvoliť korektný analyzér.

Možnosť č. 2 – Odstránenie diakritiky pomocou JS

Alternatívou k Lucene analyzéru je odstrániť diakritiku priamo pri zadávaní textu do indexu. Môže sa zdať, že táto metóda nie je vhodná, ak si uvedomíme, že Lucene nám poskytuje nástroj, ktorý je na to presne určený. No tento spôsob je možné použiť aj inde. Napríklad pri automatickom generovaní url z názvu článku.

Príklad: (javascriptová funkcia na odstránenie diakritiky, stačí ju použiť pri vytváraní view)

var defaultDiacriticsRemovalMap = [
   {'base':'A', 'letters':/[u0041u24B6uFF21u00C0u00C1u00C2u1EA6u1EA4u1EAAu1EA8u00C3u0100u0102u1EB0u1EAEu1EB4u1EB2u0226u01E0u00C4u01DEu1EA2u00C5u01FAu01CDu0200u0202u1EA0u1EACu1EB6u1E00u0104u023Au2C6F]/g},
   {'base':'AA','letters':/[uA732]/g},
  //ďaľšie znaky, celý script nájdete na http://stackoverflow.com/questions/3939266/javascript-function-to-remove-diacritics
];
var changes;
function removeDiacritics (str) {
   if(!changes) {
       changes = defaultDiacriticsRemovalMap;
   }
   for(var i=0; i<changes.length; i++) {
       str = str.replace(changes[i].letters, changes[i].base);
   }
   return str;
}

Samozrejme je nutné na hľadanom reťazci odstrániť diakritiku manuálne na strane aplikácie.

Vyhľadávanie v prílohách

CouchDB umožňuje ku každému dokumentu priložiť rôzne druhy súborov (obrázok, mp3, pdf a iné) ako prílohu. Tieto súbory častokrát obsahujú rôzne metadáta. Pri mp3 sú to napríklad autor, názov skladby či jej poradie v rámci celého cd. Aby sme mohli rozšíriť naše vyhľadávanie aj o tieto dáta, použijeme pre Lucene vytvorenú nadstavbu Apache Tika, ktorá je určená na prácu s metadátami súborov uložených v CouchDB. Pre správne fungovanie tejto nadstavby je nutné korektne nastaviť content-type vkladaných súborov.

Apache Tika

Apache Tika je toolkit určený na prehľadávanie obsahu, metadát a analýzu dokumentov. Vývoj tohto toolkitu sa začal v roku 2007 a v roku 2008 sa stal subprojektom Apache Lucene. V súčasnosti má podporu pre viac ako 1.200 formátov, z ktorých dokáže extrahovať metadáta a štrukturovaný text a v spolupráci s Lucene ich ukladať ako vlastný index. Vďaka tomu je možné vyhľadávanie priamo v dokumentoch uložených ako _attachement v CouchDB.

Správa indexov

Pre správne a optimálne fungovanie Lucene je potrebné spravovať a optimalizovať indexy, ktoré používa.

Informáciu o indexe, z ktorého môžeme zistiť napríklad poslednú aktualizáciu indexu alebo počet indexovaných dokumentov, získame po zaslaní GET požiadavky

http://localhost:5984/<db>/_fti/_design/foo/<index>

Aby sme dosiahli vyššiu rýchlosť vyhľadania môžeme použiť optimalizáciu indexu, ktorá zabezpečí, že sa celý index prepíše do jedného segmentu. Či je potrebné index optimalizovať nám poskytne informácia o indexe – položka typu boolean „optimized“:tru­e/false.

POST http://localhost:5984/<db>/_fti/_design/foo/<index>/_optimize

Pri zmenách indexovacej funkcie sa nám môže stať, že na disku ostanú uložené staré indexy, ktoré nám zbytočne zaberajú miesto. Odstránenie týchto indexov dosiahneme zaslaním POST požiadavky

POST http://localhost:5984/<db>/_fti/_cleanup

Záver

V seriálu sme si ukázali, ako vyhľadávať nad dokumentovo orientovanou databázou CouchDB pomocou nástroja Lucene a predstavili sme si jeho doplnok na vyhľadávanie v prílohách Tika. Stačí už len vyjsť zo zabehnutej rutiny a skúsiť niečo nové.

Michal (Balvan) Bartha je nadšený programátor. Baví ho vyhľadávanie nových technológií a ich aplikácia na reálne problémy. Viac na LinkedIn

Věděli jste, že nám můžete zasílat zprávičky? (Jen pro přihlášené.)

Zatím nebyl přidán žádný komentář, buďte první!

Přidat komentář
Zdroj: https://www.zdrojak.cz/?p=3579