看完这篇文章,你会知道以下内容
环境 es5.6.8 springboot2.0.1
- 如何使用java客户端对es进行相关增删改查操作
- 导入依赖
- 其中transport是与es发送请求的客户端,还有一些关于日志的,jackson是用来将对象和json互相转换的工具
<dependencies>
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>5.6.8</version>
</dependency>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>transport</artifactId>
<version>5.6.8</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-to-slf4j</artifactId>
<version>2.9.1</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.24</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.7.21</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.12</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.8.7</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.8.7</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.8.1</version>
</dependency>
</dependencies>
- 建立实体
public class Article {
private Long id;
private String title;
public Article() {
}
@Override
public String toString() {
return "Article{" +
"id=" + id +
", title='" + title + '\'' +
'}';
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public Article(Long id, String title) {
this.id = id;
this.title = title;
}
}
- 建立索引
- 获取client对象
- 创建index
- 释放资源
//获取client对象
Settings settings = Settings.builder().put("cluster.name","elasticsearch").build();
TransportClient transportClient = new PreBuiltTransportClient(settings).addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300));
//创建index
CreateIndexResponse response = transportClient.admin().indices().prepareCreate("blog2").get();
//释放资源
transportClient.close();
- 索引建好了,但是没有mapping信息
- 我们需要构建mapping json字符串,让client发送给es,这里我们使用XContentFactory构造json字符串,后面我们会使用jackson 以对象的形式转换为json
//获取client对象
Settings settings = Settings.builder().put("cluster.name", "elasticsearch").build();
TransportClient transportClient = new PreBuiltTransportClient(settings).addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300));
//构造mapping
XContentBuilder xContentBuilder = XContentFactory.jsonBuilder()
.startObject()
.startObject("article")
.startObject("properties")
.startObject("id")
.field("type", "long").field("store", true).field("index", false)
.endObject()
.startObject("title")
.field("type", "text").field("store", true).field("index", "analyzed").field("analyzer", "ik_max_word")
.endObject()
.endObject()
.endObject()
.endObject();
//加入mapping
PutMappingRequest source = Requests.putMappingRequest("blog2").type("article").source(xContentBuilder);
transportClient.admin().indices().putMapping(source).get();
transportClient.close();
- 创建一个doc
//获取client
Settings settings = Settings.builder().put("cluster.name", "elasticsearch").build();
TransportClient client = new PreBuiltTransportClient(settings).addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300));
//构造文档
XContentBuilder xContentBuilder = XContentFactory.jsonBuilder()
.startObject()
.field("id", 1).field("title", "test")
.endObject();
client.prepareIndex("blog2","article","1").setSource(xContentBuilder).get();
//释放资源
client.close();
- 使用jackson 创建一个doc
//获取client
Settings settings = Settings.builder().put("cluster.name", "elasticsearch").build();
TransportClient client = new PreBuiltTransportClient(settings).addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300));
//构造doc
Article article = new Article(11L, "test11");
//ObjectMapper是jackson内部对象
ObjectMapper objectMapper = new ObjectMapper();
String source = objectMapper.writeValueAsString(article);
client.prepareIndex("blog2","article",article.getId().toString()).setSource(source).get();
//释放资源
client.close();
- term查询(关键词)
//获取client
Settings settings = Settings.builder().put("cluster.name", "elasticsearch").build();
TransportClient client = new PreBuiltTransportClient(settings).addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300));
//构造查询
SearchResponse searchResponse = client.prepareSearch("blog2").setTypes("article").setQuery(QueryBuilders.termQuery("title", "test")).get();
SearchHits hits = searchResponse.getHits();
//获取结果数据
System.out.println("hits total:"+hits.getTotalHits());
Iterator<SearchHit> iterator = hits.iterator();
iterator.forEachRemaining(i -> System.out.println(i.getSourceAsString()+i.getSource().get("title")));
//释放资源
client.close();
- querystring查询
//获取client
Settings settings = Settings.builder().put("cluster.name", "elasticsearch").build();
TransportClient client = new PreBuiltTransportClient(settings).addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300));
//构造条件
SearchResponse searchResponse = client.prepareSearch("blog2").setTypes("article").setQuery(QueryBuilders.queryStringQuery("test").defaultField("title")).get();
//获取结果集
SearchHits hits = searchResponse.getHits();
System.out.println(hits.getTotalHits());
hits.iterator().forEachRemaining(i -> System.out.println(i.getSourceAsString()+"\n"+i.getSource().get("title")));
//释放资源
client.close();
- 根据id查询
//获取client
Settings settings = Settings.builder().put("cluster.name", "elasticsearch").build();
TransportClient client = new PreBuiltTransportClient(settings).addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300));
//构造条件
SearchResponse searchResponse = client.prepareSearch("blog2").setTypes("article").setQuery(QueryBuilders.idsQuery().addIds("1", "2")).get();
//获取数据
SearchHits hits = searchResponse.getHits();
System.out.println(hits.getTotalHits());
hits.iterator().forEachRemaining(i -> System.out.println(i.getSourceAsString()+"\n"+i.getSource().get("id")));
//释放资源
client.close();
- 批量插入 删除
Settings settings = Settings.builder().put("cluster.name", "elasticsearch").build();
TransportClient client = new PreBuiltTransportClient(settings).addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300));
for (int i = 11; i <= 100; i++) {
Article article = new Article();
long id = Integer.valueOf(i).longValue();
// System.out.println(id);
article.setId(id);
article.setTitle(i+" 搜索工作其实很快乐");
ObjectMapper objectMapper = new ObjectMapper();
String content = objectMapper.writeValueAsString(article);
client.prepareIndex("blog2", "article", String.valueOf(i)).setSource(content.getBytes(),XContentType.JSON).get();
// client.prepareDelete("blog2","article",String.valueOf(i)).get();
}
client.close();
- 有数据了我们就可以测试分页查询了
Settings settings = Settings.builder().put("cluster.name", "elasticsearch").build();
TransportClient client = new PreBuiltTransportClient(settings).addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300));
SearchResponse searchResponse = client.prepareSearch().setIndices("blog2").setTypes("article").setQuery(QueryBuilders.matchAllQuery()).setFrom(0).setSize(5).get();
SearchHits hits = searchResponse.getHits();
hits.iterator().forEachRemaining(i -> System.out.println(i.getSourceAsString()));
client.close();
- 测试高亮
Settings settings = Settings.builder().put("cluster.name", "elasticsearch").build();
TransportClient client = new PreBuiltTransportClient(settings).addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300));
SearchRequestBuilder searchRequestBuilder = client.prepareSearch().setIndices("blog2").setTypes("article").setQuery(QueryBuilders.termQuery("title", "搜索"));
HighlightBuilder highlightBuilder = new HighlightBuilder();
highlightBuilder.preTags("<em>");
highlightBuilder.postTags("</em>");
highlightBuilder.field("title");
searchRequestBuilder.highlighter(highlightBuilder);
SearchResponse searchResponse = searchRequestBuilder.get();
SearchHits hits = searchResponse.getHits();
hits.iterator().forEachRemaining(i -> {
System.out.println(i.getSourceAsString()+"\n"+i.getHighlightFields());
Text[] texts = i.getHighlightFields().get("title").getFragments();
for(Text text:texts){
System.out.println(text);
}
});
client.close();
当然在与实际项目结合的时候,我们不会用原生的方式进行操作,spring data es会帮我们封装好常用的crud方法,在第三讲,我们会将如何用springboot整合es