天天看點

使用ES官方提供的Java用戶端API 實作一個公共處理mapping的映射

作者:HerrZhang18

首先,您需要建立一個類來表示您的索引和文檔類型,例如:

public class MyDocument {
    private String id;
    private String name;
    private String description;
    // ... other fields and getters/setters
}           

接下來,您需要定義一個 ElasticSearch 的 mapping 映射,以告訴 ElasticSearch 如何将 MyDocument 類型的對象映射到文檔中。

在本示例中,我們将使用 ElasticSearch 提供的 XContentBuilder 類來定義映射。您可以根據需要添加其他映射屬性,例如字段類型、索引選項等等。以下是一個簡單的示例:

XContentBuilder builder = XContentFactory.jsonBuilder()
        .startObject()
            .startObject("properties")
                .startObject("id")
                    .field("type", "keyword")
                .endObject()
                .startObject("name")
                    .field("type", "keyword")
                .endObject()
                .startObject("description")
                    .field("type", "text")
                    .field("analyzer", "standard")
                .endObject()
            .endObject()
        .endObject();           

在這個示例中,我們使用 XContentFactory 類的 jsonBuilder 方法來建立一個 JSON 對象,然後使用 startObject、endObject、field 等方法來定義映射屬性。

接下來,我們可以建立一個公共方法來處理映射。這個方法應該接受一個 String 類型的參數,即我們想要映射的索引名稱,然後使用 ElasticSearch 的 Java 用戶端 API 來生成映射。

以下是一個示例方法:

@Service
public class MappingService {

    @Autowired
    private RestHighLevelClient client;

    public void createMapping(String indexName) throws IOException {
        PutMappingRequest request = new PutMappingRequest(indexName);
        request.source(XContentFactory.jsonBuilder()
                .startObject()
                    .startObject("properties")
                        .startObject("id")
                            .field("type", "keyword")
                        .endObject()
                        .startObject("name")
                            .field("type", "keyword")
                        .endObject()
                        .startObject("description")
                            .field("type", "text")
                            .field("analyzer", "standard")
                        .endObject()
                    .endObject()
                .endObject());
        client.indices().putMapping(request, RequestOptions.DEFAULT);
    }
}           

在這個示例中,我們首先建立了一個 PutMappingRequest 對象,其中包含了要映射的索引名稱和映射定義。然後,我們使用 RestHighLevelClient 的 indices().putMapping 方法将請求發送到 ElasticSearch。

請注意,我們在這個示例中注入了一個 RestHighLevelClient 執行個體,它是 ElasticSearch 官方提供的 Java 用戶端 API。您需要在應用程式中配置 RestHighLevelClient 執行個體,例如:

@Configuration
public class ElasticSearchConfig {

    @Value("${elasticsearch.host}")
    private String host;

    @Value("${elasticsearch.port}")
    private int port;

    @Value("${elasticsearch.scheme}")
    private String scheme;

    @Bean
    public RestHighLevelClient client() {
        final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
        credentialsProvider.setCredentials(AuthScope.ANY,
                new UsernamePasswordCredentials("username", "password"));

        RestClientBuilder builder = RestClient.builder(
                new HttpHost(host, port, scheme))
                .setHttpClientConfigCallback(httpClientBuilder -> httpClientBuilder
                        .setDefaultCredentialsProvider(credentialsProvider));

        RestHighLevelClient client = new RestHighLevelClient(builder);
        return client;
    }
}           

在這個示例中,我們使用 @Value 注解從應用程式配置中擷取 ElasticSearch 的主機名、端口和協定類型,并使用 RestClient.builder 方法建立了一個 RestClientBuilder 對象。然後,我們配置了一個 BasicCredentialsProvider,以便在請求時添加使用者名和密碼。最後,我們建立了一個 RestHighLevelClient 執行個體,并将其作為 Bean 注冊到 Spring 上下文中。

繼續閱讀