Java客戶端管理es
關於elasticsearch,一般基本的操作就是:創建索引庫、創建Mapping、添加文檔、查看內容,本篇博客就從這幾個方面介紹如何使用。
首先要做的就是新建一個項目,引入相關依賴
<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>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.8</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.8.1</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.8.1</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.8.1</version>
</dependency>
</dependencies>
一、使用Java客戶端創建索引庫
操作步驟
1、創建一個settings對象,相當於一個配置信息,主要是配置集羣的名稱
2、創建一個客戶端client對象
3、使用client對象創建一個索引庫
4、關閉client對象
代碼實現
@Test
public void createIndex() throws Exception{
// 1、創建一個settings對象,相當於一個配置信息,主要是配置集羣的名稱
// elasticsearch.yml文件默認的是cluster的名字是elasticsearch,如果這裏你自己改了的話,要對應自己配置的名字
Settings settings = Settings.builder().put("cluster.name", "elasticsearch").build();
// 2、創建一個客戶端client對象
TransportClient client = new PreBuiltTransportClient(settings);
// 192.168.226.132、192.168.226.133、192.168.226.133是我這裏的搭建elasticsearch的集羣ip,當然這裏使用一臺也是可以的
client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("192.168.226.132"),9301));
client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("192.168.226.133"),9301));
client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("192.168.226.134"),9301));
// 3、使用client對象創建一個索引庫
client.admin().indices().prepareCreate("index_hello")
// 執行操作
.get();
// 4、關閉client對象
client.close();
}
二、使用Java客戶端設置Mapping
操作步驟
1、創建一個settings對象,相當於一個配置信息,主要是配置集羣的名稱
2、創建一個客戶端client對象
3、創建一個mapping信息,一個json數據,可以是字符串,也可以是XContentBuilder對象
4、使用client把mapping信息設置到索引庫中
5、關閉client對象
代碼實現
@Test
public void createMapping() throws Exception{
// 1、創建一個settings對象,相當於一個配置信息,主要是配置集羣的名稱
Settings settings = Settings.builder().put("cluster.name", "elasticsearch").build();
// 2、創建一個客戶端client對象
TransportClient client = new PreBuiltTransportClient(settings);
client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("192.168.226.132"),9301));
client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("192.168.226.133"),9301));
client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("192.168.226.134"),9301));
// 3、創建一個mapping信息,一個json數據,可以是字符串,也可以是XContentBuilder對象
XContentBuilder builder = XContentFactory.jsonBuilder()
.startObject()
.startObject("article")
.startObject("properties")
.startObject("id")
.field("type","long")
.field("store",true)
.endObject()
.startObject("title")
.field("type","text")
.field("store",true)
.field("analyzer","standard")
.endObject()
.startObject("content")
.field("type","text")
.field("store",true)
.field("analyzer","standard")
.endObject()
.endObject()
.endObject()
.endObject();
// 4、使用client把mapping信息設置到索引庫中
client.admin().indices()
// 設置要做映射的索引
.preparePutMapping("index_hello")
// 設置要做映射的type
.setType("article")
// mapping信息,可以是XContentBuild對象,可以是jsona格式的字符串
.setSource(builder)
// 執行操作
.get();
// 5、關閉client對象
client.close();
}
XContentBuilder的使用
關於XContentBuilder這個使用,這裏再介紹一下,XContentBuilder是elasticsearch提供的一種構造json格式的數據對象的類,它的startObject類似一個左大括號“{”,endObject類似一個右大括號“}”。下邊就來對比下,它的格式與json格式,看是如何對應的
三、使用Java客戶端添加文檔
操作步驟
1、創建一個settings對象,相當於一個配置信息,主要是配置集羣的名稱
2、創建一個客戶端client對象
3、創建一個文檔對象,一個json數據,可以是字符串,也可以是XContentBuilder對象
4、將文檔對象添加到索引庫
5、關閉client對象
代碼實現
(1)通過XContentBuilder構造json的方式直接放數據到elasticsearch中
@Test
public void testAddDocument() throws Exception{
// 1、創建一個settings對象,相當於一個配置信息,主要是配置集羣的名稱
Settings settings = Settings.builder().put("cluster.name", "elasticsearch").build();
// 2、創建一個客戶端client對象
TransportClient client = new PreBuiltTransportClient(settings);
client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("192.168.226.132"),9301));
client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("192.168.226.133"),9301));
client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("192.168.226.134"),9301));
// 3、創建一個文檔對象
XContentBuilder builder=XContentFactory.jsonBuilder()
.startObject()
.field("id",1L)
.field("title","烽火佳人")
.field("content","像風走過八千里")
.endObject();
// 4、將文檔對象添加到索引庫
client.prepareIndex()
// 設置索引名稱
.setIndex("index_hello")
// 設置type
.setType("article")
// 設置文檔的id,如果不設置會自動生成一個id
.setId("1")
// 設置文檔信息
.setSource(builder)
// 執行操作
.get();
// 5、關閉client對象
client.close();
}
(2)使用實體類的方式向elasticsearch存數據
創建一個實體類
@Data
public class Article {
private Long id;
private String title;
private String content;
}
@Test
public void testAddDocument2() throws Exception{
// 1、創建一個settings對象,相當於一個配置信息,主要是配置集羣的名稱
Settings settings = Settings.builder().put("cluster.name", "elasticsearch").build();
// 2、創建一個客戶端client對象
TransportClient client = new PreBuiltTransportClient(settings);
client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("192.168.226.132"),9301));
client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("192.168.226.133"),9301));
client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("192.168.226.134"),9301));
// 3、創建一個Article對象
Article article = new Article();
// 設置對象屬性
article.setId(2L);
article.setTitle("烽火佳人2");
article.setContent("像風走過八千里2");
// 將article 對象轉換成json格式的字符串
ObjectMapper objectMapper = new ObjectMapper();
String jsonDocument = objectMapper.writeValueAsString(article);
// 使用client對象把文檔寫入索引庫
client.prepareIndex("index_hello","article","2")
.setSource(jsonDocument, XContentType.JSON)
.get();
// 關閉客戶端
client.close();
}
四、使用Java客戶端實現搜索
查詢方式
1、根據id搜索
QueryBuilder queryBuilder = QueryBuilders.idsQuery().addIds("1", "2");
2、根據Term搜索(關鍵詞)
我這裏由於用的是standard分析器,elasticsearch自帶的就是這個分析器,這個分析器會將字拆成一個一個的,所以這裏查詢的時候,也只能用一個字的格式的查,如果想用詞語的、多個字的,可以在elasticsearch中裝上IK分析器,設置mapping的analyzer時候設置爲“ik_smart”就可以了
關於standard分析器和IK分析器可參考博客:
elasticsearch中的分析器standard與IK分析器的區別,以及IK分析器如何安裝
QueryBuilder queryBuilder = QueryBuilders.termQuery("title","烽");
3、使用QueryString搜索
QueryBuilder queryBuilder = QueryBuilders.queryStringQuery("烽火").defaultField("title");
操作步驟
1、創建一個settings對象,相當於一個配置信息,主要是配置集羣的名稱
2、創建一個客戶端client對象
3、創建一個查詢對象
4、使用client執行查詢
5、取查詢結果
(1)取查詢結果的總記錄數
(2)取查詢結果列表
6、關閉client對象
代碼實現
@Test
public void testSearch () throws Exception{
// 1、創建一個settings對象,相當於一個配置信息,主要是配置集羣的名稱
Settings settings = Settings.builder().put("cluster.name", "elasticsearch").build();
// 2、創建一個客戶端client對象
TransportClient client = new PreBuiltTransportClient(settings);
client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("192.168.226.132"),9301));
client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("192.168.226.133"),9301));
client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("192.168.226.134"),9301));
// 3、創建一個查詢對象
//QueryBuilder queryBuilder = QueryBuilders.idsQuery().addIds("1", "2");
//QueryBuilder queryBuilder = QueryBuilders.termQuery("title","烽");
QueryBuilder queryBuilder = QueryBuilders.queryStringQuery("烽火").defaultField("title");
// 4、使用client執行查詢
SearchResponse searchResponse = client.prepareSearch("index_hello")
.setTypes("article")
.setQuery(queryBuilder)
.get();
// 5、取查詢結果
SearchHits hits = searchResponse.getHits();
// 5.1、取查詢結果的總記錄數
System.out.println("查詢結果總記錄數:" + hits.getTotalHits());
///5.2、取查詢結果列表
Iterator<SearchHit> iterator = hits.iterator();
while (iterator.hasNext()) {
SearchHit searchHit = iterator.next(); // 每個查詢對象
// 打印文檔對象
System.out.println("------------------------------文檔對象");
System.out.println(searchHit.getSourceAsString()); // 獲取字符串格式打印
// 取文檔的屬性
System.out.println("------------------------------文檔的屬性");
Map<String, Object> doucument = searchHit.getSource();
System.out.println(doucument.get("title"));
}
//6、關閉client對象
client.close();
}
補充:
這裏查看數據也可以使用kibana來查看,也可以在瀏覽器裏添加Elasticsearch Head插件進行查看,例如: