天天看点

使用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 上下文中。

继续阅读