[JAVA] Migrieren Sie vom Transport Client zum Rest High Level Client

Einführung

Dieser Artikel ist der 18. Tagesartikel des Adventskalenders Elastic Stack (Elasticsearch) 2018.

Als ich Webanwendungsingenieur wurde und zum ersten Mal mit der Implementierung der Volltextsuche mithilfe der elastischen Suche im Feld betraut wurde Ich hatte Schwierigkeiten mit dem Artikel, der JavaClient verwendet, und hoffe, dass er für solche Leute nützlich sein wird.

Artikelinhalt

Angenommen, die Spring-Anwendung enthält die Volltextsuchfunktion mit JavaClient. Transport Client, der aus der Elasticsearch 7-Serie nicht empfohlen wird, soll angeblich vollständig aus der 8-Serie verschwunden sein Ich habe die Änderungen in der Clientverbindung und der Generierung von Abfragen bei der Migration zu RestHighLevelClient zusammengefasst.

Dieses Mal werden Verbindungen einschließlich Authentifizierung, Bulk-API und Scroll-API nicht behandelt.

Umgebung

macOS Elasticsearch6.5.2 Java8 Spring Boot 2.1.1

Vorbereitung

Beispiel App

Die von mir erstellte Anwendung ist auf GitHub aufgeführt. https://github.com/ohanamisan/Elasticsearch_on_Java

Wenn sich die Version von Elasticsearch unterscheidet, ändern Sie den JAR-Importspeicherort der Gradle-Datei entsprechend. Übrigens ist im Beispiel auch der Prozess des Einfügens mit Bulk grob implementiert. In diesem Artikel werden keine Details angegeben. Weitere Informationen finden Sie unter READ ME.

Implementierung

TransportClient -> RestHighLevelClient Dies ist sofort die Migration des führenden Clients.


TransportClient client = new PreBuiltTransportClient(Settings.EMPTY)
        .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("localhost"), 9300));

Der Transport-Client, der bisher als Standard verwendet wurde, sieht folgendermaßen aus. Die Portnummer lautet 9300 und wird anstelle des Elasticsearch-Standardwerts 9200 als Transport bereitgestellt.

Hier ist übrigens die 7er α-Version. transport非推奨.png

Es wurde veraltet. Es kann nicht aus 8 Serien verwendet werden.

Schreiben wir es jetzt in RestHighLevelClient um, was in Zukunft der Standard sein wird.


RestHighLevelClient client = new RestHighLevelClient(
        RestClient.builder(new HttpHost("localhost", 9200, "http")));

Hatten Sie Lust, den 9200 direkt mit http-Zugriff zu erreichen, ohne den 9300 for Transport zu verwenden? Ich glaube, es ist. Der Name und die Struktur sind so einfach, dass Sie auf einen Blick sehen können, dass Sie auf Rest klicken.

Wenn Sie mehrere Elasticsearch auf demselben Server verwenden, verwendet der Port automatisch den nächsten Port. Fügen Sie daher HttpHosts hinzu, die durch Kommas entsprechend der Anzahl getrennt sind.


RestHighLevelClient client = new RestHighLevelClient(
    RestClient.builder(
            new HttpHost("localhost", 9200, "http"),
            new HttpHost("localhost", 9201, "http")
    )
);

TransportClient spuckte Protokolle aus, auf die intern mit netty zugegriffen werden sollte, aber RestHighLevelClient gibt standardmäßig keine Protokolle aus, wahrscheinlich weil es mit Rest übereinstimmt, wie der Name schon sagt.

prepareSearch -> SearchSourceBuilder + SearchRequest Als Nächstes werden wir die Implementierung der Abfragegenerierung ändern. Die Abfrage, die dieses Mal während der Volltextsuche generiert wird, wird wie folgt angenommen.


{
  "query": {
    "bool": {
      "should": [
        {
          "match_phrase": {
            "title.full_text_search":Suchbegriff
          }
        },
        {
          "match_phrase": {
            "body.full_text_search":Suchbegriff
          }
        }
      ], "minimum_should_match": 1
    }
  }
}

Eine einfache Abfrage, die eine match_phrase-Abfrage für Text und Titel auslöst. Ich wollte eine Volltextsuche durchführen, die den Titel enthält. Wenn ich also eine Abfrage verwenden und entweder den Titel oder den Text treffen würde, wäre dies positiv.

Wir werden diese Abfrage in Java generieren.

Die Generierung und Anforderung von Abfragen bei Verwendung von TransportClient lautet wie folgt.


BoolQueryBuilder query = QueryBuilders.boolQuery();		
query.should(QueryBuilders.matchPhraseQuery("title.full_text_search", word))
  .should(QueryBuilders.matchPhraseQuery("body.full_text_search", word));
  .minimumShouldMatch(1));
SearchResponse res = client.prepareSearch("qiita")
				.setQuery(query)
				.setSize(1000)
				.get();
res.getHits();

Generieren Sie eine Abfrage mit QueryBuilders und verwenden Sie die prepareSearch-Methode des Clients Ich werde die Anforderungsabfrage und die Einstellungen zum Zeitpunkt der Anforderung übergeben.

Abgesehen davon können Sie auch in Java, wenn Sie Query Builder oder Kettenmethoden verschachteln, ziemlich komplizierte Abfragen sowie Abfragen in JSON generieren.

RestHighLevelClient verfügt nicht mehr über eine prepareSearch-Methode Die Suchmethode mit SearchRequest als Argument wird verwendet. Unten ist der geänderte Code.


SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
sourceBuilder.from(0);
sourceBuilder.size(1000);
sourceBuilder.query(QueryBuilders.boolQuery()
                    .should(QueryBuilders.matchPhraseQuery("title.full_text_search", word))
                    .should(QueryBuilders.matchPhraseQuery("body.full_text_search", word))
                    .minimumShouldMatch(1));

SearchRequest req = new SearchRequest().indices(INDEX).source(sourceBuilder);

SearchResponse res = client.search(req, RequestOptions.DEFAULT);
res.getHits();

Ich denke, die Anzahl der Codezeilen ist lang geworden. Ich habe den Eindruck, dass die Zuständigkeiten für das Festlegen von Anfragen, Anfragen und Antworten getrennt sind, was die persönliche Bearbeitung erleichtert.

Lauf

Qiita全文検索.gif

Es tut mir leid, dass ich meine Bemühungen, Gifs zu erstellen, erschöpft habe, aber ich hoffe, Sie können sehen, dass das Suchwort "Java" nicht im Titel enthalten ist. Es fühlt sich an wie ein Treffer aus dem Text.

Zusammenfassung

Dieses Mal habe ich versucht, als Beispiel die minimale Volltextsuche in der lokalen Umgebung zu implementieren.

RestHighLevelClient mit Basisauthentifizierung beim Einfügen von xpack usw. Da es noch Erweiterungselemente wie die Scroll-API für das Paging gibt, ist dies für die Suche unverzichtbar Ich nutze diesen (eigentlich) ersten Beitrag als Gelegenheit und möchte weiterhin Artikel schreiben, während ich das Beispiel erweitere.

Da ich Java nach langer Zeit implementiert habe, weisen Sie bitte auf merkwürdige Punkte hin.

schließlich

Morgen findet die 27. Elastic Search Study Session "LT & Year-End Party" statt! https://www.meetup.com/ja-JP/Tokyo-Elastic-Fantastics/events/256619262/

Recommended Posts

Migrieren Sie vom Transport Client zum Rest High Level Client
Tipps für Java High Level REST-Clients
Stoppen Sie das erneute Senden vom Client zum Server
Migrieren Sie von on-prepukiwiki zu esa.io \ (⁰⊖⁰) /
Migrieren Sie von Java zu Server Side Kotlin + Spring-Boot
[Swift, ARKit] Migrieren Sie von veraltetem hitTest zu raycastQuery