看完這篇文章,你會知道以下內容
環境 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