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插件进行查看,例如: