Fulltextové vyhľadávanie so solr

1. Prehľad

V tomto článku preskúmame základný koncept vyhľadávacieho nástroja Apache Solr - fulltextové vyhľadávanie.

Apache Solr je rámec otvoreného zdroja určený na prácu s miliónmi dokumentov. Prejdeme si jeho základné schopnosti s príkladmi pomocou knižnice Java - SolrJ.

2. Konfigurácia Maven

Vzhľadom na to, že Solr je open source - môžeme si jednoducho stiahnuť binárny súbor a server spustiť osobitne z našej aplikácie.

Na komunikáciu so serverom definujeme závislosť Maven pre klienta SolrJ:

 org.apache.solr solr-solrj 6.4.2 

Najnovšiu závislosť nájdete tu.

3. Indexovanie údajov

Na indexovanie a vyhľadávanie údajov musíme vytvoriť a jadro; vytvoríme jeden s menom položka indexovať naše údaje.

Skôr ako to urobíme, musíme indexovať údaje na serveri, aby sa dali prehľadávať.

Existuje mnoho rôznych spôsobov, ako môžeme indexovať údaje. Môžeme použiť obslužné nástroje na import údajov na import údajov priamo z relačných databáz, nahrať údaje pomocou Solr Cell pomocou Apache Tika alebo nahrať údaje XML / XSLT, JSON a CSV pomocou obslužných nástrojov indexu.

3.1. Indexovanie riešeného dokumentu

Môžeme indexovať údaje do a jadro tvorením SolrInputDocument. Najprv musíme vyplniť dokument našimi údajmi a potom iba zavolať API SolrJ na indexovanie dokumentu:

SolrInputDocument doc = nový SolrInputDocument (); doc.addField ("id", id); doc.addField ("description", description); doc.addField ("kategória", kategória); doc.addField ("cena", cena); solrClient.add (doc); solrClient.commit ();

Poznač si to id by mali byť prirodzene jedinečné pre rôzne položky. Mať id už indexovaného dokumentu tento dokument aktualizuje.

3.2. Indexovacie fazule

SolrJ poskytuje API na indexovanie fazule Java. Ak chcete fazuľu indexovať, musíme ju anotovať pomocou @Lúka anotácie:

verejná trieda Položka {@Field private String id; @ Pole súkromný popis reťazca; @ Pole súkromná kategória reťazcov; @ Field private float cena; }

Keď máme fazuľu, indexovanie je priame:

solrClient.addBean (položka); solrClient.commit ();

4. Vyriešené otázky

Vyhľadávanie je najsilnejšou funkciou programu Solr. Keď máme dokumenty indexované v našom úložisku, môžeme vyhľadávať kľúčové slová, frázy, rozsahy dátumov atď. Výsledky sú zoradené podľa dôležitosti (skóre).

4.1. Základné dotazy

Server sprístupňuje API pre vyhľadávacie operácie. Môžeme buď zavolať / vybrať alebo /dopyt spracovatelia žiadostí.

Urobme jednoduché vyhľadávanie:

SolrQuery dotaz = nový SolrQuery (); query.setQuery ("brand1"); query.setStart (0); query.setRows (10); QueryResponse response = solrClient.query (dopyt); Zoznam položiek = response.getBeans (Item.class);

SolrJ interne použije hlavný parameter dotazu q vo svojej žiadosti na server. Počet vrátených záznamov bude 10, indexovaných od nuly, keď začať a riadkov nie sú uvedené.

Vyššie uvedený vyhľadávací dopyt vyhľadá všetky dokumenty, ktoré obsahujú celé slovo „Brand1“ v ktoromkoľvek zo svojich indexovaných polí. Poznač si to pri jednoduchých vyhľadávaniach sa nerozlišujú veľké a malé písmená.

Pozrime sa na ďalší príklad. Chceme vyhľadať akékoľvek slovo obsahujúce „Rand“, ktorý začína ľubovoľným počtom znakov a končí iba jedným znakom. Môžeme použiť zástupné znaky * a ? v našom dotaze:

query.setQuery ("* rand?");

Vyriešené dotazy tiež podporujú boolovské operátory ako v SQL:

query.setQuery ("brand1 AND (Washing OR Refrigerator)");

Všetci boolovskí operátori musia mať všetky veľké písmená; tie, ktoré sú podporované analyzátorom dotazov, sú A, ALEBO NIE, + a -.

A čo viac, ak chceme vyhľadávať konkrétne polia namiesto všetkých indexovaných polí, môžeme ich v dotaze určiť:

query.setQuery ("description: Brand * AND category: * Washing *");

4.2. Frázové dotazy

Až do tohto okamihu náš kód hľadal kľúčové slová v indexovaných poliach. Môžeme tiež vyhľadávať frázy v indexovaných poliach:

query.setQuery ("práčka");

Keď máme frázu ako „Práčka", Štandardný syntaktický analyzátor dotazov spoločnosti Solr to analyzuje na"Práčka ALEBO práčka„. Ak chcete vyhľadať celú frázu, môžeme výraz pridať iba do úvodzoviek:

query.setQuery ("\" Práčka \ "");

Na vyhľadanie slov v konkrétnej vzdialenosti môžeme použiť vyhľadávanie podľa vzdialenosti. Ak chceme nájsť slová, ktoré sú od seba vzdialené najmenej dve slová, môžeme použiť nasledujúci dotaz:

query.setQuery ("\" Umývacie zariadenie \ "~ 2");

4.3. Rozsahové dotazy

Dopyty na rozsah umožňujú získať dokumenty, ktorých polia sú medzi konkrétnymi rozsahmi.

Povedzme, že chceme nájsť položky, ktorých cena sa pohybuje od 100 do 300:

query.setQuery ("cena: [100 AŽ 300]");

Dotaz vyššie nájde všetky prvky, ktorých cena je medzi 100 až 300 vrátane. Môžeme použiť „}“A„{”Na vylúčenie koncových bodov:

query.setQuery ("cena: {100 AŽ 300]");

4.4. Filtrovať dotazy

Filtračné dotazy je možné použiť na obmedzenie množiny výsledkov, ktoré je možné vrátiť. Dotaz filtra nemá vplyv na skóre:

SolrQuery dotaz = nový SolrQuery (); query.setQuery ("cena: [100 AŽ 300]"); query.addFilterQuery ("description: Brand1", "category: Home Appliances");

Všeobecne bude filtračný dotaz obsahovať bežne používané dotazy. Keďže sú často opakovane použiteľné, ukladajú sa do vyrovnávacej pamäte, aby bolo vyhľadávanie efektívnejšie.

5. Fazetové vyhľadávanie

Fazetovanie pomáha usporiadať výsledky vyhľadávania do skupinových počtov. Môžeme fazetovať polia, dopyt alebo rozsahy.

5.1. Fazetovanie v teréne

Napríklad chceme získať súhrnný počet kategórií vo výsledku vyhľadávania. Môžeme pridať kategórie pole v našom dotaze:

query.addFacetField ("kategória"); QueryResponse response = solrClient.query (dopyt); Zoznam facetResults = response.getFacetField ("kategória"). GetValues ​​();

The facetResults bude obsahovať výsledky každej kategórie vo výsledkoch.

5.2. Facetovanie dopytov

Fazetovanie dotazov je veľmi užitočné, keď chceme vrátiť počet poddotazov:

query.addFacetQuery ("Umývanie ALEBO Chladnička"); query.addFacetQuery ("Značka2"); QueryResponse response = solrClient.query (dopyt); Mapa facetQueryMap = response.getFacetQuery ();

Výsledkom je, že facetQueryMap bude mať počet fazetových otázok.

5.3. Facetovanie rozsahu

Fazetovanie rozsahu sa používa na získanie počtu rozsahov vo výsledkoch vyhľadávania. Nasledujúci dopyt vráti počty cenových rozsahov medzi 100 a 251, s odstupom 25:

query.addNumericRangeFacet ("cena", 100, 275, 25); QueryResponse response = solrClient.query (dopyt); Zoznam rangeFacets = response.getFacetRanges (). Get (0) .getCounts ();

Okrem číselných rozsahov podporuje Solr aj rozsahy dátumov, fazetovanie intervalov a fazetovanie.

6. Stlačte Zvýraznenie

Možno budeme chcieť, aby boli kľúčové slová v našom vyhľadávacom dopyte vo výsledkoch zvýraznené. To vám pomôže, aby ste získali lepší obraz o výsledkoch. Poďme indexovať niektoré dokumenty a definovať kľúčové slová, ktoré sa majú zvýrazniť:

itemSearchService.index ("hm0001", "práčka značky 1", "domáce spotrebiče", 100f); itemSearchService.index ("hm0002", "chladnička Brand1", "domáce spotrebiče", 300f); itemSearchService.index ("hm0003", "stropný ventilátor Brand2", "domáce spotrebiče", 200f); itemSearchService.index ("hm0004", "Brand2 umývačka riadu", "Umývacie zariadenie", 250f); SolrQuery dotaz = nový SolrQuery (); query.setQuery ("Spotrebiče"); query.setHighlight (true); query.addHighlightField ("kategória"); QueryResponse response = solrClient.query (dopyt); Mapa> hitHighlightedMap = response.getHighlighting (); Mapa highlightedFieldMap = hitHighlightedMap.get ("hm0001"); Zoznam highlightedList = highlightedFieldMap.get ("kategória"); Reťazec highLightedText = highlightedList.get (0);

Dostaneme highLightedText ako "Domov Spotrebiče. Upozorňujeme, že hľadané kľúčové slovo Spotrebiče je označený . Predvolená značka na zvýraznenie, ktorú používa Solr, je , ale môžeme to zmeniť nastavením pre a príspevok tagy:

query.setHighlightSimplePre (""); query.setHighlightSimplePost ("");

7. Vyhľadajte návrhy

Jednou z dôležitých funkcií, ktoré Solr podporuje, sú návrhy. Ak kľúčové slová v dotaze obsahujú pravopisné chyby alebo ak chceme navrhnúť automatické doplnenie hľadaného kľúčového slova, môžeme použiť funkciu návrhov.

7.1. Kontrola pravopisu

Štandardná obslužná rutina vyhľadávania neobsahuje komponent kontroly pravopisu; musí byť nakonfigurovaný manuálne. Existujú tri spôsoby, ako to urobiť. Podrobnosti o konfigurácii nájdete na oficiálnej wiki stránke. V našom príklade použijeme IndexBasedSpellChecker, ktorá používa indexované údaje na kontrolu pravopisu kľúčových slov.

Vyhľadajme kľúčové slovo s pravopisnou chybou:

query.setQuery ("hme"); query.set ("kontrola pravopisu", "na"); QueryResponse response = solrClient.query (dopyt); SpellCheckResponse spellCheckResponse = response.getSpellCheckResponse (); Návrh návrhu = spellCheckResponse.getSuggestions (). Get (0); Zoznam alternatív = suggestion.getAlternatives (); Reťazec alternative = alternatives.get (0);

Očakávaná alternatíva pre naše kľúčové slovo "Hme" by mala byť "Domov" pretože náš index obsahuje daný výraz "Domov". Poznač si to Kontrola pravopisu musí byť pred vykonaním vyhľadávania aktivovaný.

7.2. Podmienky automatického navrhovania

Možno budeme chcieť získať návrhy neúplných kľúčových slov, ktoré nám pomôžu pri vyhľadávaní. Súčel Solrovho návrhu musí byť nakonfigurovaný manuálne. Podrobnosti o konfigurácii nájdete na jeho oficiálnej wiki stránke.

Nakonfigurovali sme obslužnú rutinu požiadaviek s názvom / navrhnúť vybavovať návrhy. Poďme získať návrhy pre kľúčové slovo „Hom“:

SolrQuery dotaz = nový SolrQuery (); query.setRequestHandler ("/ navrhnúť"); query.set ("navrhnúť", "pravda"); query.set ("suggest.build", "true"); query.set ("suggest.dictionary", "mySuggester"); query.set ("suggest.q", "Hom"); QueryResponse response = solrClient.query (dopyt); SuggesterResponse suggestesterResponse = response.getSuggesterResponse (); Mapa suggestTerms = suggestesterResponse.getSuggestedTerms (); Zoznam návrhov = suggestTerms.get ("mySuggester");

Zoznam Návrhy by mal obsahovať všetky slová a frázy. Upozorňujeme, že sme nakonfigurovali navrhovateľa s názvom mySuggester v našej konfigurácii.

8. Záver

Tento článok je rýchlym úvodom do schopností a funkcií vyhľadávača Solr.

Dotkli sme sa mnohých funkcií, ale sú to samozrejme len poškriabanie povrchu toho, čo môžeme robiť s pokročilým a vyspelým vyhľadávacím serverom, ako je Solr.

Tu použité príklady sú ako vždy k dispozícii na GitHub.


$config[zx-auto] not found$config[zx-overlay] not found