Ich habe versucht, die Elasticsearch-API in Java zu verwenden

Auslösen

Bei der Implementierung der Elasticsearch-API in Java Die grundlegende Verwendung ist in Qiita und in der offiziellen Referenz, Ich habe beschlossen, diesen Artikel zu schreiben, weil es nur wenige Artikel gibt, die etwas kompliziert sind oder eine praktischere Beschreibung oder einen praktischeren Code haben.

Diejenigen, die Gegenstand dieses Artikels sind

Umwelt (zum Zeitpunkt der Entwicklung)

--Elasticsearch API-Version: 7.3.2

Vorbereitung

pom.xml


<dependency>
    <groupId>org.elasticsearch</groupId>
    <artifactId>elasticsearch</artifactId>
    <version>7.3.2</version>
</dependency>

<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>elasticsearch-rest-high-level-client</artifactId>
    <version>7.3.2</version>
</dependency>

Mit der obigen Beschreibung können Sie die Elasticsearch-Bibliothek verwenden.

Grundlegende Beschreibung und Verwendung der Bibliothek

* Alle danach angezeigten Spaltennamen, Feldnamen, IDs usw. sind nicht vorhanden. </ font>

SearchRequest Bei der Übersetzung der Referenz Englisch

SearchRequest wird für Vorgänge verwendet, die nach Dokumenten, Aggregaten und Vorschlägen suchen, und bietet auch die Möglichkeit, das Hervorheben des resultierenden Dokuments anzufordern.

Es heißt, aber ich denke, es ist wie ein Meisterwerk für das Senden von Anfragen an Elasticsearch über die API.

java


SearchRequest searchRequest = new SearchRequest();

Referenz: https://www.elastic.co/guide/en/elasticsearch/client/java-rest/master/java-rest-high-search.html

SearchSourceBuilder SearchSourceBuilder dient zum Hinzufügen von Suchparametern.

java


SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();

Referenz: https://www.elastic.co/guide/en/elasticsearch/client/java-rest/master/java-rest-high-search.html

RestHighLevelClient RestHighLevelClient ist der empfohlene REST-Client, um den zuvor verwendeten TransportClient zu ersetzen. Mit dieser Funktion können Sie über eine Java-App über http auf Elasticsearch zugreifen.

java


final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
credentialsProvider.setCredentials(AuthScope.ANY,
    new UsernamePasswordCredentials("user", "password")
);

RestHighLevelClient client = new RestHighLevelClient(
    RestClient.builder(new HttpHost("localhost", 9200, "https"))
        .setHttpClientConfigCallback(httpAsyncClientBuilder -> httpAsyncClientBuilder
          .setDefaultCredentialsProvider(credentialsProvider))
);

searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);

Referenz: https://www.elastic.co/guide/en/elasticsearch/client/java-rest/current/_basic_authentication.html

function score query Bei der Abfrage von Funktionsbewertungen können im Funktionsabschnitt mehrere Bedingungen (Funktionen) beschrieben werden, und die Sortierung wird anhand der Summe der Bewertungen für jede Bedingung durchgeführt.

Nur ein Beispiel


FunctionScoreQueryBuilder functionScoreQueryBuilder = null;
ArrayList<FunctionScoreQueryBuilder.FilterFunctionBuilder> functionScoreArrayList = new ArrayList<>();
//Sie können mehrere hinzufügen
filterFunctionList.add(
    new FunctionScoreQueryBuilder.FilterFunctionBuilder(QueryBuilders.termQuery("FashionItemId", "1"),
        ScoreFunctionBuilders.fieldValueFactorFunction("custom_score.").factor(Float.valueOf("0.0254389"
)).missing(0.2)));
//ArrayList-Typ in FunctionScoreQueryBuilder.FilterFunctionBuilder[]Zu
FunctionScoreQueryBuilder.FilterFunctionBuilder[] functions = functionScoreArrayList.toArray(new FunctionScoreQueryBuilder.FilterFunctionBuilder[functionScoreArrayList.size()]);
functionScoreQueryBuilder = new FunctionScoreQueryBuilder(queryBuilder, functions).scoreMode(FunctionScoreQuery.ScoreMode.SUM).boostMode(CombineFunction.REPLACE);
searchSourceBuilder.query(functionScoreQueryBuilder);
  • Funktion ScoreQuery Builder enthält nur wenige Artikel, die wirklich hilfreich sind ...

Referenz: https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-function-score-query.html

count Es kann als ".count" für RestHighLevelClient angegeben werden.

java


CountResponse countResponse = null;
countResponse = restHighLevelClient.count(searchRequest, RequestOptions.DEFAULT);

Anschließend können Sie die Anzahl der Treffer in searchRequest in Form von CountResponse abrufen.

Referenz: https://www.elastic.co/guide/en/elasticsearch/reference/current/search-count.html

search Es kann mit .search für RestHighLevelClient angegeben werden.

java


SearchResponse searchResponse = null;
searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);

Anschließend können Sie die Suchergebnisse, die auf searchRequest klicken, in Form von SearchResponse abrufen.

Referenz: https://www.elastic.co/guide/en/elasticsearch/reference/current/search-search.html

_source Die "_source" von Elasticsearch ähnelt einer SELECT-Klausel in SQL. Geben Sie im Fall der API das Feld an, das mit fetchSource abgerufen werden soll. Durch Eingrenzen der zu erfassenden Felder kann die Datenmenge reduziert werden, sodass eine Geschwindigkeitsverbesserung erwartet werden kann. Geben Sie das Feld an, das im ersten Argument erfasst werden soll, und das Feld, das im zweiten Argument ausgeschlossen werden soll. Im Fall der oben erwähnten Zählung ist es in Ordnung, ohne anzugeben.

java


searchSourceBuilder.fetchSource(new String[]{"FashionItemId", "ItemPrice", "FashionItemSize",
    "FashionItemLargeCategory", "FashionItemSmallCategory"},
    "ExclusionFashionItemId");

Referenz: https://www.elastic.co/guide/en/elasticsearch/client/java-rest/current/java-rest-high-search.html#_source_filtering

Sort Es ist Order By in SQL. Verwenden Sie FieldSortBuilder, um die Sortierung anzugeben.

Beim Sortieren nach mehreren Spalten


return searchSourceBuilder.sort(new FieldSortBuilder("ItemPrice").order(SortOrder.ASC))
    .sort(new FieldSortBuilder("FashionItemId").order(SortOrder.DESC))
    .sort(new FieldSortBuilder("StartDatetime").order(SortOrder.DESC));

Referenz: https://www.elastic.co/guide/en/elasticsearch/client/java-rest/current/java-rest-high-search.html#_specifying_sorting

from & size Dies entspricht Offset & Limit in SQL. Sie können es mit .from`` .to für den oben genannten SearchSourceBuilder angeben.

java


SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.from(0);
searchSourceBuilder.size(100);

Referenz: https://www.elastic.co/guide/en/elasticsearch/client/java-rest/master/java-rest-high-search.html#_using_the_searchsourcebuilder

BoolQuery Wird verwendet, um andere Abfragen zu kombinieren. Sie können UND ODER ODER NICHT kombinieren. Es gibt vier Arten von BoolQuery.

Abfrage Erläuterung
must Es ist UND in SQL. Die Punktzahl wird gemäß den angegebenen Bedingungen berechnet.
filter Es ist UND in SQL. Im Gegensatz zu must wird die Punktzahl nicht berechnet.
should Es ist ODER in SQL.
must not Es ist NICHT in SQL.

Typische Suchabfrage

termQuery Ob es passt. In SQL = (gleich) Referenz: https://www.elastic.co/guide/en/elasticsearch/reference/7.8/query-dsl-term-query.html

temrsQuery Gibt es ein Streichholz? IN-Klausel in SQL Referenz: https://www.elastic.co/guide/en/elasticsearch/client/java-api/current/java-term-level-queries.html#java-query-dsl-terms-query

rangeQuery Gibt es einen bestimmten Bereich? > =, <=, <,> In SQL Referenz: https://www.elastic.co/guide/en/elasticsearch/client/java-api/current/java-term-level-queries.html#java-query-dsl-range-query

Beispiel (SQL vs ElasticSearch vs Java)

Für SQL


AND StartDatetime >= '2019-12-06 17:33:18'
AND (
    (
        FashionItemLargeCategory <> 1
        AND FashionItemSmallCategory NOT IN (10,20,30)
        AND FashionItemSize IN (1,2)
    ) OR (
        (
            FashionItemLargeCategory = 2
            OR FashionItemSmallCategory  IN (40,50,60)
        )
        AND FashionItemSize  IN (9,10)
    )
)

Für Elasticsearch


"bool": {
  "filter": [
    {
      "range": {
        "StartDatetime": {
          "from": null,
          "to": "2019-12-06 17:33:18",
          "include_lower": true,
          "include_upper": false
        }
      }
    },
    {
      "bool": {
        "filter": [
          {
            "bool": {
              "should": [
                {
                  "bool": {
                    "filter": [
                      {
                        "terms": {
                          "FashionItemSize ": [
                            1,
                            2
                          ]
                        }
                      }
                    ],
                    "must_not": [
                      {
                        "term": {
                          "FashionItemLargeCategory ": {
                            "value": 1,
                            "boost": 1
                          }
                        }
                      },
                      {
                        "terms": {
                          "FashionItemSmallCategory ": [
                            10,
                            20,
                            30
                          ]
                        }
                      }
                    ]
                  }
                },
                {
                  "bool": {
                    "filter": [
                      {
                        "terms": {
                          "FashionItemSize": [
                            9,
                            10
                          ]
                        }
                      }
                    ],
                    "should": [
                        {
                          "term": {
                            "FashionItemLargeCategory ": {
                              "value": 1
                            }
                          }
                        },
                        {
                          "terms": {
                            "FashionItemSmallCategory  ": [
                              40,
                              50,
                              60
                            ]
                          }
                        }
                    ]
                  }
                }
              ]
            }
          }
        ]
      }
    }
  ]
}

(Es ist sehr kompliziert und schwer zu sehen ...)

Für Java


integer[] smallCategories1 = {10, 20, 30};
integer[] itemSize1 = {1, 2};
integer[] smallCategories2 = {40, 50, 60};
integer[] itemSize2 = {9, 10};

BoolQueryBuilder qb1 = boolQuery()
    .mustNot(termQuery("FashionItemLargeCategory", 1))
    .mustNot(termsQuery("FashionItemSmallCategory", smallCategories1))
    .filter(termsQuery("FashionItemSize" , itemSize1));

BoolQueryBuilder qb2 = boolQuery()
    .should(termQuery("FashionItemLargeCategory", 2))
    .should(termsQuery("FashionItemSmallCategory", smallCategories2))
    .filter(termsQuery("FashionItemSize", itemSize2));

BoolQueryBuilder qb3 = boolQuery()
    .should(qb1)
    .should(qb2);

BoolQueryBuilder qb4 = boolQuery()
    .filter(rangeQuery("StartDatetime").from(null).lt("2019-12-06 17:33:18"))
    .filter(qb3);

Überprüfungsmethode

Sie können Elasticsearch-Abfragen abrufen, indem Sie toString () für BoolQueryBuilder ausführen. Überprüfen Sie, ob die Abfrage korrekt ist, indem Sie das Ergebnis mit der erwarteten Abfrage vergleichen oder mit Kibana treffen.

Beispiel&nbsp;(SQL&nbsp;vs&nbsp;ElasticSearch&nbsp;vs&nbsp;Java)&nbsp;Beim Überprüfen von BoolQueryBuilder-Abfragen


System.out.println(qb4.toString());

Schließlich

Dieser Artikel ist nur die Information zu der Zeit, als ich ihn zum ersten Mal berührte. Zu dieser Zeit gab es nur wenige Artikel, aber heutzutage gibt es viele gute Artikel, wenn Sie nachschlagen. Ich hoffe, es ist hilfreich für diejenigen, die neu in der Elasticsearch-API sind.

Recommended Posts

Ich habe versucht, die Elasticsearch-API in Java zu verwenden
Ich habe versucht, die Java8 Stream API zu verwenden
Ich habe versucht, JWT in Java zu verwenden
Ich habe versucht, Java REPL zu verwenden
Ich habe versucht, Metaprogrammierung mit Java
Versuchte Mastodons Toot- und Streaming-API in Java
Ich habe versucht, die erweiterte for-Anweisung in Java zu verwenden
Ich habe versucht, Java Memo LocalDate zu verwenden
Ich habe versucht, Google HttpClient von Java zu verwenden
Elasticsearch-Vorgang über die REST-API mit Apache HttpClient in Java
Ich habe versucht, Dapr in Java zu verwenden, um die Entwicklung von Mikroservices zu erleichtern
Versuchen Sie es mit der Stream-API in Java
Ich habe das neue Yuan-Problem in Java ausprobiert
Versuchen Sie es mit der JSON-Format-API in Java
Ich habe versucht, OpenCV mit Java + Tomcat zu verwenden
Ich habe versucht, Gson zu benutzen
Ich habe versucht, TestNG zu verwenden
Ich habe versucht, Galasa zu benutzen
Zabbix API in Java
[Für Anfänger] Ich habe versucht, DBUnit mit Eclipse zu verwenden
ChatWork4j für die Verwendung der ChatWork-API in Java
[Für Anfänger] Ich habe versucht, JUnit 5 mit Eclipse zu verwenden
[Java] API-Erstellung mit Jerjey (Jax-rs) mit Eclipse
Versuchen Sie, die Cloud Vision-API von GCP in Java zu verwenden
[API] Ich habe versucht, die Postleitzahlensuch-API zu verwenden
Ich habe versucht, neunundneunzig in Java auszugeben
Ich habe versucht, Alexa-Fähigkeiten mit Java zu erstellen
Versuchen Sie es mit der Syntaxanalyse der COTOHA-API in Java
Ich habe versucht, mit AI "A3RT" eine Talk-App in Java zu erstellen.
Ich habe versucht, eine Datenbankverbindung in der Android-Entwicklung zu verwenden
Versuchen Sie es mit RocksDB mit Java
Ich habe versucht, die Firebase-Push-Benachrichtigung in Java zu implementieren
Ich habe versucht, SQS mit AWS Java SDK zu betreiben
Ich habe ein Roulette in Java gemacht.
# 2 [Anmerkung] Ich habe versucht, neunundneunzig mit Java zu berechnen.
Ich habe versucht, Azure Cloud-Init zu verwenden
Java Stream API in 5 Minuten
Ich habe versucht, eine Clova-Fähigkeit in Java zu erstellen
Ich habe Drools (Java, InputStream) ausprobiert.
Ich habe versucht, eine Anmeldefunktion mit Java zu erstellen
Ich habe versucht, Log4j2 auf einem Java EE-Server zu verwenden
Ich habe versucht, Apache Wicket zu verwenden
[Java] Ich habe versucht, die Yahoo API-Produktsuche zu implementieren
Ich habe versucht, Java Silver in 2 Wochen zu bestehen, ohne Java zu kennen
Ich habe versucht, die Methode der gegenseitigen Teilung von Eugrid in Java zu implementieren
~ Ich habe jetzt versucht, funktionale Programmierung mit Java zu lernen ~
Ich habe versucht, ein Aktienchart mit Java (Jsoup) zu kratzen.
Ich habe versucht herauszufinden, was sich in Java 9 geändert hat
Ich habe versucht, Text in Ruby mithilfe der Vision API (trainiertes Modell für maschinelles Lernen) zu extrahieren.
Objektorientiertes Kind !? Ich habe Deep Learning mit Java ausprobiert (Testversion)
Ich habe versucht, in Java von einer Zeichenfolge in einen LocalDate-Typ zu konvertieren
Übersetzen mit der Microsoft Translator-Text-API in Java (Japanisch → Englisch)
Tipps zur Verwendung von Salesforce SOAP und Bulk API in Java
Ich habe einen RESAS-API-Client in Java erstellt
Ich war seltsamerweise süchtig danach, Javas Stream-API mit Scala zu verwenden
Ich habe versucht, die CameraX-Bibliothek mit Android Java Fragment zu verwenden
Ich habe jetzt versucht, Anakia + Jing zu verwenden
Ich habe eine E-Mail in Java gesendet