依赖
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>6.8.0</version>
</dependency>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>transport</artifactId>
<version>6.8.0</version>
</dependency>
<dependency>
<groupId>org.elasticsearch.plugin</groupId>
<artifactId>transport-netty4-client</artifactId>
<version>6.8.0</version>
</dependency>
创建索引和类型
Rest的创建方式
// 1.在restful的创建方式
PUT /dangdang
{
"mappings": {
"book":{
"properties": {
"name":{
"type":"text",
"analyzer": "ik_max_word"
},
"age":{
"type":"integer"
},
"sex":{
"type":"keyword"
},
"content":{
"type":"text",
"analyzer": "ik_max_word"
}
}
}
}
}
创建客户端操作对象
//创建ES客户端操作对象
@Test
public void init() throws UnknownHostException {
PreBuiltTransportClient preBuiltTransportClient = new PreBuiltTransportClient(Settings.EMPTY);
preBuiltTransportClient.addTransportAddress(new TransportAddress(
InetAddress.getByName("192.168.202.200"),9300));
}
创建索引
//创建索引
@Test
public void createIndex() throws UnknownHostException, ExecutionException, InterruptedException {
PreBuiltTransportClient preBuiltTransportClient = new PreBuiltTransportClient(Settings.EMPTY);
preBuiltTransportClient.addTransportAddress(new TransportAddress(
InetAddress.getByName("192.168.202.200"),9300));
//定义索引请求
CreateIndexRequest ems = new CreateIndexRequest("ems");
//执行索引创建
CreateIndexResponse createIndexResponse = preBuiltTransportClient.admin().indices().create(ems).get();
System.out.println(createIndexResponse.isAcknowledged());
}
删除索引
//删除索引
@Test
public void deleteIndex() throws UnknownHostException, ExecutionException, InterruptedException {
PreBuiltTransportClient preBuiltTransportClient = new PreBuiltTransportClient(Settings.EMPTY);
preBuiltTransportClient.addTransportAddress(new TransportAddress(
InetAddress.getByName("192.168.202.200"),9300));
//定义索引请求
DeleteIndexRequest ems = new DeleteIndexRequest("ems");
//执行索引删除
AcknowledgedResponse acknowledgedResponse = preBuiltTransportClient.admin().indices().delete(ems).get();
System.out.println(acknowledgedResponse.isAcknowledged());
}
创建索引和类型
//创建索引类型和映射
@Test
public void init() throws UnknownHostException, ExecutionException, InterruptedException {
PreBuiltTransportClient preBuiltTransportClient = new PreBuiltTransportClient(Settings.EMPTY);
preBuiltTransportClient.addTransportAddress(new TransportAddress(
InetAddress.getByName("192.168.202.200"),9300));
//创建索引
CreateIndexRequest ems = new CreateIndexRequest("ems");
//定义json格式映射
String json = "{\"properties\":{\"name\":{\"type\":\"text\",\"analyzer\":\"ik_max_word\"},\"age\":{\"type\":\"integer\"},\"sex\":{\"type\":\"keyword\"},\"content\":{\"type\":\"text\",\"analyzer\":\"ik_max_word\"}}}";
//设置类型和mapping
ems.mapping("emp",json, XContentType.JSON);
//执行创建
CreateIndexResponse createIndexResponse = preBuiltTransportClient.admin().indices().create(ems).get();
System.out.println(createIndexResponse.isAcknowledged());
}
索引一条记录
指定id索引记录
//索引一条文档 指定id
@Test
public void createIndexOptionId() throws JsonProcessingException {
Emp emp = new Emp("小陈", 23, "男", "这是一个单纯的少年,单纯的我!");
String s = JSONObject.toJSONString(emp);
IndexResponse indexResponse = transportClient.prepareIndex("ems", "emp", "1").setSource(s, XContentType.JSON).get();
System.out.println(indexResponse.status());
}
自定生成id索引记录
//索引一条文档 指定id
@Test
public void createIndexOptionId() throws JsonProcessingException {
Emp emp = new Emp("小白", 23, "男", "这是一个单纯的小白,单纯的我!");
String s = JSONObject.toJSONString(emp);
IndexResponse indexResponse = transportClient.prepareIndex("ems", "emp")
.setSource(s, XContentType.JSON).get();
System.out.println(indexResponse.status());
}
更新一条索引
//更新一条记录
@Test
public void testUpdate() throws IOException {
Emp emp = new Emp();
emp.setName("明天你好");
String s = JSONObject.toJSONString(emp);
UpdateResponse updateResponse = transportClient.prepareUpdate("ems", "emp", "1")
.setDoc(s,XContentType.JSON).get();
System.out.println(updateResponse.status());
}
删除一条索引
//删除一条记录
@Test
public void testDelete() throws UnknownHostException {
DeleteResponse deleteResponse = transportClient.prepareDelete("ems", "emp", "1").get();
System.out.println(deleteResponse.status());
}
批量更新
//批量更新
@Test
public void testBulk() throws IOException {
//添加第一条记录
IndexRequest request1 = new IndexRequest("ems","emp","1");
Emp emp = new Emp("中国科技", 23, "男", "这是好人");
request1.source(JSONObject.toJSONString(emp),XContentType.JSON);
//添加第二条记录
IndexRequest request2 = new IndexRequest("ems","emp","2");
Emp emp2 = new Emp("中国科技", 23, "男", "这是好人");
request2.source(JSONObject.toJSONString(emp2),XContentType.JSON);
//更新记录
UpdateRequest updateRequest = new UpdateRequest("ems","emp","1");
Emp empUpdate = new Emp();
empUpdate.setName("中国力量");
updateRequest.doc(JSONObject.toJSONString(empUpdate),XContentType.JSON);
//删除一条记录
DeleteRequest deleteRequest = new DeleteRequest("ems","emp","2");
BulkResponse bulkItemResponses = transportClient.prepareBulk()
.add(request1)
.add(request2)
.add(updateRequest)
.add(deleteRequest)
.get();
BulkItemResponse[] items = bulkItemResponses.getItems();
for (BulkItemResponse item : items) {
System.out.println(item.status());
}
}
检索记录
查询所有并排序
/**
* 查询所有并排序
* ASC 升序 DESC 降序
* addSort("age", SortOrder.ASC) 指定排序字段以及使用哪种方式排序
* addSort("age", SortOrder.DESC) 指定排序字段以及使用哪种方式排序
*/
@Test
public void testMatchAllQuery() throws UnknownHostException {
TransportClient transportClient = new PreBuiltTransportClient(Settings.EMPTY).addTransportAddress(new TransportAddress(InetAddress.getByName("172.16.251.142"), 9300));
SearchResponse searchResponse = transportClient.prepareSearch("dangdang").setTypes("book").setQuery(QueryBuilders.matchAllQuery()).addSort("age", SortOrder.DESC).get();
SearchHits hits = searchResponse.getHits();
System.out.println("符合条件的记录数: "+hits.totalHits);
for (SearchHit hit : hits) {
System.out.print("当前索引的分数: "+hit.getScore());
System.out.print(", 对应结果:=====>"+hit.getSourceAsString());
System.out.println(", 指定字段结果:"+hit.getSourceAsMap().get("name"));
System.out.println("=================================================");
}
}
分页查询
/**
* 分页查询
* From 从那条记录开始 默认从0 开始 form = (pageNow-1)*size
* Size 每次返回多少条符合条件的结果 默认10
*/
@Test
public void testMatchAllQueryFormAndSize() throws UnknownHostException {
TransportClient transportClient = new PreBuiltTransportClient(Settings.EMPTY).addTransportAddress(new TransportAddress(InetAddress.getByName("172.16.251.142"), 9300));
SearchResponse searchResponse = transportClient.prepareSearch("dangdang").setTypes("book").setQuery(QueryBuilders.matchAllQuery()).setFrom(0).setSize(2).get();
SearchHits hits = searchResponse.getHits();
System.out.println("符合条件的记录数: "+hits.totalHits);
for (SearchHit hit : hits) {
System.out.print("当前索引的分数: "+hit.getScore());
System.out.print(", 对应结果:=====>"+hit.getSourceAsString());
System.out.println(", 指定字段结果:"+hit.getSourceAsMap().get("name"));
System.out.println("=================================================");
}
}
查询返回字段
/**
* 查询返回指定字段(source) 默认返回所有
* setFetchSource 参数1:包含哪些字段 参数2:排除哪些字段
* setFetchSource("*","age") 返回所有字段中排除age字段
* setFetchSource("name","") 只返回name字段
* setFetchSource(new String[]{},new String[]{})
*/
@Test
public void testMatchAllQuerySource() throws UnknownHostException {
TransportClient transportClient = new PreBuiltTransportClient(Settings.EMPTY).addTransportAddress(new TransportAddress(InetAddress.getByName("172.16.251.142"), 9300));
SearchResponse searchResponse = transportClient.prepareSearch("dangdang").setTypes("book").setQuery(QueryBuilders.matchAllQuery()).setFetchSource("*","age").get();
SearchHits hits = searchResponse.getHits();
System.out.println("符合条件的记录数: "+hits.totalHits);
for (SearchHit hit : hits) {
System.out.print("当前索引的分数: "+hit.getScore());
System.out.print(", 对应结果:=====>"+hit.getSourceAsString());
System.out.println(", 指定字段结果:"+hit.getSourceAsMap().get("name"));
System.out.println("=================================================");
}
}
term查询
/**
* term查询
*/
@Test
public void testTerm() throws UnknownHostException {
TransportClient transportClient = new PreBuiltTransportClient(Settings.EMPTY).addTransportAddress(new TransportAddress(InetAddress.getByName("172.16.251.142"), 9300));
TermQueryBuilder queryBuilder = QueryBuilders.termQuery("name","中国");
SearchResponse searchResponse = transportClient.prepareSearch("dangdang").setTypes("book").setQuery(queryBuilder).get();
}
range查询
/**
* rang查询
* lt 小于
* lte 小于等于
* gt 大于
* gte 大于等于
*/
@Test
public void testRange() throws UnknownHostException {
TransportClient transportClient = new PreBuiltTransportClient(Settings.EMPTY).addTransportAddress(new TransportAddress(InetAddress.getByName("172.16.251.142"), 9300));
RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery("age").lt(45).gte(8);
SearchResponse searchResponse = transportClient.prepareSearch("dangdang").setTypes("book").setQuery(rangeQueryBuilder).get();
}
prefix查询
/**
* prefix 前缀查询
*
*/
@Test
public void testPrefix() throws UnknownHostException {
TransportClient transportClient = new PreBuiltTransportClient(Settings.EMPTY).addTransportAddress(new TransportAddress(InetAddress.getByName("172.16.251.142"), 9300));
PrefixQueryBuilder prefixQueryBuilder = QueryBuilders.prefixQuery("name", "中");
SearchResponse searchResponse = transportClient.prepareSearch("dangdang").setTypes("book").setQuery(prefixQueryBuilder).get();
}
wildcard查询
/**
* wildcardQuery 通配符查询
*
*/
@Test
public void testwildcardQuery() throws UnknownHostException {
TransportClient transportClient = new PreBuiltTransportClient(Settings.EMPTY).addTransportAddress(new TransportAddress(InetAddress.getByName("172.16.251.142"), 9300));
WildcardQueryBuilder wildcardQueryBuilder = QueryBuilders.wildcardQuery("name", "中*");
SearchResponse searchResponse = transportClient.prepareSearch("dangdang").setTypes("book").setQuery(wildcardQueryBuilder).get();
}
Ids查询
/**
* ids 查询
*/
@Test
public void testIds() throws UnknownHostException {
TransportClient transportClient = new PreBuiltTransportClient(Settings.EMPTY).addTransportAddress(new TransportAddress(InetAddress.getByName("172.16.251.142"), 9300));
IdsQueryBuilder idsQueryBuilder = QueryBuilders.idsQuery().addIds("1","2");
SearchResponse searchResponse = transportClient.prepareSearch("dangdang").setTypes("book").setQuery(idsQueryBuilder).get();
}
fuzzy模糊查询
/**
* fuzzy 查询
*/
@Test
public void testFuzzy() throws UnknownHostException {
TransportClient transportClient = new PreBuiltTransportClient(Settings.EMPTY).addTransportAddress(new TransportAddress(InetAddress.getByName("172.16.251.142"), 9300));
FuzzyQueryBuilder fuzzyQueryBuilder = QueryBuilders.fuzzyQuery("content", "国人");
SearchResponse searchResponse = transportClient.prepareSearch("dangdang").setTypes("book").setQuery(fuzzyQueryBuilder).get();
}
bool 查询
/**
* bool 查询
*/
@Test
public void testBool() throws UnknownHostException {
TransportClient transportClient = new PreBuiltTransportClient(Settings.EMPTY).addTransportAddress(new TransportAddress(InetAddress.getByName("172.16.251.142"), 9300));
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
boolQueryBuilder.should(QueryBuilders.matchAllQuery());
boolQueryBuilder.mustNot(QueryBuilders.rangeQuery("age").lte(8));
boolQueryBuilder.must(QueryBuilders.termQuery("name","中国"));
SearchResponse searchResponse = transportClient.prepareSearch("dangdang").setTypes("book").setQuery(boolQueryBuilder).get();
}
高亮查询
/**
* 高亮查询
* .highlighter(highlightBuilder) 用来指定高亮设置
* requireFieldMatch(false) 开启多个字段高亮
* field 用来定义高亮字段
* preTags("<span style='color:red'>") 用来指定高亮前缀
* postTags("</span>") 用来指定高亮后缀
*/
@Test
public void testHighlight() throws UnknownHostException {
TransportClient transportClient = new PreBuiltTransportClient(Settings.EMPTY).addTransportAddress(new TransportAddress(InetAddress.getByName("172.16.251.142"), 9300));
TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("name", "中国");
HighlightBuilder highlightBuilder = new HighlightBuilder();
highlightBuilder.requireFieldMatch(false).field("name").field("content").preTags("<span style='color:red'>").postTags("</span>");
SearchResponse searchResponse = transportClient.prepareSearch("dangdang").setTypes("book").highlighter(highlightBuilder).highlighter(highlightBuilder).setQuery(termQueryBuilder).get();
SearchHits hits = searchResponse.getHits();
System.out.println("符合条件的记录数: "+hits.totalHits);
for (SearchHit hit : hits) {
Map<String, Object> sourceAsMap = hit.getSourceAsMap();
Map<String, HighlightField> highlightFields = hit.getHighlightFields();
System.out.println("================高亮之前==========");
for(Map.Entry<String,Object> entry:sourceAsMap.entrySet()){
System.out.println("key: "+entry.getKey() +" value: "+entry.getValue());
}
System.out.println("================高亮之后==========");
for (Map.Entry<String,Object> entry:sourceAsMap.entrySet()){
HighlightField highlightField = highlightFields.get(entry.getKey());
if (highlightField!=null){
System.out.println("key: "+entry.getKey() +" value: "+ highlightField.fragments()[0]);
}else{
System.out.println("key: "+entry.getKey() +" value: "+entry.getValue());
}
}
}
}
注:取出高亮的值替换原来的值。
过滤查询
/**
* 过滤查询 主要用在查询执行之前对大量数据进行筛选
* postFilter 用来过滤
*/
@Test
public void testQuery(){
RangeQueryBuilder ageRangeQueryBuilder = QueryBuilders.rangeQuery("age").gte(0).lte(10);
SearchResponse searchResponse = transportClient.prepareSearch("ems")
.setTypes("emp")
.setPostFilter(ageRangeQueryBuilder) //过滤查询
.setQuery(QueryBuilders.matchAllQuery())//查询
.get();
SearchHit[] hits = searchResponse.getHits().getHits();
for (SearchHit hit : hits) {
System.out.println(hit.getSourceAsString());
}
}
/**
* 基于多字段关键词查询
* 分页
* 排序
* 过滤
* 执行字段返回
* 高亮处理
*/
@Test
public void testSearch(){
SearchResponse searchResponse = transportClient.prepareSearch("ems")
.setTypes("emp")
.setFrom(0) //起始条数
.setSize(20) //每页记录数
.addSort("age", SortOrder.DESC)//执行排序条件
.setSource(SearchSourceBuilder.searchSource().fetchSource("*", "bir"))//指定返回的字段
.setPostFilter(QueryBuilders.rangeQuery("age").gte(0).lte(100))//过滤条件
.setQuery(QueryBuilders.multiMatchQuery("框架爱好者","name","content"))//多字段搜索
.highlighter(new HighlightBuilder().field("*").requireFieldMatch(false).preTags("<span style='color:red;'>").postTags("</span>")) //高亮处理
.get();
long totalHits = searchResponse.getHits().getTotalHits();
System.out.println("符合条件的总条数: "+totalHits);
float maxScore = searchResponse.getHits().getMaxScore();
System.out.println("最大分数: "+maxScore);
SearchHit[] hits = searchResponse.getHits().getHits();
for (SearchHit hit : hits) {
System.out.println("原始文档: "+hit.getSourceAsString());
System.out.println("高亮字段: "+hit.getHighlightFields());
}
}