Sprievodca po Elasticsearch v Jave

1. Prehľad

V tomto článku sa ponoríme do niektorých kľúčových konceptov týkajúcich sa fulltextových vyhľadávacích nástrojov, so zvláštnym zameraním na Elasticsearch.

Pretože sa jedná o článok zameraný na Javu, nebudeme poskytovať podrobný podrobný návod, ako nastaviť Elasticsearch a ukázať, ako to funguje pod kapotou. Namiesto toho sa zameriame na klienta Java a na to, ako používať hlavné funkcie, ako je index, vymazať, dostať a Vyhľadávanie.

2. Inštalácia

Kvôli jednoduchosti však pre našu inštanciu Elasticsearch použijeme ukotviteľný obrázok urobí akákoľvek inštancia Elasticsearch, ktorá počúva na porte 9200.

Začneme spustením našej inštancie Elasticsearch:

docker run -d --name es762 -p 9200: 9200 -e „discovery.type = single-node“ elasticsearch: 7.6.2

V predvolenom nastavení Elasticsearch počúva na porte 9200 nadchádzajúce dotazy HTTP. Úspešnosť spustenia môžeme overiť otvorením // localhost: 9200 / URL vo vašom obľúbenom prehliadači:

{"name": "M4ojISw", "cluster_name": "docker-cluster", "cluster_uuid": "CNnjvDZzRqeVP-B04D3CmA", "verzia": {"number": "7.6.2", "build_flavor": "predvolené "," build_type ":" docker "," build_hash ":" 2f4c224 "," build_date ":" 2020-03-18T23: 22: 18.622755Z "," build_snapshot ": false," lucene_version ":" 8.4.0 " , "minimum_wire_compatibility_version": "6.8.0", "minimum_index_compatibility_version": "6.8.0-beta1"}, "slogan": "Viete, pre vyhľadávanie"}

3. Konfigurácia Maven

Teraz, keď máme spustený základný klaster Elasticsearch, preskočme priamo na klienta Java. Najprv musíme mať deklarovanú nasledujúcu závislosť Maven v našom pom.xml spis:

 org.elasticsearch elasticsearch 7.6.2 

Najnovšie verzie hostené serverom Maven Central môžete kedykoľvek skontrolovať pomocou odkazu uvedeného vyššie.

4. Java API

Predtým, ako prejdeme priamo na to, ako používať hlavné funkcie rozhrania Java API, musíme spustiť RestHighLevelClient:

ClientConfiguration clientConfiguration = ClientConfiguration.builder (). ConnectedTo ("localhost: 9200"). Build (); RestHighLevelClient client = RestClients.create (clientConfiguration) .rest ();

4.1. Indexovanie dokumentov

The index () funkcia umožňuje uložiť ľubovoľný dokument JSON a umožniť jeho prehľadávanie:

@Test public void givenJsonString_whenJavaObject_thenIndexDocument () {String jsonObject = "{\" age \ ": 10, \" dateOfBirth \ ": 1471466076564," + "\" fullName \ ": \" John Doe \ "}"; Požiadavka na indexRequest = nový indexRequest ("ľudia"); request.source (jsonObject, XContentType.JSON); IndexResponse response = client.index (request, RequestOptions.DEFAULT); Reťazcový index = response.getIndex (); dlhá verzia = response.getVersion (); assertEquals (Result.CREATED, response.getResult ()); assertEquals (1, verzia); assertEquals ("ľudia", index); }

Upozorňujeme, že je možné použiť ľubovoľná knižnica Java JSON vytvárať a spracovávať vaše dokumenty. Ak nič z toho nepoznáte, môžete na vytvorenie vlastných dokumentov JSON použiť pomocníkov Elasticsearch:

XContentBuilder builder = XContentFactory.jsonBuilder () .startObject () .field ("fullName", "Test") .field ("dateOfBirth", nový Date ()) .field ("vek", "10") .endObject () ; IndexRequest indexRequest = nový IndexRequest ("ľudia"); indexRequest.source (staviteľ); Odpoveď IndexResponse = client.index (indexRequest, RequestOptions.DEFAULT); assertEquals (Result.CREATED, response.getResult ());

4.2. Dopytovanie indexovaných dokumentov

Teraz, keď máme indexovaný typ prehľadávateľného dokumentu JSON, môžeme pokračovať a hľadať pomocou Vyhľadávanie() metóda:

SearchRequest searchRequest = nový SearchRequest (); SearchResponse response = client.search (searchRequest, RequestOptions.DEFAULT); SearchHit [] searchHits = response.getHits (). GetHits (); Zoznam výsledkov = Arrays.stream (searchHits) .map (hit -> JSON.parseObject (hit.getSourceAsString (), Person.class)) .collect (Collectors.toList ());

Výsledky vrátené Vyhľadávanie() metóda sa volajú Hity, každý Hit odkazuje na dokument JSON zodpovedajúci požiadavke na vyhľadávanie.

V takom prípade výsledky zoznam obsahuje všetky údaje uložené v klastri. Upozorňujeme, že v tomto príklade používame na prevod JSON knižnicu FastJson Struny na objekty Java.

Požiadavku môžeme vylepšiť pridaním ďalších parametrov, aby sme mohli dotaz prispôsobiť pomocou QueryBuilders metódy:

SearchSourceBuilder builder = nový SearchSourceBuilder () .postFilter (QueryBuilders.rangeQuery ("vek"). Z (5) .to (15)); SearchRequest searchRequest = nový SearchRequest (); searchRequest.searchType (SearchType.DFS_QUERY_THEN_FETCH); searchRequest.source (staviteľ); SearchResponse response = client.search (searchRequest, RequestOptions.DEFAULT);

4.3. Vyberanie a mazanie dokumentov

The dostať () a vymazať() metódy umožňujú získať alebo vymazať dokument JSON z klastra pomocou jeho id:

GetRequest getRequest = nový GetRequest ("ľudia"); getRequest.id (id); GetResponse getResponse = client.get (getRequest, RequestOptions.DEFAULT); // polia procesu DeleteRequest deleteRequest = new DeleteRequest ("people"); deleteRequest.id (id); DeleteResponse deleteResponse = client.delete (deleteRequest, RequestOptions.DEFAULT);

Syntax je dosť jednoduchá, stačí zadať index vedľa id objektu.

5. QueryBuilders Príklady

The QueryBuilders trieda poskytuje rôzne statické metódy používané ako dynamické porovnávače na vyhľadanie konkrétnych položiek v klastri. Počas používania Vyhľadávanie() metóda na vyhľadanie konkrétnych dokumentov JSON v klastri, môžeme na prispôsobenie výsledkov vyhľadávania použiť nástroje na tvorbu dotazov.

Tu je zoznam najbežnejších použití produktu QueryBuilders API.

The matchAllQuery () metóda vracia a QueryBuilder objekt, ktorý zodpovedá všetkým dokumentom v klastri:

QueryBuilder matchAllQuery = QueryBuilders.matchAllQuery ();

The rangeQuery () zhoduje sa s dokumentmi, ktorých hodnota poľa je v určitom rozmedzí:

QueryBuilder matchDocumentsWithinRange = QueryBuilders .rangeQuery ("cena"). Od (15). Do (100)

Uvedenie názvu poľa - napr. celé meno, a zodpovedajúca hodnota - napr. John Doe, matchQuery () metóda porovnáva všetky dokumenty s týmito presnými hodnotami poľa:

QueryBuilder matchSpecificFieldQuery = QueryBuilders .matchQuery ("fullName", "John Doe");

Môžeme tiež použiť multiMatchQuery () metóda na zostavenie verzie zhody dotazu na viac polí:

QueryBuilder matchSpecificFieldQuery = QueryBuilders.matchQuery ("Hľadám text", "pole_1", "pole_2 ^ 3", "* _field_wildcard");

Na zvýraznenie konkrétnych polí môžeme použiť symbol vačku (^).

V našom príklade pole_2 má hodnotu zvýšenia nastavenú na tri, takže je dôležitejšia ako ostatné polia. Upozorňujeme, že je možné používať zástupné znaky a dotazy s regulárnym výrazom, ale pokiaľ ide o výkon, pri práci so zástupnými znakmi dávajte pozor na spotrebu pamäte a oneskorenie odozvy, pretože niečo ako * _apples môže mať obrovský vplyv na výkon.

Koeficient dôležitosti sa používa na zoradenie výslednej množiny zásahov vrátených po vykonaní search () metóda.

Ak ste oboznámenejší so syntaxou dotazov Lucene, môžete použiť simpleQueryStringQuery () spôsob prispôsobenia vyhľadávacích dotazov:

QueryBuilder simpleStringQuery = QueryBuilders .simpleQueryStringQuery ("+ John -Doe ALEBO Janette");

Ako asi tušíte, môžeme pomocou syntaxe Lucene's Query Parser vytvoriť jednoduché, ale výkonné dotazy. Tu je niekoľko základných operátorov, ktoré možno použiť spolu s A / ALEBO NIE operátory na vytváranie vyhľadávacích dopytov:

  • Požadovaný operátor (+): vyžaduje, aby niekde v poliach dokumentu existovala konkrétna časť textu.
  • Prevádzkovateľ zákazu (): vylúči všetky dokumenty, ktoré obsahujú kľúčové slovo deklarované za () symbol.

6. Záver

V tomto rýchlom článku sme sa dozvedeli, ako používať Java API ElasticSearch na vykonávanie niektorých bežných funkcií týkajúcich sa fulltextových vyhľadávacích nástrojov.

Môžete si pozrieť príklad uvedený v tomto článku v projekte GitHub.