Teljes szövegű keresés a Solr segítségével

1. Áttekintés

Ebben a cikkben az Apache Solr keresőmotorjának alapvető fogalmát fogjuk feltárni - a teljes szöveges keresést.

Az Apache Solr egy nyílt forráskódú keretrendszer, amelyet dokumentumok millióinak kezelésére terveztek. A Java könyvtár - SolrJ - példáival áttekintjük az alapvető képességeit.

2. Maven konfiguráció

Tekintettel arra a tényre, hogy a Solr nyílt forráskódú - egyszerűen letölthetjük a bináris fájlt, és külön indíthatjuk a szervert az alkalmazásunktól.

A szerverrel való kommunikációhoz meghatározzuk a SolrJ kliens Maven-függőségét:

 org.apache.solr solr-solrj 6.4.2 

A legfrissebb függőséget itt találja.

3. Adatok indexelése

Az adatok indexeléséhez és kereséséhez létre kell hoznunk a mag; létrehozunk egy nevet tétel indexelni az adatainkat.

Mielőtt ezt megtennénk, szükségünk van az adatok indexelésére a szerveren, hogy azok kereshetővé váljanak.

Számos különböző módon tudjuk indexelni az adatokat. Használhatunk adatimport-kezelőket az adatok közvetlen relációs adatbázisokból történő importálására, az adatok feltöltésére a Solr Cell segítségével az Apache Tika segítségével, vagy az XML / XSLT, JSON és CSV adatok feltöltésével az indexkezelők segítségével.

3.1. A Solr dokumentum indexelése

Az adatokat indexelhetjük a mag létrehozásával SolrInputDocument. Először is be kell töltenünk a dokumentumot az adatainkkal, majd csak a SolrJ API-ját kell meghívnunk a dokumentum indexeléséhez:

SolrInputDocument doc = új SolrInputDocument (); doc.addField ("id", id); doc.addField ("leírás", leírás); doc.addField ("kategória", kategória); doc.addField ("ár", ár); solrClient.add (doc); solrClient.commit ();

Vegye figyelembe, hogy id természetesen egyedinek kell lennie a különböző elemeket. Miután egy id egy már indexelt dokumentum frissíti azt.

3.2. Bean indexelése

A SolrJ API-kat biztosít a Java babok indexeléséhez. A bab indexeléséhez meg kell jegyeznünk a @Terület kommentárok:

public class Item {@Field private String id; @Field private String leírás; @Field private String kategória; @Field privát float ár; }

Miután megvan a bab, az indexelés egyenesen előre megy:

solrClient.addBean (elem); solrClient.commit ();

4. Solr lekérdezések

A keresés a Solr legerősebb képessége. Miután a dokumentumokat indexeltük a tárunkban, kereshetünk kulcsszavakat, kifejezéseket, dátumtartományokat stb. Az eredményeket relevancia (pontszám) szerint rendezzük.

4.1. Alapvető lekérdezések

A kiszolgáló API-t tesz ki a keresési műveletekhez. Vagy hívhatunk / select vagy /lekérdezés kérelemkezelők.

Végezzünk egy egyszerű keresést:

SolrQuery lekérdezés = new SolrQuery (); query.setQuery ("márka1"); query.setStart (0); query.setRows (10); QueryResponse response = solrClient.query (lekérdezés); List elemek = response.getBeans (Item.class);

A SolrJ belsőleg használja a fő lekérdezési paramétert q szervernek küldött kérésében. A visszaküldött rekordok száma 10 lesz, nullától indexelve, amikor Rajt és sorok nincsenek megadva.

A fenti keresési lekérdezés olyan dokumentumokat keres, amelyek tartalmazzák a teljes szót „Brand1” bármely indexelt mezőjében. Vegye figyelembe, hogy az egyszerű keresések nem tesznek különbséget a kis- és nagybetűk között.

Nézzünk meg egy másik példát. Keresni akarunk minden olyan szót, amely tartalmazza „Rand”, amely tetszőleges számú karakterrel kezdődik és csak egy karakterrel végződik. Használhatunk helyettesítő karaktereket * és ? lekérdezésünkben:

query.setQuery ("* rand?");

A Solr lekérdezések olyan logikai operátorokat is támogatnak, mint az SQL:

query.setQuery ("márka1 ÉS (Mosó VAGY Hűtőszekrény)");

Minden logikai operátornak minden nagybetűkben kell lennie; azok, akiket a lekérdezési elemző támogat ÉS, VAGY NEM, + és -.

Sőt, ha az összes indexelt mező helyett konkrét mezőkön akarunk keresni, akkor ezeket megadhatjuk a lekérdezésben:

query.setQuery ("leírás: Márka * ÉS kategória: * Mosás *");

4.2. Frázis lekérdezések

Addig a kódunk kulcsszavakat keresett az indexelt mezőkben. Kifejezéses kereséseket is végezhetünk az indexelt mezőkön:

query.setQuery ("Mosógép");

Amikor van egy olyan mondatunk, mint a „Mosógép“, A Solr szabványos lekérdező elemzője a következőre elemzi:Mosás VAGY Gép“. Egy teljes kifejezés kereséséhez csak dupla idézőjelek közé tehetjük a kifejezést:

query.setQuery ("\" Mosógép \ "");

A közelség keresésével használhatjuk a szavakat bizonyos távolságokon belül. Ha meg akarjuk találni azokat a szavakat, amelyek legalább két szó távolságra vannak egymástól, akkor a következő lekérdezést használhatjuk:

query.setQuery ("\" Mosóeszközök \ "~ 2");

4.3. Tartomány lekérdezések

A tartomány lekérdezések lehetővé teszik olyan dokumentumok beszerzését, amelyek mezői meghatározott tartományok között vannak.

Tegyük fel, hogy olyan tételeket szeretnénk megtalálni, amelyek ára 100 és 300 között mozog:

query.setQuery ("ár: [100 - 300]");

A fenti lekérdezés megtalálja az összes elemet, amelynek ára 100 és 300 között van. Tudjuk használni "}”És„{”A végpontok kizárása érdekében:

query.setQuery ("ár: {100 - 300]");

4.4. Szűrés lekérdezések

A szűrő lekérdezések felhasználhatók a visszaküldhető eredmények felső csoportjának korlátozására. A lekérdezés szűrése nem befolyásolja a pontszámot:

SolrQuery lekérdezés = new SolrQuery (); query.setQuery ("ár: [100 - 300]"); query.addFilterQuery ("leírás: Márka1", "kategória: Háztartási gépek");

Általában a szűrő lekérdezés általában használt lekérdezéseket fog tartalmazni. Mivel gyakran újrafelhasználhatók, a gyorsabb keresés érdekében gyorsítótárba kerülnek.

5. Fazettás keresés

A faceting segít a keresési eredmények csoportokba rendezésében. Tudunk facet mezőket, lekérdezéseket vagy tartományokat.

5.1. Field Faceting

Például meg akarjuk kapni a kategóriák összesített számát a keresési eredményben. Hozzátehetjük kategória mező a lekérdezésünkben:

query.addFacetField ("kategória"); QueryResponse response = solrClient.query (lekérdezés); Felsorolja a facetResults = response.getFacetField ("kategória"). GetValues ​​();

A facetResults tartalmazza az egyes kategóriák számát az eredményekben.

5.2. Lekérdezés

A lekérdezés facetingje nagyon hasznos, ha vissza akarjuk hozni az alkérdezések számát:

query.addFacetQuery ("Mosás VAGY Hűtőszekrény"); query.addFacetQuery ("Márka2"); QueryResponse response = solrClient.query (lekérdezés); Térkép facetQueryMap = response.getFacetQuery ();

Ennek eredményeként a facetQueryMap meg fogja számlálni a lekérdezéseket.

5.3. Távolságarány

A tartományarányosságot használjuk a tartományok számlálásához a keresési eredmények között. A következő lekérdezés a 100 és 251 közötti ártartományok számát adja vissza, 25-ös különbséggel:

query.addNumericRangeFacet ("ár", 100, 275, 25); QueryResponse response = solrClient.query (lekérdezés); List rangeFacets = response.getFacetRanges (). Get (0) .getCounts ();

A numerikus tartományok mellett a Solr támogatja a dátumtartományokat, az intervallum és a pivot faceting funkciókat is.

6. Hit Kiemelés

Előfordulhat, hogy a keresési lekérdezésben szereplő kulcsszavakat kiemelnénk az eredményekben. Ez nagyon hasznos lesz, hogy jobb képet kapjunk az eredményekről. Indexeljünk néhány dokumentumot, és határozzuk meg a kiemelendő kulcsszavakat:

itemSearchService.index ("hm0001", "Brand1 mosógép", "Háztartási gépek", 100f); itemSearchService.index ("hm0002", "Brand1 hűtőszekrény", "Háztartási gépek", 300f); itemSearchService.index ("hm0003", "Brand2 mennyezeti ventilátor", "Háztartási gépek", 200f); itemSearchService.index ("hm0004", "Brand2 mosogatógép", "Mosó berendezések", 250f); SolrQuery lekérdezés = new SolrQuery (); query.setQuery ("Készülékek"); query.setHighlight (true); query.addHighlightField ("kategória"); QueryResponse response = solrClient.query (lekérdezés); Térkép> hitHighlightedMap = response.getHighlighting (); Térkép highlightedFieldMap = hitHighlightedMap.get ("hm0001"); List kiemeltList = kiemeltFieldMap.get ("kategória"); String highLightedText = kiemeltList.get (0);

Megkapjuk a highLightedText mint "Itthon Készülékek. Kérjük, vegye figyelembe, hogy a keresési kulcsszó Készülékek címkével rendelkezik . A Solr által használt alapértelmezett kiemelő címke a , de ezen változtathatunk a elő és post címkék:

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

7. Keresési javaslatok

Az egyik fontos funkció, amelyet a Solr támogat, a javaslatok. Ha a lekérdezés kulcsszavai helyesírási hibákat tartalmaznak, vagy ha javasolni szeretnénk egy keresési kulcsszó automatikus kitöltését, használhatjuk a javaslat funkciót.

7.1. Helyesírás-ellenőrzés

A szokásos kereséskezelő nem tartalmazza a helyesírás-ellenőrző komponenst; manuálisan kell konfigurálni. Három módon lehet megtenni. A konfiguráció részleteit a hivatalos wiki oldalon találja. Példánkban ezt fogjuk használni IndexBasedSpellChecker, amely indexelt adatokat használ a kulcsszavak helyesírás-ellenőrzéséhez.

Keressünk egy kulcsszót helyesírási hibával:

query.setQuery ("hme"); query.set ("helyesírás-ellenőrzés", "be"); QueryResponse response = solrClient.query (lekérdezés); SpellCheckResponse spellCheckResponse = response.getSpellCheckResponse (); Javaslat javaslat = spellCheckResponse.getSuggestions (). Get (0); Sorolja fel az alternatívákat = sugallat.getAlternatives (); Karakterlánc alternatíva = alternatives.get (0);

Várható alternatíva kulcsszavunkhoz „Hme” kellene "itthon" mivel indexünk tartalmazza a kifejezést "itthon". Vegye figyelembe, hogy helyesírás-ellenőrzés a keresés végrehajtása előtt aktiválni kell.

7.2. Automatikus javaslattételi feltételek

Érdemes lehet hiányos kulcsszavakra vonatkozó javaslatokat kapnunk, amelyek segítenek a keresésben. A Solr javaslatkomponensét manuálisan kell konfigurálni. A konfiguráció részleteit a hivatalos wiki oldalán találja meg.

Beállítottunk egy nevű kéréskezelőt / javaslatot a javaslatok kezelésére. Kérjünk javaslatokat a kulcsszóhoz „Hom”:

SolrQuery lekérdezés = new SolrQuery (); query.setRequestHandler ("/ javaslat"); query.set ("javaslat", "igaz"); query.set ("javaslat.építés", "igaz"); query.set ("javaslat.szótár", "mySuggester"); query.set ("javaslat.q", "Hom"); QueryResponse response = solrClient.query (lekérdezés); SuggesterResponse suggesterResponse = response.getSuggesterResponse (); Térkép javasoltTerms = suggesterResponse.getSuggestedTerms (); Javaslatok felsorolása = javasoltTerms.get ("mySuggester");

A lista javaslatok tartalmaznia kell az összes szót és kifejezést. Ne feledje, hogy beállítottunk egy suggester nevet mySuggester konfigurációnkban.

8. Következtetés

Ez a cikk egy gyors bevezető a keresőmotor Solr képességeire és szolgáltatásaira.

Sok funkciót érintettünk, de ezek természetesen csak a felszínét kaparják, amit egy olyan fejlett és kiforrott keresőszerverrel tehetünk meg, mint például a Solr.

Az itt használt példák, mint mindig, elérhetőek a GitHubon.