Ú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.