Elasticsearch初探-通过Java API操作ES

最近想的比较多, 小说项目大部分功能都已经完成了。但是还是有很多的细节要完善:

  • ES搜索如何集成进去
  • Kafka消费者功能要完善
  • 统计PV,UV,访问者分布图,操作日志等
  • .....

想想还是头大的 !·_·!

进入主题

今天是要介绍通过Java API来如何操作ES。 首先介绍环境,公司电脑上安装的ES版本是5.5.2

引入pom

    org.elasticsearch.client
    transport
    5.5.2

这里version需要和自己电脑上安装的ES版本一致,不然会出现兼容性问题

基本配置

既然需要操作ES, 当然需要先链接上ES啊

@Configuration
public class ESConfig {
    @Bean
    public TransportClient client() throws UnknownHostException {
        //节点信息, 可以添加多个
        InetSocketTransportAddress node = new InetSocketTransportAddress(InetAddress.getByName("192.168.87.134"), 9300);
        
        TransportClient client = new PreBuiltTransportClient(getSetting());
        client.addTransportAddress(node);
    
        return client;
    }
    
    private Settings getSetting() {
        return Settings.builder()
            .put("cluster.name", "es_books")
            .build();
    }
}

@Configuration意思是告诉Spring 这个类是一个配置类, 大家就把这个类理解成xml就可以了

实际操作

  1. 通过ID获取数据
// 这里的ID是ES生成的ID
GetResponse fields = client.prepareGet("books", "books", "1").get();
//getSource() 会获取到数据
System.out.println(fields.getSource());

在实际操作中, 如果我们在新安装的ES中进行这样的操作, 会出现 索引不存在 的问题

[books] IndexNotFoundException[no such index]
  1. 所以我们需要先判断该索引是否存在
IndicesExistsRequest existsRequest = new IndicesExistsRequest("books");
IndicesExistsResponse response = client.admin().indices().exists(existsRequest).actionGet();

//存在 true, 不存在 false
System.out.println(response.isExists());    
  1. 不存在就创建索引

创建名称为 booksadds, 类型为booksadd 5个分片1个副片 类型为空

String type = "{" +
        "\"booksadd\": {" +
        "}" +
        "}";
client.admin().indices().prepareCreate("booksadds")
        .setSettings(Settings.builder().put("index.number_of_shards", 5).put("index.number_of_replicas", 1))
        .addMapping("booksadd", type, XContentType.JSON).get();

特殊说明: 如果需要设置类型, 参考红线部分

参考
  1. 保存单条数据
XContentBuilder contentBuilder = XContentFactory.jsonBuilder()
        .startObject()
        .field("id", 1)
        .field("booksName", "九星霸体诀")
        .field("author", "123")
        .endObject();
IndexResponse response = client.prepareIndex("booksadds", "booksadd", "1")
        .setSource(contentBuilder)
        .get();

System.out.println(response);

通过查看setSource方法, 可以看到内部有很多方法,大家可以不用局限于这一种。

  1. 批量保存数据
XContentBuilder contentBuilder = XContentFactory.jsonBuilder()
        .startObject()
        .field("id", 2)
        .field("booksName", "九星霸体诀")
        .field("author", "123")
        .endObject();

IndexRequestBuilder requestBuilder = client.prepareIndex("booksadds", "booksadd", "2")
        .setSource(contentBuilder);

//批量加入
BulkRequestBuilder prepareBulk = client.prepareBulk();
prepareBulk.add(requestBuilder);
prepareBulk.execute().get();
  1. 修改数据
UpdateRequest request = new UpdateRequest("booksadds", "booksadd", "2");

XContentBuilder contentBuilder = XContentFactory.jsonBuilder()
        .startObject()
        .field("booksName", "九星霸体诀11111")
        .endObject();

request.doc(contentBuilder);

UpdateResponse response = client.update(request).get();

System.out.println(response);

同样 request.doc()方法也并不局限于这一种方式

  1. 删除数据
DeleteResponse requestBuilder = this.client.prepareDelete("booksadds", "booksadd", "2").get();

System.out.println(requestBuilder.getResult());
  1. 删除索引
client.admin().indices().prepareDelete("booksadds").execute().get();
  1. 复杂查询
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();

//匹配booksName查询
boolQueryBuilder.must(QueryBuilders.matchQuery("booksName", "九星"));

SearchResponse searchResponse = client.prepareSearch("books", "books")
        .setQuery(boolQueryBuilder)
        .addSort("id", SortOrder.DESC)  //排序
        .setFrom(0)                     //分页
        .setSize(10)
        .execute()
        .actionGet();

System.out.println(searchResponse.getHits());

完结

到这里 通过API操作ES完成, 算是一个抛砖引玉的过程, 期待大家更多的操作。

你可能感兴趣的:(Elasticsearch初探-通过Java API操作ES)