Elasticsearch初探-经过Java API操做ES

最近想的比较多, 小说项目大部分功能都已经完成了。可是仍是有不少的细节要完善:node

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

想一想仍是头大的 !·_·!json

进入主题

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

引入pom
<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>transport</artifactId>
    <version>5.5.2</version>
</dependency>
复制代码

这里version须要和本身电脑上安装的ES版本一致,否则会出现兼容性问题app

基本配置

既然须要操做ES, 固然须要先连接上ES啊elasticsearch

@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就能够了ui

实际操做

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

在实际操做中, 若是咱们在新安装的ES中进行这样的操做, 会出现 索引不存在 的问题this

[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个副片 类型为空spa

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方法, 能够看到内部有不少方法,你们能够不用局限于这一种。code

  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完成, 算是一个抛砖引玉的过程, 期待你们更多的操做。

相关文章
相关标签/搜索