Útmutató az Java kereséshez
1. Áttekintés
Ebben a cikkben elmélyülünk a teljes szövegű keresőkhöz kapcsolódó kulcsfontosságú fogalmakban, különös tekintettel az Elasticsearchre.
Mivel ez egy Java-orientált cikk, nem adunk részletes részletes útmutatást az Elasticsearch beállításáról és annak működésének bemutatásáról a motorháztető alatt. Ehelyett a Java klienst fogjuk megcélozni, és a főbb szolgáltatások, például a használatát index, töröl, kap és keresés.
2. Beállítás
Az egyszerűség kedvéért mégis dokkoló képet használunk az Elasticsearch példányunkhoz minden Elasticsearch példány hallgat a 9200-as porton.
Először az Elasticsearch példányunk feltöltésével kezdjük:
docker run -d --name es762 -p 9200: 9200 -e "discovery.type = single-node" rugalmas keresés: 7.6.2
Alapértelmezés szerint az Elasticsearch a 9200-as porton figyeli a várható HTTP-lekérdezéseket. A. Megnyitásával ellenőrizhetjük, hogy sikeresen elindult-e // localhost: 9200 / URL a kedvenc böngészőben:
{"name": "M4ojISw", "cluster_name": "docker-cluster", "cluster_uuid": "CNnjvDZzRqeVP-B04D3CmA", "version": {"number": "7.6.2", "build_flavor": "alapértelmezett "," build_type ":" docker "," build_hash ":" 2f4c224 "," build_date ":" 2020-03-18T23: 22: 18.622755Z "," build_snapshot ": hamis," lucene_version ":" 8.4.0 " , "minimum_wire_compatibility_version": "6.8.0", "minimum_index_compatibility_version": "6.8.0-beta1"}, "tagline": "Tudod, a kereséshez"}
3. Maven konfiguráció
Most, hogy az Elasticsearch alapfürtünk beindult és fut, ugorjunk egyenesen a Java kliensre. Mindenekelőtt a következő Maven-függőséget kell deklarálnunk pom.xml fájl:
org.elasticsearch elasticsearch 7.6.2
Mindig ellenőrizheti a Maven Central által üzemeltetett legújabb verziókat a korábban megadott linkkel.
4. Java API
Mielőtt egyenesen áttérnénk a Java API főbb funkcióinak használatára, el kell indítanunk a RestHighLevelClient:
ClientConfiguration clientConfiguration = ClientConfiguration.builder (). ConnectedTo ("localhost: 9200"). Build (); RestHighLevelClient kliens = RestClients.create (clientConfiguration) .rest ();
4.1. Dokumentumok indexelése
A index() funkció lehetővé teszi egy tetszőleges JSON dokumentum tárolását és kereshetővé tételét:
@Test public void givenJsonString_whenJavaObject_thenIndexDocument () {String jsonObject = "{\" age \ ": 10, \" dateOfBirth \ ": 1471466076564," + "\" fullName \ ": \" John Doe \ "}"; IndexRequest kérés = new IndexRequest ("emberek"); request.source (jsonObject, XContentType.JSON); IndexResponse response = ügyfél.index (kérés, RequestOptions.DEFAULT); String index = response.getIndex (); hosszú verzió = response.getVersion (); assertEquals (Result.CREATED, response.getResult ()); assertEquals (1, verzió); assertEquals ("emberek", index); }
Ne feledje, hogy lehetséges bármilyen JSON Java könyvtár dokumentumok létrehozásához és feldolgozásához. Ha még nem ismeri ezeket, használhatja az Elasticsearch segédprogramjait saját JSON-dokumentumai előállításához:
XContentBuilder builder = XContentFactory.jsonBuilder () .startObject () .field ("fullName", "Test") .field ("dateOfBirth", new Date ()) .field ("age", "10") .endObject () ; IndexRequest indexRequest = új IndexRequest ("emberek"); indexRequest.source (készítő); IndexResponse response = ügyfél.index (indexRequest, RequestOptions.DEFAULT); assertEquals (Result.CREATED, response.getResult ());
4.2. Indexelt dokumentumok lekérdezése
Most, hogy be van indexelve egy kereshető JSON-dokumentum, folytathatjuk és kereshetünk a keresés() módszer:
SearchRequest searchRequest = új SearchRequest (); SearchResponse response = client.search (searchRequest, RequestOptions.DEFAULT); SearchHit [] searchHits = response.getHits (). GetHits (); Eredmények felsorolása = Arrays.stream (searchHits) .map (hit -> JSON.parseObject (hit.getSourceAsString (), Person.class)) .collect (Collectors.toList ());
Az eredményeket a keresés() módszer nevezzük Találatok, minden egyes Találat a keresési kérelemnek megfelelő JSON dokumentumra utal.
Ebben az esetben a eredmények lista tartalmazza a fürtben tárolt összes adatot. Ne feledje, hogy ebben a példában a FastJson könyvtárat használjuk a JSON konvertálásához Húrok Java objektumokhoz.
Fokozhatjuk a kérést további paraméterek hozzáadásával annak érdekében, hogy a lekérdezést a QueryBuilders mód:
SearchSourceBuilder builder = new SearchSourceBuilder () .postFilter (QueryBuilders.rangeQuery ("age"). Tól (5). - (15)); SearchRequest searchRequest = új SearchRequest (); searchRequest.searchType (SearchType.DFS_QUERY_THEN_FETCH); searchRequest.source (készítő); SearchResponse response = client.search (searchRequest, RequestOptions.DEFAULT);
4.3. Dokumentumok lekérése és törlése
A kap() és törölje() A módszerek lehetővé teszik egy JSON-dokumentum lekérését vagy törlését a fürtből, annak azonosítójával:
GetRequest getRequest = új GetRequest ("emberek"); getRequest.id (id); GetResponse getResponse = client.get (getRequest, RequestOptions.DEFAULT); // feldolgozási mezők DeleteRequest deleteRequest = new DeleteRequest ("emberek"); deleteRequest.id (id); DeleteResponse deleteResponse = client.delete (deleteRequest, RequestOptions.DEFAULT);
A szintaxis nagyon egyszerű, csak meg kell adni az indexet az objektum azonosítója mellett.
5. QueryBuilders Példák
A QueryBuilders osztály számos statikus módszert kínál, amelyeket dinamikus illesztőként használnak a fürt konkrét bejegyzéseinek megtalálásához. A keresés() módszer a JSON-dokumentumok keresésére a fürtben, a lekérdezés-készítők segítségével testreszabhatjuk a keresési eredményeket.
Az alábbiakban felsoroljuk a QueryBuilders API.
A matchAllQuery () metódus a QueryBuilder objektum, amely megfelel a fürt összes dokumentumának:
QueryBuilder matchAllQuery = QueryBuilders.matchAllQuery ();
A rangeQuery () egyezik olyan dokumentumokkal, ahol a mező értéke egy bizonyos tartományon belül van:
QueryBuilder matchDocumentsWithinRange = QueryBuilders .rangeQuery ("ár"). Tól (15). - (100)
Mezőnév megadása - pl. teljes név, és a hozzá tartozó érték - pl. gipsz Jakab, A matchQuery () metódus minden dokumentumot megegyezik a mező pontos értékével:
QueryBuilder matchSpecificFieldQuery = QueryBuilders .matchQuery ("fullName", "John Doe");
Használhatjuk a multiMatchQuery () módszer az egyezés lekérdezés több mezős változatának felépítésére:
QueryBuilder matchSpecificFieldQuery = QueryBuilders.matchQuery ("Keresett szöveg", "mező_1", "mező_2 ^ 3", "* _mező_wildcard");
Használhatjuk a caret szimbólumot (^) az egyes mezők feljavításához.
Példánkban a mező_2 a növelési értéke háromra van állítva, ami fontosabbá teszi a többi mezőnél. Ne feledje, hogy helyettesítő karaktereket és regex lekérdezéseket is lehet használni, de teljesítmény szempontból vigyázzon a memóriafogyasztásra és a válaszidő késleltetésére a helyettesítő karakterekkel való foglalkozás során, mert valami olyan, mint a * _apples, hatalmas hatással lehet a teljesítményre.
A fontossági együtthatót az s végrehajtása után visszaküldött találatok eredménysorának rendezésére használjákkeresés () módszer.
Ha jobban ismeri a Lucene lekérdezések szintaxisát, használhatja a simpleQueryStringQuery () módszer a keresési lekérdezések testreszabására:
QueryBuilder simpleStringQuery = QueryBuilders .simpleQueryStringQuery ("+ John -Doe OR Janette");
Amint valószínűleg kitalálhatja, használhatjuk a Lucene Query Parser szintaxisát egyszerű, ugyanakkor hatékony lekérdezések összeállításához. Íme néhány alapvető operátor, amelyek használhatók a ÉS / VAGY / NEM operátorok keresési lekérdezések létrehozásához:
- A szükséges operátor (+): megköveteli, hogy egy adott szövegdarab legyen valahol a dokumentum mezõiben.
- Az operátor tiltása (–): kizár minden olyan dokumentumot, amely a (–) szimbólum.
6. Következtetés
Ebben a rövid cikkben azt láthattuk, hogyan használhatjuk az ElasticSearch Java API-ját a teljes szövegű keresőkhöz kapcsolódó néhány jellemző funkció végrehajtására.
A cikkben található példát a GitHub projektben tekintheti meg.