至于ElasticSearch的介绍与安装在前面的文章已经介绍过,不了解的小伙伴可以去看看,此处就不在赘述,直接进入正题上代码
学习资料
- 引入maven坐标
<!--添加elasticsearch坐标-->
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>5.6.8</version>
</dependency>
<!--添加elasticsearch客户端坐标-->
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>transport</artifactId>
<version>5.6.8</version>
</dependency>
<!--fastjson-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.41</version>
</dependency>
<!--测试-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
- 测试 记得启动ElasticSearch
import com.alibaba.fastjson.JSONObject;
import org.elasticsearch.action.admin.indices.mapping.put.PutMappingRequest;
import org.elasticsearch.action.search.SearchRequestBuilder;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.Requests;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.text.Text;
import org.elasticsearch.common.transport.InetSocketTransportAddress;
import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.common.xcontent.XContentFactory;
import org.elasticsearch.index.query.QueryBuilders;
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.Before;
import org.junit.Test;
import java.net.InetAddress;
import java.util.Iterator;
public class ElasticsearchTest {
TransportClient client;
/**
* 初始化客户端
*/
@Before
public void initClient() {
try {
// 创建Client连接对象
Settings settings = Settings.builder()
//设置集群名字
.put("cluster.name", "elasticsearch")
.build();
//获取客户端
client = new PreBuiltTransportClient(settings)
//设置ip地址和端口号 此处端口号为9300 不是9200
.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300));
System.out.println("获取客户端成功.....");
} catch (Exception e) {
System.out.println("获取客户端失败.....");
e.printStackTrace();
}
}
/**
* 创建索引
* 1. 在创建索引时 会默认分成5片,每片数据各不相同,5片数据联合起来才是一个完整的索引
* 2. 每个分片都会有一个备份,如果当前分片挂掉,会启用备份分片
* 3. 如果主分片和备份分片挂掉,那么当前索引将不再完整,则当前索引不可再用,建议使用集群
*/
@Test
public void createIndex() {
try {
//使用客户端获取到管理员权限
client.admin()
//要对什么做操作 此处是对索引做操作
.indices()
//做什么操作 此处为创建索引操作 blog为索引的名字
.prepareCreate("blog")
//执行get请求
.get();
//关闭客户端
client.close();
System.out.println("索引创建成功.....");
} catch (Exception e) {
System.out.println("索引创建失败.....");
e.printStackTrace();
}
}
/**
* 设置mappings
*/
@Test
public void setMappings() {
try {
/**
* {
* "aticle": {
* "properties": {
* "id": {
* "store": true,
* "type": "long"
* },
* "title": {
* "analyzer": "ik_smart",
* "store": true,
* "type": "text"
* },
* "content": {
* "analyzer": "ik_smart",
* "store": true,
* "type": "text"
* }
* }
* }
* }
*
* 不一定非要用XContentBuilder对象 只要能拼出上面的json字符串即可
*/
//XContentBuilder对象 描述一个mappings json字符串
XContentBuilder content = XContentFactory.jsonBuilder()
//相当于 { 一个花括号
.startObject()
//设置一个type名 相当于aticle: {
.startObject("aticle")
//设置属性 properties: {
.startObject("properties")
.startObject("id")
//设置字段名id 类型为long
.field("type", "long")
//是否存储
.field("store", "yes")
//相当于 } 一个花括号
.endObject()
.startObject("title")
//string要全部小写 S大写会报错
.field("type", "string")
.field("store", "yes")
//设置分词器 使用ik分词器 默认标准分词器
.field("analyzer", "ik_smart")
.endObject()
.startObject("content")
.field("type", "string")
.field("store", "yes")
//设置分词器 使用ik分词器 默认标准分词器
.field("analyzer", "ik_smart")
.endObject()
.endObject()
.endObject()
.endObject();
//创建映射 给索引名为blog 类型名为aticle 设置content
PutMappingRequest mappingRequest = Requests.putMappingRequest("blog").type("aticle").source(content);
//获取到管理员权限 给索引设置mappings
client.admin().indices().putMapping(mappingRequest).get();
//关闭客户端
client.close();
System.out.println("mapping设置成功");
} catch (Exception e) {
System.out.println("mapping设置失败");
e.printStackTrace();
}
}
/**
* 创建文档
*/
@Test
public void createDocument() {
try {
/**
*{"id":6,"title":"孟子","content":"富贵不能淫,贫贱不能移,威武不能屈,此之谓大丈夫"}
*/
//此处舍弃XContentBuilder对象 改用fastjson
JSONObject json = new JSONObject();
json.put("id", 6L);
json.put("title", "孟子");
json.put("content", "富贵不能淫,贫贱不能移,威武不能屈,此之谓大丈夫");
/**
* 创建文档对象
* 参数一: 索引对象 blog
* 参数二: 类型名 aticle
* 参数三: id 建立id 可以不写,系统默认生成 但是推荐写上并与上面的文档id一致
*/
client.prepareIndex("blog", "aticle", "6").setSource(json).get();
//关闭客户端
client.close();
System.out.println("文档创建成功......");
} catch (Exception e) {
System.out.println("文档创建失败......");
e.printStackTrace();
}
}
/**
* id查询
*/
@Test
public void idQuery() {
try {
//设置索引和类型
SearchResponse searchResponse = client.prepareSearch("blog").setTypes("aticle")
//设置搜索条件 并执行条件
.setQuery(QueryBuilders.idsQuery().addIds("2")).get();
//遍历结果集
traverseResult(searchResponse);
//关闭客户端
client.close();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 关键词查询
*/
@Test
public void termQuery() {
try {
//设置索引和类型
SearchResponse searchResponse = client.prepareSearch("blog").setTypes("aticle")
//设置搜索条件 并执行条件
.setQuery(QueryBuilders.termQuery("title", "李白")).get();
//遍历结果集
traverseResult(searchResponse);
//关闭客户端
client.close();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 字符串查询
*/
@Test
public void stringQuery() {
try {
//设置索引和类型
SearchResponse searchResponse = client.prepareSearch("blog").setTypes("aticle")
//设置搜索条件 并执行条件
.setQuery(QueryBuilders.queryStringQuery("大丈夫")).get();
//遍历结果集
traverseResult(searchResponse);
//关闭客户端
client.close();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 分页查询
*/
@Test
public void stringQueryByPage() {
try {
//设置索引和类型
SearchRequestBuilder searchRequestBuilder = client.prepareSearch("blog").setTypes("aticle")
//设置搜索条件
.setQuery(QueryBuilders.queryStringQuery("人"));
//设置分页 从第几条开始 每页显示多少条
searchRequestBuilder.setFrom(0).setSize(5);
//执行条件
SearchResponse searchResponse = searchRequestBuilder.get();
//遍历结果集
traverseResult(searchResponse);
//关闭客户端
client.close();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 设置高亮
*/
@Test
public void setHighlight() {
try {
//设置索引和类型
SearchRequestBuilder searchRequestBuilder = client.prepareSearch("blog").setTypes("aticle")
//设置搜索条件
.setQuery(QueryBuilders.termQuery("title", "孟子"));
//获取高亮对象
HighlightBuilder hiBuilder = new HighlightBuilder();
hiBuilder.preTags("<font style='color:red'>");
hiBuilder.postTags("</font>");
hiBuilder.field("title");
//设置高亮
searchRequestBuilder.highlighter(hiBuilder);
//执行条件
SearchResponse searchResponse = searchRequestBuilder.get();
//遍历结果集
//获取命中次数
SearchHits hits = searchResponse.getHits();
//获取命中对象
Iterator<SearchHit> iterator = hits.iterator();
//遍历搜索结果数据
while (iterator.hasNext()) {
// 每个查询对象
SearchHit searchHit = iterator.next();
//得到对象将对象转为字符串
String sourceAsString = searchHit.getSourceAsString();
System.out.println(sourceAsString);
//获取高亮数据
Text[] text = searchHit.getHighlightFields().get("title").getFragments();
//遍历高亮数据
for (Text str : text) {
System.out.println(str);
}
}
//关闭客户端
client.close();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 遍历输出结果集
*/
public void traverseResult(SearchResponse searchResponse) {
//获取命中次数
SearchHits hits = searchResponse.getHits();
//获取命中对象
Iterator<SearchHit> iterator = hits.iterator();
//遍历搜索结果数据
while (iterator.hasNext()) {
// 每个查询对象
SearchHit searchHit = iterator.next();
//得到对象将对象转为字符串
String sourceAsString = searchHit.getSourceAsString();
System.out.println(sourceAsString);
}
}
}
如有不对欢迎大家批评指正!!!!