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.
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.
macOS Elasticsearch6.5.2 Java8 Spring Boot 2.1.1
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.
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.
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.
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.
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.
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