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: 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. 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: 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. É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”: 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. 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.query.setHighlightSimplePre (""); query.setHighlightSimplePost ("");
7. Keresési javaslatok
7.1. Helyesírás-ellenőrzés
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);
7.2. Automatikus javaslattételi feltételek
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
8. Következtetés