es–基础–07–es自身API
es入门学习7-java-es自身API
代码地址
https://gitee.com/DanShenGuiZu/learnDemo/tree/mysql_mybaties_DB/elasticsearch-learn
使用起前面的集群环境进行学习
1、公共的东西
1.1、项目位置
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/ff069662c47cbd5f34b1d600f9139e91.png)
1.2、导入依赖
<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.elasticsearch.plugin</groupId>
<artifactId>transport-netty4-client</artifactId>
<version>5.6.8</version>
</dependency>
1.3、工具类
package fei.zhou.elasticsearch01;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.transport.InetSocketTransportAddress;
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
import org.elasticsearch.transport.client.PreBuiltTransportClient;
import org.junit.Test;
public class ESTools {
public static String ipStr1 = "60.205.188.229";
public static String ipStr2 = "60.205.188.229";
public static String ipStr3 = "60.205.188.229";
public static int port1 = 9301;
public static int port2 = 9302;
public static int port3 = 9303;
// 集群名称
public static String clusterName = "cluster.name";
// 集群名称的值
public static String clusterNameValue = "elasticsearch";
/**
* 创建客户端
*
* @author feizhou
* @since 2020/12/28 11:10
*/
public static TransportClient createClient() throws UnknownHostException {
// 创建一个Settings对象
Settings settings = Settings.builder()
// 构建集群名称
.put(clusterName, clusterNameValue).build();
// 创建一个TransPortClient对象
TransportClient client = new PreBuiltTransportClient(settings);
// 添加集群间的通讯
client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName(ipStr1), port1));
client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName(ipStr2), port2));
client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName(ipStr3), port3));
System.out.println("创建客户端成功");
return client;
}
/**
* 关闭客户端
*
* @author feizhou
* @since 2020/12/28 11:10
*/
public static void closeClient(TransportClient client) {
client.close();
System.out.println("成功关闭客户端");
}
/**
* 查询
*
* @author feizhou
* @since 2020/12/28 12:00
*/
public static SearchHit[] search(QueryBuilder queryBuilder, String indices, String types) throws Exception {
TransportClient client = createClient();
// 执行查询
SearchResponse searchResponse = client.prepareSearch(indices).setTypes(types).setQuery(queryBuilder)
// 执行查询
.get();
// 取查询结果
SearchHits searchHits = searchResponse.getHits();
SearchHit[] hits = searchHits.getHits();
// 关闭client
closeClient(client);
return hits;
}
/**
* 分页查询
*
* @author feizhou
* @since 2020/12/28 12:00
*/
public static SearchHits searchPage(QueryBuilder queryBuilder, String indices, String types, int startIndex,
int pageSize) throws Exception {
TransportClient client = createClient();
// 执行查询
SearchResponse searchResponse = client.prepareSearch(indices).setTypes(types).setQuery(queryBuilder)
// 设置分页信息
.setFrom(startIndex)
// 每页显示的行数
.setSize(pageSize)
// 执行查询
.get();
// 取查询结果
SearchHits searchHits = searchResponse.getHits();
// 关闭client
closeClient(client);
return searchHits;
}
}
2、索引
2.1、创建索引
@Test
// 创建索引
public void createIndex() throws Exception {
TransportClient client = ESTools.createClient();
// 使用client对象创建一个索引库
client.admin().indices().prepareCreate("blog5")
// 执行操作
.get();
ESTools.closeClient(client);
}
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/468bd996183e4cf6401ff9e8ef9b254c.png)
3、映射mapping
3.1、创建映射mapping
@Test
// 创建映射
public void createMapping() throws Exception {
TransportClient client = ESTools.createClient();
XContentBuilder xContentBuilder = 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", "ik_smart")
.endObject()
.startObject("content")
.field("type", "text")
.field("store", true)
.field("analyzer","ik_smart")
.endObject()
.endObject()
.endObject()
.endObject();
//使用client把mapping信息设置到索引库中
client.admin().indices()
//设置要做映射的索引
.preparePutMapping("blog5")
//设置要做映射的type
.setType("article")
//mapping信息
//可以是XContentBuilder对象
//可以是json格式的字符串
.setSource(xContentBuilder)
//执行操作
.get();
ESTools.closeClient(client);
}
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/7a077823863039dde45b2f43af799874.png)
4、文档document
4.1、创建文档
4.1.1、创建文档1(通过XContentBuilder)
@Test
// 创建一个文档对象
public void createDocument() throws Exception {
TransportClient client = ESTools.createClient();
//创建一个文档对象
XContentBuilder builder = XContentFactory.jsonBuilder()
.startObject()
.field("id",1)
.field("title","北方入秋速度明显加快 多地降温幅度最多可达10度22222")
.field("content", "低龄未成年人严重犯罪问题,社会关注,如何做到不枉不纵,精准惩治?刑法修正案(十一)对此作出重大修改,对法定最低刑事责任年龄作个别下调。规定12周岁以上低龄未成年人实施以下犯罪行为,应当负刑事责任")
.endObject();
//把文档对象添加到索引库
client.prepareIndex()
//设置索引名称
.setIndex("blog5")
//设置type
.setType("article")
//设置文档的id,如果不设置的话自动的生成一个id
.setId("1")
//设置文档信息
.setSource(builder)
//执行操作
.get();
ESTools.closeClient(client);
}
4.1.2、创建文档2
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.6</version>
</dependency>
package fei.zhou.elasticsearch01.demo2;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.common.xcontent.XContentFactory;
import org.elasticsearch.common.xcontent.XContentType;
import org.junit.Test;
import fei.zhou.elasticsearch01.ESTools;
public class Test1 {
@Test
public void createDocument2() throws Exception {
TransportClient client = ESTools.createClient();
//创建一个Article对象
Article article = new Article();
//设置对象的属性
article.setId(3);
article.setTitle("快讯!外媒:英国著名双面间谍乔治·布莱克在俄去世,终年98岁");
article.setContent("【环球网报道】路透社刚刚消息称,俄罗斯对外情报局发言人伊万诺夫告诉塔斯社,英国冷战时期著名的双面间谍乔治·布莱克26日在俄罗斯去世,终年98岁。据路透社此前介绍,在1944年至1961年期间,布莱克曾担任英国的秘密间谍,后被起诉为前苏联刺探军情而被判入狱42年。1966年他从伦敦越狱,之后一直生活在莫斯科。2007年,俄罗斯对外情报局还为布莱克授勋,庆祝这名双重间谍85岁寿辰。");
//把article对象转换成json格式的字符串。
ObjectMapper objectMapper = new ObjectMapper();
String jsonDocument = objectMapper.writeValueAsString(article);
//使用client对象把文档写入索引库
client.prepareIndex("blog5","article", "3")
.setSource(jsonDocument, XContentType.JSON)
.get();
ESTools.closeClient(client);
}
public class Article {
private long id;
private String title;
private String content;
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 String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
}
}
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/e8fb78c18d5ba02b3ebe80ff83f5e049.png)
4.2、查询
4.2.1、关键词查询
@Test
public void testTermQuery() throws Exception {
QueryBuilder queryBuilder = QueryBuilders.termQuery("content", "建了");
String indices = "blog5";
String types = "article";
SearchHit[] hits = ESTools.search(queryBuilder, indices, types);
if (hits != null && hits.length > 0) {
for (SearchHit hit : hits) {
Map<String, Object> map = hit.getSource();
System.out.println("文档内容:" + map);
}
}
}
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/dd76ecca51ed9c821f569c789bb49ce6.png)
4.2.2、字符串查询
@Test
public void testQueryStringQuery() throws Exception {
// 创建一个QueryBuilder对象
QueryBuilder queryBuilder = QueryBuilders.queryStringQuery("建了房子").defaultField("content");
String indices = "blog5";
String types = "article";
SearchHit[] hits = ESTools.search(queryBuilder, indices, types);
if (hits != null && hits.length > 0) {
for (SearchHit hit : hits) {
Map<String, Object> map = hit.getSource();
System.out.println("文档内容:" + map);
}
}
}
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/83dd891254c6c0a144a7bc7b1067c0fb.png)
4.2.3、ID查询
@Test
public void testSearchById() throws Exception {
// 创建一个QueryBuilder对象
QueryBuilder queryBuilder = QueryBuilders.idsQuery().addIds("1", "3");
String indices = "blog5";
String types = "article";
SearchHit[] hits = ESTools.search(queryBuilder, indices, types);
if (hits != null && hits.length > 0) {
for (SearchHit hit : hits) {
Map<String, Object> map = hit.getSource();
System.out.println("文档内容:" + map);
}
}
}
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/5f17ff741775ec3250333c772096ebd2.png)
4.2.4、分页查询
@Test
public void testSearchPage() throws Exception {
// 创建一个QueryBuilder对象
QueryBuilder queryBuilder = QueryBuilders.idsQuery().addIds("1", "3", "4", "5", "6");
String indices = "blog5";
String types = "article";
int startIndex = 0;
int pageSize = 2;
SearchHits searchHits = ESTools.searchPage(queryBuilder, indices, types, startIndex, pageSize);
System.out.println("查询结果总记录数:" + searchHits.getTotalHits());
SearchHit[] hits = searchHits.getHits();
if (hits != null && hits.length > 0) {
for (SearchHit hit : hits) {
Map<String, Object> map = hit.getSource();
System.out.println("文档内容:" + map);
}
}
}
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/6a0acece7820e8008a49370eb76a92e5.png)
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/14d0a300f0d4bc9ba8d1205fef141dc4.png)
4.2.5、查询结果高亮操作
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/d689ebd1cc34c79e19639f3645c65b3e.png)
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/43e7c12790b5e5b89493e39c1684e96c.png)
@Test
public void testSearchPageHight() throws Exception {
TransportClient client = ESTools.createClient();
// 创建一个QueryBuilder对象
QueryBuilder queryBuilder = QueryBuilders.queryStringQuery("建了房子").defaultField("content");
String indices = "blog5";
String types = "article";
String highlightField = "content";
HighlightBuilder highlightBuilder = new HighlightBuilder();
// 高亮显示的字段
highlightBuilder.field(highlightField);
highlightBuilder.preTags("<em>");
highlightBuilder.postTags("</em>");
// 执行查询
SearchResponse searchResponse = client.prepareSearch(indices).setTypes(types).setQuery(queryBuilder)
// 设置高亮信息
.highlighter(highlightBuilder)
// 执行查询
.get();
// 取查询结果
SearchHits searchHits = searchResponse.getHits();
System.out.println("查询结果总记录数:" + searchHits.getTotalHits());
System.out.println("************高亮结果");
SearchHit[] hits = searchHits.getHits();
if (hits != null && hits.length > 0) {
for (SearchHit hit : hits) {
Map<String, HighlightField> highlightFields = hit.getHighlightFields();
System.out.println("高亮字段:" + highlightFields);
}
}
ESTools.closeClient(client);
}