Mulai Cepat: Membuat indeks Azure Cognitive Search di Java

Buat aplikasi konsol Java yang membuat, memuat, dan meminta indeks pencarian menggunakan IntelliJ, Java 11 SDK, dan Azure Cognitive Search REST API. Artikel ini menyediakan instruksi langkah demi langkah untuk membuat aplikasi. Atau, Anda dapat mengunduh dan menjalankan aplikasi lengkap.

Jika Anda tidak memiliki langganan Azure, buat akun gratis sebelum Anda memulai.

Prasyarat

Kami menggunakan perangkat lunak dan layanan berikut untuk membangun dan menguji mulai cepat ini:

Dapatkan kunci dan URL

Panggilan ke layanan memerlukan titik akhir URL dan kunci akses pada setiap permintaan. Layanan pencarian dibuat dengan keduanya, jadi jika Anda menambahkan Azure Cognitive Search ke langganan Anda, ikuti langkah-langkah ini untuk mendapatkan informasi yang diperlukan:

  1. Masuk ke portal Microsoft Azure, dan di halaman Gambaran Umum layanan pencarian Anda, dapatkan URL. Contoh titik akhir mungkin terlihat seperti https://mydemo.search.windows.net.

  2. Di Tombol > Pengaturan, dapatkan kunci admin untuk mendapatkan hak penuh pada layanan. Ada dua kunci admin yang dapat dipertukarkan, disediakan untuk kelangsungan bisnis jika Anda perlu menggilirnya secara silih-berganti. Anda dapat menggunakan kunci utama atau sekunder pada permintaan untuk menambahkan, memodifikasi, dan menghapus objek.

    Mendapatkan nama layanan dan admin serta kunci kueri

Setiap permintaan yang dikirim ke layanan Anda memerlukan kunci API. Memiliki kunci yang valid membangun kepercayaan berdasarkan permintaan antara aplikasi yang mengirim permintaan dan layanan yang menanganinya.

Menyiapkan lingkungan Anda

Mulailah dengan membuka IntelliJ IDEA dan menyiapkan proyek baru.

Membuat proyek

  1. Buka IntelliJ IDEA dan pilih Buat Proyek Baru.

  2. Pilih Maven.

  3. Di daftar Proyek SDK, pilih Java 11 SDK.

    Membuat proyek Maven

  4. Untuk GroupId dan ArtifactId, masukkan AzureSearchQuickstart.

  5. Terima default yang tersisa untuk membuka proyek.

Tentukan dependensi Maven

  1. Pilih Pengaturan > File.

  2. Dari jendela Pengaturan, pilih Build, Execution, Deployment > Build Tools > Maven > Importing.

  3. Pilih kotak centang Impor proyek Maven secara otomatis, dan klik OK untuk menutup jendela. Plugin Maven dan dependensi lainnya sekarang akan disinkronkan secara otomatis ketika Anda memperbarui file pom.xml di langkah berikutnya.

    Opsi impor maven di pengaturan IntelliJ

  4. Buka file pom.xml dan ganti konten dengan detail konfigurasi Maven berikut. Ini termasuk referensi ke Exec Maven Plugin dan API antarmuka JSON

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <groupId>AzureSearchQuickstart</groupId>
        <artifactId>AzureSearchQuickstart</artifactId>
        <packaging>jar</packaging>
        <version>1.0-SNAPSHOT</version>
        <properties>
            <jackson.version>2.12.1</jackson.version>
            <auto-value.version>1.6.2</auto-value.version>
            <junit.version>5.4.2</junit.version>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        </properties>
        <name>azuresearch-console</name>
        <url>http://maven.apache.org</url>
        <dependencies>
            <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core -->
            <dependency>
                <groupId>com.fasterxml.jackson.core</groupId>
                <artifactId>jackson-core</artifactId>
                <version>${jackson.version}</version>
            </dependency>
            <dependency>
                <groupId>com.fasterxml.jackson.core</groupId>
                <artifactId>jackson-databind</artifactId>
                <version>${jackson.version}</version>
            </dependency>
            <dependency>
                <groupId>com.fasterxml.jackson.datatype</groupId>
                <artifactId>jackson-datatype-jdk8</artifactId>
                <version>${jackson.version}</version>
            </dependency>
            <dependency>
                <groupId>com.google.auto.value</groupId>
                <artifactId>auto-value-annotations</artifactId>
                <version>${auto-value.version}</version>
            </dependency>
            <dependency>
                <groupId>com.google.auto.value</groupId>
                <artifactId>auto-value</artifactId>
                <version>${auto-value.version}</version>
                <scope>provided</scope>
            </dependency>
            <dependency>
                <groupId>com.azure</groupId>
                <artifactId>azure-search-documents</artifactId>
                <version>11.1.3</version>
            </dependency>
        </dependencies>
    
        <build>
            <plugins>
                <!--put generated source files to generated-sources-->
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>3.8.0</version>
                    <configuration>
                        <source>11</source>
                        <target>11</target>
                    </configuration>
                </plugin>
                <!-- For JUnit -->
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-surefire-plugin</artifactId>
                    <version>2.22.1</version>
                </plugin>
                <!-- Add exec plugin to run demo program -->
                <plugin>
                    <groupId>org.codehaus.mojo</groupId>
                    <artifactId>exec-maven-plugin</artifactId>
                    <version>1.6.0</version>
                    <executions>
                        <execution>
                            <goals>
                                <goal>exec</goal>
                            </goals>
                        </execution>
                    </executions>
                    <configuration>
                        <mainClass>com.microsoft.azure.search.samples.demo.App</mainClass>
                        <cleanupDaemonThreads>false</cleanupDaemonThreads>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    </project>
    

Menyiapkan struktur proyek

  1. Pilih File > Struktur Proyek.

  2. Pilih Modul, dan perluas pohon sumber untuk mengakses konten folder src > main.

  3. Di dalam folder src > main > java, tambahkan folder untuk com, microsoft, azure, search, samples, demo. Untuk melakukan ini, pilih folder java, tekan Alt + Insert, lalu masukkan nama folder.

  4. Di src > main > resources folder, tambahkan folder app dan service.

    Setelah selesai, pohon proyek akan terlihat seperti gambar berikut.

    Struktur direktori proyek

  5. Klik OK untuk menutup jendela.

Menambahkan informasi layanan Azure Cognitive Search

  1. Di jendela Proyek, perluas pohon sumber untuk mengakses folder src > main >resources > app, dan tambahkan file config.properties. Untuk melakukan ini, pilih folder app, tekan Alt + Insert, pilih File, lalu masukkan nama file.

  2. Salin pengaturan berikut ke dalam file baru dan ganti <YOUR-SEARCH-SERVICE-NAME>, <YOUR-ADMIN-KEY>, dan <YOUR-QUERY-KEY> dengan nama dan kunci layanan Anda. Jika titik akhir layanan Anda adalah https://mydemo.search.windows.net, nama layanan akan menjadi "mydemo".

        SearchServiceName=<YOUR-SEARCH-SERVICE-NAME>
        SearchServiceAdminKey=<YOUR-ADMIN-KEY>
        SearchServiceQueryKey=<YOUR-QUERY-KEY>
        IndexName=hotels-quickstart
        ApiVersion=2020-06-30
    

Menambahkan metode utama

  1. Di folder src > main > java > app, tambahkan kelas App. Untuk melakukan ini, pilih folder app, tekan Alt + Insert, pilih Java Class, lalu masukkan nama kelas.

  2. Buka App kelas dan ganti konten dengan kode berikut. Kode ini berisi main metode.

    Kode yang tidak dihapus membaca parameter layanan pencarian dan menggunakannya untuk membuat instans klien layanan pencarian. Kode klien layanan pencarian akan ditambahkan di bagian berikutnya.

    Kode yang ditetapkan di kelas ini akan dihapus di bagian berikutnya dari mulai cepat ini.

    package main.java.app;
    
    import main.java.service.SearchServiceClient;
    import java.io.IOException;
    import java.util.Properties;
    
    public class App {
    
        private static Properties loadPropertiesFromResource(String resourcePath) throws IOException {
            var inputStream = App.class.getResourceAsStream(resourcePath);
            var configProperties = new Properties();
            configProperties.load(inputStream);
            return configProperties;
        }
    
        public static void main(String[] args) {
            try {
                var config = loadPropertiesFromResource("/app/config.properties");
                var client = new SearchServiceClient(
                        config.getProperty("SearchServiceName"),
                        config.getProperty("SearchServiceAdminKey"),
                        config.getProperty("SearchServiceQueryKey"),
                        config.getProperty("ApiVersion"),
                        config.getProperty("IndexName")
                );
    
    
    //Uncomment the next 3 lines in the 1 - Create Index section of the quickstart
    //            if(client.indexExists()){ client.deleteIndex();}
    //            client.createIndex("/service/index.json");
    //            Thread.sleep(1000L); // wait a second to create the index
    
    //Uncomment the next 2 lines in the 2 - Load Documents section of the quickstart
    //            client.uploadDocuments("/service/hotels.json");
    //            Thread.sleep(2000L); // wait 2 seconds for data to upload
    
    //Uncomment the following 5 search queries in the 3 - Search an index section of the quickstart
    //            // Query 1
    //            client.logMessage("\n*QUERY 1****************************************************************");
    //            client.logMessage("Search for: Atlanta'");
    //            client.logMessage("Return: All fields'");
    //            client.searchPlus("Atlanta");
    //
    //            // Query 2
    //            client.logMessage("\n*QUERY 2****************************************************************");
    //            client.logMessage("Search for: Atlanta");
    //            client.logMessage("Return: HotelName, Tags, Address");
    //            SearchServiceClient.SearchOptions options2 = client.createSearchOptions();
    //            options2.select = "HotelName,Tags,Address";
    //            client.searchPlus("Atlanta", options2);
    //
    //            //Query 3
    //            client.logMessage("\n*QUERY 3****************************************************************");
    //            client.logMessage("Search for: wifi & restaurant");
    //            client.logMessage("Return: HotelName, Description, Tags");
    //            SearchServiceClient.SearchOptions options3 = client.createSearchOptions();
    //            options3.select = "HotelName,Description,Tags";
    //            client.searchPlus("wifi,restaurant", options3);
    //
    //            // Query 4 -filtered query
    //            client.logMessage("\n*QUERY 4****************************************************************");
    //            client.logMessage("Search for: all");
    //            client.logMessage("Filter: Ratings greater than 4");
    //            client.logMessage("Return: HotelName, Rating");
    //            SearchServiceClient.SearchOptions options4 = client.createSearchOptions();
    //            options4.filter="Rating%20gt%204";
    //            options4.select = "HotelName,Rating";
    //            client.searchPlus("*",options4);
    //
    //            // Query 5 - top 2 results, ordered by
    //            client.logMessage("\n*QUERY 5****************************************************************");
    //            client.logMessage("Search for: boutique");
    //            client.logMessage("Get: Top 2 results");
    //            client.logMessage("Order by: Rating in descending order");
    //            client.logMessage("Return: HotelId, HotelName, Category, Rating");
    //            SearchServiceClient.SearchOptions options5 = client.createSearchOptions();
    //            options5.top=2;
    //            options5.orderby = "Rating%20desc";
    //            options5.select = "HotelId,HotelName,Category,Rating";
    //            client.searchPlus("boutique", options5);
    
            } catch (Exception e) {
                System.err.println("Exception:" + e.getMessage());
                e.printStackTrace();
            }
        }
    }
    

Menambahkan operasi HTTP

  1. Di folder src > main > java > service, tambahkan kelas SearchServiceClient. Untuk melakukan ini, pilih folder service, tekan Alt + Insert, pilih Java Class, lalu masukkan nama kelas.

  2. Buka kelas SearchServiceClient dan ganti konten kelas dengan kode berikut. Kode ini menyediakan operasi HTTP yang diperlukan untuk menggunakan Azure Cognitive Search REST API. Metode tambahan untuk membuat indeks, mengunggah dokumen, dan mengkueri indeks akan ditambahkan di bagian berikutnya.

    package main.java.service;
    
    import javax.json.Json;
    import javax.net.ssl.HttpsURLConnection;
    import java.io.IOException;
    import java.io.StringReader;
    import java.net.HttpURLConnection;
    import java.net.URI;
    import java.net.http.HttpClient;
    import java.net.http.HttpRequest;
    import java.net.http.HttpResponse;
    import java.nio.charset.StandardCharsets;
    import java.util.Formatter;
    import java.util.function.Consumer;
    
        /* This class is responsible for implementing HTTP operations for creating the index, uploading documents and searching the data*/
        public class SearchServiceClient {
            private final String _adminKey;
            private final String _queryKey;
            private final String _apiVersion;
            private final String _serviceName;
            private final String _indexName;
            private final static HttpClient client = HttpClient.newHttpClient();
    
        public SearchServiceClient(String serviceName, String adminKey, String queryKey, String apiVersion, String indexName) {
            this._serviceName = serviceName;
            this._adminKey = adminKey;
            this._queryKey = queryKey;
            this._apiVersion = apiVersion;
            this._indexName = indexName;
        }
    
        private static HttpResponse<String> sendRequest(HttpRequest request) throws IOException, InterruptedException {
            logMessage(String.format("%s: %s", request.method(), request.uri()));
            return client.send(request, HttpResponse.BodyHandlers.ofString());
        }
    
        private static URI buildURI(Consumer<Formatter> fmtFn)
                {
                    Formatter strFormatter = new Formatter();
                    fmtFn.accept(strFormatter);
                    String url = strFormatter.out().toString();
                    strFormatter.close();
                    return URI.create(url);
        }
    
        public static void logMessage(String message) {
            System.out.println(message);
        }
    
        public static boolean isSuccessResponse(HttpResponse<String> response) {
            try {
                int responseCode = response.statusCode();
    
                logMessage("\n Response code = " + responseCode);
    
                if (responseCode == HttpURLConnection.HTTP_OK || responseCode == HttpURLConnection.HTTP_ACCEPTED
                        || responseCode == HttpURLConnection.HTTP_NO_CONTENT || responseCode == HttpsURLConnection.HTTP_CREATED) {
                    return true;
                }
    
                // We got an error
                var msg = response.body();
                if (msg != null) {
                    logMessage(String.format("\n MESSAGE: %s", msg));
                }
    
            } catch (Exception e) {
                e.printStackTrace();
            }
    
            return false;
        }
    
        public static HttpRequest httpRequest(URI uri, String key, String method, String contents) {
            contents = contents == null ? "" : contents;
            var builder = HttpRequest.newBuilder();
            builder.uri(uri);
            builder.setHeader("content-type", "application/json");
            builder.setHeader("api-key", key);
    
            switch (method) {
                case "GET":
                    builder = builder.GET();
                    break;
                case "HEAD":
                    builder = builder.GET();
                    break;
                case "DELETE":
                    builder = builder.DELETE();
                    break;
                case "PUT":
                    builder = builder.PUT(HttpRequest.BodyPublishers.ofString(contents));
                    break;
                case "POST":
                    builder = builder.POST(HttpRequest.BodyPublishers.ofString(contents));
                    break;
                default:
                    throw new IllegalArgumentException(String.format("Can't create request for method '%s'", method));
            }
            return builder.build();
        }
    }
    
    

Membangun proyek

  1. Verifikasi bahwa proyek Anda memiliki struktur berikut.

    Kelas plus struktur direktori proyek

  2. Buka jendela alat Maven dan jalankan tujuan maven ini: verify exec:java Jalankan maven goal: verify exec:java

Saat pemrosesan selesai, cari pesan BUILD SUCCESS diikuti dengan kode keluar nol (0).

1 - Buat indeks

Parameter indeks hotel berisi bidang sederhana dan satu bidang yang kompleks. Contoh bidang sederhana adalah "HotelName" atau "Description". Bidang "Adress" adalah bidang yang kompleks karena memiliki subfields, seperti "Street Address" dan "City". Dalam mulai cepat ini, parameter indeks ditentukan menggunakan JSON.

  1. Di jendela Proyek, perluas pohon sumber untuk mengakses folder src > main >resources > service, dan tambahkan file index.json. Untuk melakukan ini, pilih folder app, tekan Alt + Insert, pilih File, lalu masukkan nama file.

  2. Buka index.json file dan masukkan parameter indeks berikut.

    {
      "name": "hotels-quickstart",
      "fields": [
        {
          "name": "HotelId",
          "type": "Edm.String",
          "key": true,
          "filterable": true
        },
        {
          "name": "HotelName",
          "type": "Edm.String",
          "searchable": true,
          "filterable": false,
          "sortable": true,
          "facetable": false
        },
        {
          "name": "Description",
          "type": "Edm.String",
          "searchable": true,
          "filterable": false,
          "sortable": false,
          "facetable": false,
          "analyzer": "en.lucene"
        },
        {
          "name": "Description_fr",
          "type": "Edm.String",
          "searchable": true,
          "filterable": false,
          "sortable": false,
          "facetable": false,
          "analyzer": "fr.lucene"
        },
        {
          "name": "Category",
          "type": "Edm.String",
          "searchable": true,
          "filterable": true,
          "sortable": true,
          "facetable": true
        },
        {
          "name": "Tags",
          "type": "Collection(Edm.String)",
          "searchable": true,
          "filterable": true,
          "sortable": false,
          "facetable": true
        },
        {
          "name": "ParkingIncluded",
          "type": "Edm.Boolean",
          "filterable": true,
          "sortable": true,
          "facetable": true
        },
        {
          "name": "LastRenovationDate",
          "type": "Edm.DateTimeOffset",
          "filterable": true,
          "sortable": true,
          "facetable": true
        },
        {
          "name": "Rating",
          "type": "Edm.Double",
          "filterable": true,
          "sortable": true,
          "facetable": true
        },
        {
          "name": "Address",
          "type": "Edm.ComplexType",
          "fields": [
            {
              "name": "StreetAddress",
              "type": "Edm.String",
              "filterable": false,
              "sortable": false,
              "facetable": false,
              "searchable": true
            },
            {
              "name": "City",
              "type": "Edm.String",
              "searchable": true,
              "filterable": true,
              "sortable": true,
              "facetable": true
            },
            {
              "name": "StateProvince",
              "type": "Edm.String",
              "searchable": true,
              "filterable": true,
              "sortable": true,
              "facetable": true
            },
            {
              "name": "PostalCode",
              "type": "Edm.String",
              "searchable": true,
              "filterable": true,
              "sortable": true,
              "facetable": true
            },
            {
              "name": "Country",
              "type": "Edm.String",
              "searchable": true,
              "filterable": true,
              "sortable": true,
              "facetable": true
            }
          ]
        }
      ]
    }
    

    Nama indeks akan menjadi "hotels-quickstart". Atribut pada bidang indeks menentukan bagaimana data terindeks dapat dicari dalam aplikasi. Misalnya, IsSearchable atribut harus ditetapkan ke setiap bidang yang harus disertakan dalam pencarian teks lengkap. Untuk mempelajari selengkapnya tentang atribut, lihat Membuat Indeks (REST).

    Bidang Description dalam indeks ini menggunakan analyzer properti opsional untuk menggantikan penganalisis bahasa Lucene default. Bidang Description_fr ini menggunakan penganalisis Lucene Prancis fr.lucene karena menyimpan teks Bahasa Prancis. Description ini menggunakan penganalisis bahasa Microsoft opsional en.lucene. Untuk mempelajari selengkapnya tentang penganalisa, lihat Penganalisa untuk pemrosesan teks di Azure Cognitive Search.

  3. Tambahkan kode berikut ke kelas SearchServiceClient. Metode ini membangun URL layanan AZURE Cognitive Search REST yang membuat dan menghapus indeks, dan yang menentukan apakah indeks ada. Metode ini juga membuat permintaan HTTP.

    public boolean indexExists() throws IOException, InterruptedException {
        logMessage("\n Checking if index exists...");
        var uri = buildURI(strFormatter -> strFormatter.format(
                "https://%s.search.windows.net/indexes/%s/docs?api-version=%s&search=*",
                _serviceName,_indexName,_apiVersion));
        var request = httpRequest(uri, _adminKey, "HEAD", "");
        var response = sendRequest(request);
        return isSuccessResponse(response);
    }
    
    public boolean deleteIndex() throws IOException, InterruptedException {
        logMessage("\n Deleting index...");
        var uri = buildURI(strFormatter -> strFormatter.format(
                "https://%s.search.windows.net/indexes/%s?api-version=%s",
                _serviceName,_indexName,_apiVersion));
        var request = httpRequest(uri, _adminKey, "DELETE", "*");
        var response = sendRequest(request);
        return isSuccessResponse(response);
    }
    
    
    public boolean createIndex(String indexDefinitionFile) throws IOException, InterruptedException {
        logMessage("\n Creating index...");
        //Build the search service URL
        var uri = buildURI(strFormatter -> strFormatter.format(
                "https://%s.search.windows.net/indexes/%s?api-version=%s",
                _serviceName,_indexName,_apiVersion));
        //Read in index definition file
        var inputStream = SearchServiceClient.class.getResourceAsStream(indexDefinitionFile);
        var indexDef = new String(inputStream.readAllBytes(), StandardCharsets.UTF_8);
        //Send HTTP PUT request to create the index in the search service
        var request = httpRequest(uri, _adminKey, "PUT", indexDef);
        var response = sendRequest(request);
        return isSuccessResponse(response);
    }
    
  4. Hapus kode berikut di kelas App. Kode ini menghapus indeks "hotels-quickstart", jika ada, dan membuat indeks baru berdasarkan parameter indeks dalam file "index.json".

    Jeda satu detik dimasukkan setelah permintaan pembuatan indeks. Jeda ini memastikan bahwa indeks dibuat sebelum Anda mengunggah dokumen.

        if (client.indexExists()) { client.deleteIndex();}
          client.createIndex("/service/index.json");
          Thread.sleep(1000L); // wait a second to create the index
    
  5. Buka jendela alat Maven, dan jalankan tujuan maven ini: verify exec:java

    Saat kode berjalan, cari pesan "Membuat indeks" diikuti dengan kode respons 201. Kode respons ini mengonfirmasi bahwa indeks dibuat. Pengoperasian harus diakhiri dengan pesan BUILD SUCCESS dan kode keluar nol (0).

2 - Mengunggah dokumen

  1. Di jendela Proyek, perluas pohon sumber untuk mengakses folder src > main >resources > service, dan tambahkan file hotels.json. Untuk melakukan ini, pilih folder app, tekan Alt + Insert, pilih File, lalu masukkan nama file.

  2. Masukkan dokumen hotel berikut ini ke dalam file.

    {
      "value": [
        {
          "@search.action": "upload",
          "HotelId": "1",
          "HotelName": "Secret Point Motel",
          "Description": "The hotel is ideally located on the main commercial artery of the city in the heart of New York. A few minutes away is Time's Square and the historic centre of the city, as well as other places of interest that make New York one of America's most attractive and cosmopolitan cities.",
          "Description_fr": "L'hôtel est idéalement situé sur la principale artère commerciale de la ville en plein cœur de New York. A quelques minutes se trouve la place du temps et le centre historique de la ville, ainsi que d'autres lieux d'intérêt qui font de New York l'une des villes les plus attractives et cosmopolites de l'Amérique.",
          "Category": "Boutique",
          "Tags": [ "pool", "air conditioning", "concierge" ],
          "ParkingIncluded": "false",
          "LastRenovationDate": "1970-01-18T00:00:00Z",
          "Rating": 3.60,
          "Address": {
            "StreetAddress": "677 5th Ave",
            "City": "New York",
            "StateProvince": "NY",
            "PostalCode": "10022",
            "Country": "USA"
          }
        },
        {
          "@search.action": "upload",
          "HotelId": "2",
          "HotelName": "Twin Dome Motel",
          "Description": "The hotel is situated in a  nineteenth century plaza, which has been expanded and renovated to the highest architectural standards to create a modern, functional and first-class hotel in which art and unique historical elements coexist with the most modern comforts.",
          "Description_fr": "L'hôtel est situé dans une place du XIXe siècle, qui a été agrandie et rénovée aux plus hautes normes architecturales pour créer un hôtel moderne, fonctionnel et de première classe dans lequel l'art et les éléments historiques uniques coexistent avec le confort le plus moderne.",
          "Category": "Boutique",
          "Tags": [ "pool", "free wifi", "concierge" ],
          "ParkingIncluded": "false",
          "LastRenovationDate": "1979-02-18T00:00:00Z",
          "Rating": 3.60,
          "Address": {
            "StreetAddress": "140 University Town Center Dr",
            "City": "Sarasota",
            "StateProvince": "FL",
            "PostalCode": "34243",
            "Country": "USA"
          }
        },
        {
          "@search.action": "upload",
          "HotelId": "3",
          "HotelName": "Triple Landscape Hotel",
          "Description": "The Hotel stands out for its gastronomic excellence under the management of William Dough, who advises on and oversees all of the Hotel’s restaurant services.",
          "Description_fr": "L'hôtel est situé dans une place du XIXe siècle, qui a été agrandie et rénovée aux plus hautes normes architecturales pour créer un hôtel moderne, fonctionnel et de première classe dans lequel l'art et les éléments historiques uniques coexistent avec le confort le plus moderne.",
          "Category": "Resort and Spa",
          "Tags": [ "air conditioning", "bar", "continental breakfast" ],
          "ParkingIncluded": "true",
          "LastRenovationDate": "2015-09-20T00:00:00Z",
          "Rating": 4.80,
          "Address": {
            "StreetAddress": "3393 Peachtree Rd",
            "City": "Atlanta",
            "StateProvince": "GA",
            "PostalCode": "30326",
            "Country": "USA"
          }
        },
        {
          "@search.action": "upload",
          "HotelId": "4",
          "HotelName": "Sublime Cliff Hotel",
          "Description": "Sublime Cliff Hotel is located in the heart of the historic center of Sublime in an extremely vibrant and lively area within short walking distance to the sites and landmarks of the city and is surrounded by the extraordinary beauty of churches, buildings, shops and monuments. Sublime Cliff is part of a lovingly restored 1800 palace.",
          "Description_fr": "Le sublime Cliff Hotel est situé au coeur du centre historique de sublime dans un quartier extrêmement animé et vivant, à courte distance de marche des sites et monuments de la ville et est entouré par l'extraordinaire beauté des églises, des bâtiments, des commerces et Monuments. Sublime Cliff fait partie d'un Palace 1800 restauré avec amour.",
          "Category": "Boutique",
          "Tags": [ "concierge", "view", "24-hour front desk service" ],
          "ParkingIncluded": "true",
          "LastRenovationDate": "1960-02-06T00:00:00Z",
          "Rating": 4.60,
          "Address": {
            "StreetAddress": "7400 San Pedro Ave",
            "City": "San Antonio",
            "StateProvince": "TX",
            "PostalCode": "78216",
            "Country": "USA"
          }
        }
      ]
    }
    
  3. Masukkan kode berikut ke dalam kelas SearchServiceClient. Kode ini membangun URL layanan REST untuk mengunggah dokumen hotel ke indeks, lalu membuat permintaan HTTP POST.

    public boolean uploadDocuments(String documentsFile) throws IOException, InterruptedException {
        logMessage("\n Uploading documents...");
        //Build the search service URL
        var endpoint = buildURI(strFormatter -> strFormatter.format(
                "https://%s.search.windows.net/indexes/%s/docs/index?api-version=%s",
                _serviceName,_indexName,_apiVersion));
        //Read in the data to index
        var inputStream = SearchServiceClient.class.getResourceAsStream(documentsFile);
        var documents = new String(inputStream.readAllBytes(), StandardCharsets.UTF_8);
        //Send HTTP POST request to upload and index the data
        var request = httpRequest(endpoint, _adminKey, "POST", documents);
        var response = sendRequest(request);
        return isSuccessResponse(response);
    }
    
  4. Hapus kode berikut di kelas App. Kode ini mengunggah dokumen dalam "hotels.json" ke indeks.

    client.uploadDocuments("/service/hotels.json");
    Thread.sleep(2000L); // wait 2 seconds for data to upload
    

    Jeda dua detik ditetapkan setelah permintaan unggah untuk memastikan bahwa proses pemuatan dokumen selesai sebelum Anda meminta indeks.

  5. Buka jendela alat Maven, dan jalankan tujuan maven ini: verify exec:java

    Karena Anda membuat indeks "hotels-quickstart" pada langkah sebelumnya, kode sekarang akan menghapusnya dan membuatnya kembali sebelum memuat dokumen hotel.

    Saat kode berjalan, cari pesan "Mengunggah dokumen" diikuti dengan kode respons 200. Kode respons ini mengonfirmasi bahwa dokumen diunggah ke indeks. Pengoperasian harus diakhiri dengan pesan BUILD SUCCESS dan kode keluar nol (0).

3 - Mencari indeks

Sekarang setelah Anda memuat dokumen hotel, Anda dapat membuat kueri pencarian untuk mengakses data hotel.

  1. Tambahkan kode berikut ke kelas SearchServiceClient. Kode ini menyusun URL layanan REST Azure Cognitive Search untuk mencari data terindeks dan mencetak hasil pencarian.

    Metode kelas SearchOptions dan createSearchOptions ini memungkinkan Anda menentukan subkumpulan opsi kueri Azure Cognitive Search REST API yang tersedia. Untuk informasi selengkapnya tentang opsi kueri REST API, lihat Dokumen Pencarian (Azure Cognitive Search REST API).

    Metode SearchPlus ini membuat URL kueri pencarian, membuat permintaan pencarian, lalu mencetak hasilnya ke konsol.

    public SearchOptions createSearchOptions() { return new SearchOptions();}
    
    //Defines available search parameters that can be set
    public static class SearchOptions {
    
        public String select = "";
        public String filter = "";
        public int top = 0;
        public String orderby= "";
    }
    
    //Concatenates search parameters to append to the search request
    private String createOptionsString(SearchOptions options)
    {
        String optionsString = "";
        if (options != null) {
            if (options.select != "")
                optionsString = optionsString + "&$select=" + options.select;
            if (options.filter != "")
                optionsString = optionsString + "&$filter=" + options.filter;
            if (options.top != 0)
                optionsString = optionsString + "&$top=" + options.top;
            if (options.orderby != "")
                optionsString = optionsString + "&$orderby=" +options.orderby;
        }
        return optionsString;
    }
    
    public void searchPlus(String queryString)
    {
        searchPlus( queryString, null);
    }
    
    public void searchPlus(String queryString, SearchOptions options) {
    
        try {
            String optionsString = createOptionsString(options);
            var uri = buildURI(strFormatter -> strFormatter.format(
                    "https://%s.search.windows.net/indexes/%s/docs?api-version=%s&search=%s%s",
                    _serviceName, _indexName, _apiVersion, queryString, optionsString));
            var request = httpRequest(uri, _queryKey, "GET", null);
            var response = sendRequest(request);
            var jsonReader = Json.createReader(new StringReader(response.body()));
            var jsonArray = jsonReader.readObject().getJsonArray("value");
            var resultsCount = jsonArray.size();
            logMessage("Results:\nCount: " + resultsCount);
            for (int i = 0; i <= resultsCount - 1; i++) {
                logMessage(jsonArray.get(i).toString());
            }
    
            jsonReader.close();
    
        }
        catch (Exception e) {
            e.printStackTrace();
        }
    
    }
    
  2. di kelas App, hapus kode berikut. Kode ini menyiapkan lima kueri berbeda, termasuk teks pencarian, parameter kueri, dan bidang data untuk dikembalikan.

    // Query 1
    client.logMessage("\n*QUERY 1****************************************************************");
    client.logMessage("Search for: Atlanta");
    client.logMessage("Return: All fields'");
    client.searchPlus("Atlanta");
    
    // Query 2
    client.logMessage("\n*QUERY 2****************************************************************");
    client.logMessage("Search for: Atlanta");
    client.logMessage("Return: HotelName, Tags, Address");
    SearchServiceClient.SearchOptions options2 = client.createSearchOptions();
    options2.select = "HotelName,Tags,Address";
    client.searchPlus("Atlanta", options2);
    
    //Query 3
    client.logMessage("\n*QUERY 3****************************************************************");
    client.logMessage("Search for: wifi & restaurant");
    client.logMessage("Return: HotelName, Description, Tags");
    SearchServiceClient.SearchOptions options3 = client.createSearchOptions();
    options3.select = "HotelName,Description,Tags";
    client.searchPlus("wifi,restaurant", options3);
    
    // Query 4 -filtered query
    client.logMessage("\n*QUERY 4****************************************************************");
    client.logMessage("Search for: all");
    client.logMessage("Filter: Ratings greater than 4");
    client.logMessage("Return: HotelName, Rating");
    SearchServiceClient.SearchOptions options4 = client.createSearchOptions();
    options4.filter="Rating%20gt%204";
    options4.select = "HotelName,Rating";
    client.searchPlus("*",options4);
    
    // Query 5 - top 2 results, ordered by
    client.logMessage("\n*QUERY 5****************************************************************");
    client.logMessage("Search for: boutique");
    client.logMessage("Get: Top 2 results");
    client.logMessage("Order by: Rating in descending order");
    client.logMessage("Return: HotelId, HotelName, Category, Rating");
    SearchServiceClient.SearchOptions options5 = client.createSearchOptions();
    options5.top=2;
    options5.orderby = "Rating%20desc";
    options5.select = "HotelId,HotelName,Category,Rating";
    client.searchPlus("boutique", options5);
    

    Terdapat dua cara pencocokan istilah dalam kueri: pencarian teks lengkap, dan filter. Kueri pencarian teks lengkap mencari satu atau beberapa istilah di bidang IsSearchable dalam indeks Anda. Filter adalah ekspresi boolean yang dievaluasi atas bidang IsFilterable dalam indeks. Anda dapat menggunakan pencarian teks lengkap dan memfilter bersama-sama atau secara terpisah.

  3. Buka jendela alat Maven, dan jalankan tujuan maven ini: verify exec:java

    Cari ringkasan setiap kueri dan hasilnya. Pengoperasian harus dilengkapi dengan pesan BUILD SUCCESS dan kode keluar nol (0).

Membersihkan sumber daya

Saat Anda bekerja di langganan Anda sendiri, pada akhir proyek, sebaiknya hapus sumber daya yang tidak lagi Anda butuhkan. Sumber daya yang Anda biarkan berjalan dapat dikenakan biaya. Anda dapat menghapus sumber daya satu per satu atau menghapus grup sumber daya untuk menghapus seluruh rangkaian sumber daya.

Anda bisa menemukan dan mengelola sumber daya di portal, menggunakan tautan Semua sumber daya atau Grup sumber daya di panel navigasi kiri.

Jika Anda menggunakan layanan gratis, ingatlah bahwa Anda terbatas pada tiga indeks, pengindeks, dan sumber data. Anda dapat menghapus item individual di portal agar tetap berada dalam batasan.

Langkah berikutnya

Dalam mulai cepat Java ini, Anda bekerja melalui serangkaian tugas untuk membuat indeks, memuatnya dengan dokumen, dan menjalankan kueri. Jika Anda merasa nyaman dengan konsep dasar, kami sarankan artikel berikut yang mencantumkan operasi pengindeks di REST.