- 1 依赖引入
- 2 基础
- 3 索引是否存在 [exists]
- 4 关闭索引 [close]
- 5 打开索引 [open]
- 6 创建索引 [create]
- 7 添加索引,并添加映射
- 8 查询索引 [get]
- 9 删除索引 [delete]
- 10 修改配置 [update]
- 11 修改文档 [update]
- 12 添加文档 [add]
- 13 批量导入文档 [bulk]
- 14 查询所有 [matchAll]
- 15 单个词条检索 [term]
- 16 多词条检索 [ terms ]
- 17 模糊查询 [ fuzzy ]
- 18 全文查询 [ match ] [or]
- 19 全文查询 [ match ] [and]
- 20 多字段检索 [ multi_match ]
- 21 通配符检索 [ wildcard ]
- 22 正则查询 [ regexp ]
- 23 前缀查询 [ prefix ]
- 24 范围查询 [ range ]
- 25 多条件查询 [ query_string ]
- 26 自动分词的连接符 [ default_operator ]
- 27 单例多条件查询 [ simple_query_string ]
- 28 布尔查询 [ bool ] [must]
- 29 布尔查询 [ bool ] [filter]
- 30 布尔查询 [ bool ] [should]
- 31 布尔查询 [ bool ] 组合
- 32 倒序 [ sort ]
- 33 关键字查询 [ includes ]
- 34 排除关键字查询 [ excludes ]
- 35 分页查询
- 36 桶聚合 [ aggs ]
- 37 指标聚合 [ aggs ]
- 38 嵌套查询
- 39 阶梯分桶 [ histogram ]
- 40 高亮查询 [ highlight ]
- 41 复制索引 [ _reindex ]">
41 复制索引 [ _reindex ]
本次使用的版本是Java High Level REST Client,transport Client已经在7.0废止,8.0完全移除。
1 依赖引入
<!--引入es的坐标--><dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId><version>7.4.0</version></dependency><dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-client</artifactId><version>7.4.0</version></dependency><dependency><groupId>org.elasticsearch</groupId><artifactId>elasticsearch</artifactId><version>7.4.0</version></dependency>
2 基础
命令的前期学习
https://blog.csdn.net/qq_41520636/article/details/116081185
下面代码完全对照该博客例子,编写的java 例子。
2.1 fastjson
<dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.4</version></dependency>
package com.hikktn.pojo;import com.alibaba.fastjson.annotation.JSONField;/*** @ClassName Person* @Description TODO* @Author lisonglin* @Date 2021/4/23 14:32* @Version 1.0*/public class Person {@JSONField(name = "id")private int id;@JSONField(name = "name")private String name;@JSONField(name = "age")private int age;@JSONField(name = "address")private String address;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}public Person(int id, String name, int age, String address) {this.id = id;this.name = name;this.age = age;this.address = address;}public Person() {}@Overridepublic String toString() {return "Person{" + ", name='" + name + '\'' + ", age=" + age + ", address='" + address + '\'' + '}';}}
/*** 对象转换JSON*/@Testpublic void whenJavaList_thanConvertToJsonCorrect() {List<Person> listOfPersons = new ArrayList<Person>();listOfPersons.add(new Person(1, "张三", 20, "重庆"));String jsonOutput = JSON.toJSONString(listOfPersons);System.out.println(jsonOutput);}
结果
[{"address":"重庆","age":20,"id":1,"name":"张三"}]
3 索引是否存在 [exists]
/*** 索引是否存在*/@Testpublic void existIndex() throws IOException {IndicesClient indices = client.indices();GetIndexRequest getIndexRequest = new GetIndexRequest("person2");boolean exists = indices.exists(getIndexRequest, RequestOptions.DEFAULT);System.out.println(exists);}
4 关闭索引 [close]
/*** 关闭索引* POST /person2/_close** @throws IOException*/@Testpublic void closeIndex() throws IOException {CloseIndexRequest closeIndexRequest = new CloseIndexRequest("person2");CloseIndexResponse close = client.indices().close(closeIndexRequest, RequestOptions.DEFAULT);System.out.println(close.isAcknowledged());}
5 打开索引 [open]
/*** 打开索引* POST /person2/_open** @return* @throws IOException*/@Testpublic void openIndex() throws IOException {OpenIndexRequest openIndexRequest = new OpenIndexRequest("person2");boolean acknowledged = client.indices().open(openIndexRequest, RequestOptions.DEFAULT).isAcknowledged();System.out.println(acknowledged);}
6 创建索引 [create]
/*** 创建索引* PUT /person2** @throws IOException*/@Testpublic void createIndex() throws IOException {//1.使用client获取操作索引对象IndicesClient indices = client.indices();//2.1 设置索引名称CreateIndexRequest request = new CreateIndexRequest("person2");// 2.索引setting配置request.settings(Settings.builder().put("index.number_of_shards",5).put("index.number_of_replicas", 2) // 副本数.put("analysis.analyzer.default.tokenizer","standard"));// 别名// request.alias(new Alias("person"));// 发送请求// 同步方式CreateIndexResponse createIndexResponse = indices.create(request, RequestOptions.DEFAULT);//3.根据返回值判断结果System.out.println(createIndexResponse.isAcknowledged());System.out.println(createIndexResponse.isShardsAcknowledged());// 异步方式发送请求/*ActionListener<CreateIndexResponse> listener = new ActionListener<CreateIndexResponse>() {@Overridepublic void onResponse(CreateIndexResponse createIndexResponse) {// 6、处理响应boolean acknowledged = createIndexResponse.isAcknowledged();boolean shardsAcknowledged = createIndexResponse.isShardsAcknowledged();System.out.println("acknowledged = " + acknowledged);System.out.println("shardsAcknowledged = " + shardsAcknowledged);}@Overridepublic void onFailure(Exception e) {System.out.println("创建索引异常:" + e.getMessage());}};client.indices().createAsync(request, RequestOptions.DEFAULT, listener);*/}
7 添加索引,并添加映射
/*** 添加索引,并添加映射* PUT person2* {* "mappings": {* "properties": {* "name": {* "type": "keyword"* },* "age" : {* "type" : "long"* }* "address": {* "type": "text",* "analyzer": "ik_max_word"* }* }* }* }*/@Testpublic void addIndexAndMapping() throws IOException {//1.使用client获取操作索引对象IndicesClient indices = client.indices();//2.具体操作获取返回值//2.具体操作,获取返回值CreateIndexRequest createIndexRequest = new CreateIndexRequest("person2");//2.1 设置mappingsString mapping = "{\n" +" \"properties\": {\n" +" \"name\": {\n" + " " +" \"type\": \"keyword\"\n" + "" +" },\n" +" \"age\" : {\n" +" \"type\" : \"long\"\n" +" },\n" +" \"address\": {\n" +" \"type\": \"text\",\n" +" \"analyzer\": \"ik_max_word\"\n" +" }\n" +" }\n" +" }";createIndexRequest.mapping(mapping, XContentType.JSON);CreateIndexResponse createIndexResponse = indices.create(createIndexRequest, RequestOptions.DEFAULT);//3.根据返回值判断结果System.out.println(createIndexResponse.isAcknowledged());}@Testpublic void addIndexAndMapping2() throws IOException {//1.使用client获取操作索引对象IndicesClient indices = client.indices();//2.具体操作获取返回值//2.具体操作,获取返回值CreateIndexRequest createIndexRequest = new CreateIndexRequest("person2");//2.1 设置mappingsIndexRequest indexRequest = new IndexRequest();// 拼接字符串XContentBuilder builder = JsonXContent.contentBuilder().startObject().startObject("mappings").startObject("properties").startObject("name").field("type", "keyword").endObject().startObject("age").field("type", "long").endObject().startObject("address").field("type", "text").field("analyzer", "ik_max_word").endObject().endObject().endObject();indexRequest.source(builder);// 生成JSON字符串String source = indexRequest.source().utf8ToString();createIndexRequest.mapping(source, XContentType.JSON);CreateIndexResponse createIndexResponse = indices.create(createIndexRequest, RequestOptions.DEFAULT);//3.根据返回值判断结果System.out.println(createIndexResponse.isAcknowledged());}
8 查询索引 [get]
/*** 查询索引* GET /person2*/@Testpublic void queryIndex() throws IOException {IndicesClient indices = client.indices();GetIndexRequest request = new GetIndexRequest("person2");GetIndexResponse response = indices.get(request, RequestOptions.DEFAULT);Map<String, MappingMetaData> mappings = response.getMappings();for (String key : mappings.keySet()) {System.out.println(key + "===" + mappings.get(key).getSourceAsMap());}}
9 删除索引 [delete]
/*** 删除索引* DELETE /person2*/@Testpublic void deleteIndex() throws IOException {IndicesClient indices = client.indices();DeleteIndexRequest deleteRequest = new DeleteIndexRequest("person2");AcknowledgedResponse delete = indices.delete(deleteRequest, RequestOptions.DEFAULT);System.out.println(delete.isAcknowledged());}
10 修改配置 [update]
/*** 修改配置* POST /person2/_close* PUT /person2/_settings* {* "index":{* "number_of_replicas":2* }* }* POST /person2/_open** @throws IOException*/@Testpublic void updateSettingsIndex() throws IOException {// 关闭索引CloseIndexRequest closeIndexRequest = new CloseIndexRequest("person2");client.indices().close(closeIndexRequest, RequestOptions.DEFAULT);// 修改索引UpdateRequest updateRequest = new UpdateRequest();// 修改分片数Settings settings = Settings.builder().put("number_of_replicas", "2").build();updateRequest.script(Script.parse(settings));UpdateResponse update = client.update(updateRequest, RequestOptions.DEFAULT);// 修改成功后的结果System.out.println(update.getGetResult());// 打开索引OpenIndexRequest openIndexRequest = new OpenIndexRequest("person2");client.indices().open(openIndexRequest, RequestOptions.DEFAULT).isAcknowledged();}
11 修改文档 [update]
/*** 修改文档** @throws IOException*/@Testpublic void updateDocIndex() throws IOException {// 关闭索引CloseIndexRequest closeIndexRequest = new CloseIndexRequest("person2");client.indices().close(closeIndexRequest, RequestOptions.DEFAULT);// 修改的文档List<Person> listOfPersons = new ArrayList<Person>();listOfPersons.add(new Person(1, "张三", 20, "重庆"));String personJson = JSON.toJSONString(listOfPersons);// 修改索引UpdateRequest updateRequest = new UpdateRequest();updateRequest.id(String.valueOf(listOfPersons.get(0).getId())).doc(personJson);UpdateResponse update = client.update(updateRequest, RequestOptions.DEFAULT);// 修改成功后的结果System.out.println(update.getGetResult());// 打开索引OpenIndexRequest openIndexRequest = new OpenIndexRequest("person2");client.indices().open(openIndexRequest, RequestOptions.DEFAULT).isAcknowledged();}
12 添加文档 [add]
/*** 添加文档* POST /person2/_doc/1* {* "name":"张三",* "age":18,* "address":"重庆市江北区"* }**/@Testpublic void addDoc1() {Map<String, Object> map = new HashMap<>();map.put("name", "张三");map.put("age", "18");map.put("address", "重庆市江北区");IndexRequest request = new IndexRequest("person2").id("1").source(map);// 其他的一些可选设置/*//设置routing值request.routing("routing");//设置主分片等待时长request.timeout(TimeValue.timeValueSeconds(1));//设置重刷新策略request.setRefreshPolicy("wait_for");//设置版本号request.version(2);//操作类别request.opType(DocWriteRequest.OpType.CREATE); */IndexResponse response = null;try {response = client.index(request, RequestOptions.DEFAULT);} catch (ElasticsearchException e) {// 捕获,并处理异常//判断是否版本冲突、create但文档已存在冲突if (e.status() == RestStatus.CONFLICT) {logger.error("冲突了,请在此写冲突处理逻辑!\n" + e.getDetailedMessage());}logger.error("索引异常", e);} catch (IOException e) {e.printStackTrace();}// 处理响应if(response != null) {String index = response.getIndex();String type = response.getType();String id = response.getId();long version = response.getVersion();if (response.getResult() == DocWriteResponse.Result.CREATED) {System.out.println("新增文档成功,处理逻辑代码写到这里。");} else if (response.getResult() == DocWriteResponse.Result.UPDATED) {System.out.println("修改文档成功,处理逻辑代码写到这里。");}// 分片处理信息ReplicationResponse.ShardInfo shardInfo = response.getShardInfo();if (shardInfo.getTotal() != shardInfo.getSuccessful()) {}// 如果有分片副本失败,可以获得失败原因信息if (shardInfo.getFailed() > 0) {for (ReplicationResponse.ShardInfo.Failure failure : shardInfo.getFailures()) {String reason = failure.reason();System.out.println("副本失败原因:" + reason);}}}//异步方式发送索引请求/* ActionListener<IndexResponse> listener = new ActionListener<IndexResponse>() {@Overridepublic void onResponse(IndexResponse indexResponse) {}@Overridepublic void onFailure(Exception e) {}};client.indexAsync(request, RequestOptions.DEFAULT, listener);*/}
13 批量导入文档 [bulk]
/*** 批量导入文档* POST _bulk* {"create":{"_index":"person1","_id":"2"}}* {"name":"李四","age":19,"address":"重庆市渝中区"}* {"create":{"_index":"person1","_id":"3"}}* {"name":"王五","age":20,"address":"重庆市南岸区"}* {"create":{"_index":"person1","_id":"4"}}* {"name":"何六","age":21,"address":"四川省高新区"}* {"create":{"_index":"person1","_id":"5"}}* {"name":"田七","age":22,"address":"四川省双流区"}* {"create":{"_index":"person1","_id":"6"}}* {"name":"黄黄","age":25,"address":"上海市长宁区"}** @throws IOException*/@Testpublic void addDoc2() throws IOException {List<Person> personList = new ArrayList<>();// 模拟从数据库中查询出数据Person person0 = new Person(2, "李四", 19, "重庆市渝中区");Person person1 = new Person(3, "王五", 20, "重庆市南岸区");Person person2 = new Person(4, "何六", 21, "四川省高新区");Person person3 = new Person(5, "田七", 22, "四川省双流区");Person person4 = new Person(6, "黄黄", 25, "上海市长宁区");personList.add(person0);personList.add(person1);personList.add(person2);personList.add(person3);personList.add(person4);BulkRequest bulkRequest = new BulkRequest();// 添加索引文档的请求参数for (Person person : personList) {String data = JSON.toJSONString(person);IndexRequest request = new IndexRequest("person2").id(String.valueOf(person.getId())).source(data, XContentType.JSON);bulkRequest.add(request);}// 批量执行BulkResponse bulkResponse = client.bulk(bulkRequest, RequestOptions.DEFAULT);System.out.println(bulkResponse.status());//4、处理响应if(bulkResponse != null) {for (BulkItemResponse bulkItemResponse : bulkResponse) {DocWriteResponse itemResponse = bulkItemResponse.getResponse();if (bulkItemResponse.getOpType() == DocWriteRequest.OpType.INDEX|| bulkItemResponse.getOpType() == DocWriteRequest.OpType.CREATE) {IndexResponse indexResponse = (IndexResponse) itemResponse;//TODO 新增成功的处理} else if (bulkItemResponse.getOpType() == DocWriteRequest.OpType.UPDATE) {UpdateResponse updateResponse = (UpdateResponse) itemResponse;//TODO 修改成功的处理} else if (bulkItemResponse.getOpType() == DocWriteRequest.OpType.DELETE) {DeleteResponse deleteResponse = (DeleteResponse) itemResponse;//TODO 删除成功的处理}}}//异步方式发送批量操作请求/*ActionListener<BulkResponse> listener = new ActionListener<BulkResponse>() {@Overridepublic void onResponse(BulkResponse bulkResponse) {}@Overridepublic void onFailure(Exception e) {}};client.bulkAsync(bulkRequest,RequestOptions.DEFAULT, listener);*/}
14 查询所有 [matchAll]
/*** 查询所有* 1. matchAll* 2. 将查询结果封装为Goods对象,装载到List中* 3. 分页。默认显示10条* # 全文检索* GET /person2/_search* {* "query": { "match_all": {} }* }*/@Testpublic void matchAllIndex() throws IOException {//2. 构建查询请求对象,指定查询的索引名称SearchRequest searchRequest = new SearchRequest("person2");//4. 创建查询条件构建器SearchSourceBuilderSearchSourceBuilder sourceBuilder = new SearchSourceBuilder();//6. 查询条件QueryBuilder queryBuilder = QueryBuilders.matchAllQuery();//5. 指定查询条件sourceBuilder.query(queryBuilder);//3. 添加查询条件构建器 SearchSourceBuildersearchRequest.source(sourceBuilder);// 8 . 添加分页信息 不设置 默认10条// sourceBuilder.from(0);// sourceBuilder.size(100);//1. 查询,获取查询结果SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);//7. 获取命中对象 SearchHitsSearchHits hits = searchResponse.getHits();//7.1 获取总记录数Long total = hits.getTotalHits().value;System.out.println("总数:" + total);//7.2 获取Hits数据 数组SearchHit[] hits1 = hits.getHits();//获取json字符串格式的数据List<Person> personList = new ArrayList<>();for (SearchHit searchHit : hits1) {String sourceAsString = searchHit.getSourceAsString();//转为java对象Person person = JSON.parseObject(sourceAsString, Person.class);personList.add(person);}for (Person person : personList) {System.out.println(person);}}
15 单个词条检索 [term]
/*** GET /person2/_search* {* "query": {* "term": {* "address": {* "value": "南岸"* }* }* }* }*/@Testpublic void termIndex() throws IOException {SearchRequest searchRequest = new SearchRequest("person2");SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();// 查询条件TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("address", "南岸");sourceBuilder.query(termQueryBuilder);searchRequest.source(sourceBuilder);SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);System.out.println(searchResponse.getHits());}
16 多词条检索 [ terms ]
/*** GET /person2/_search* {* "query": {* "terms": {* "address": ["重庆","区"]* }* }* }*/@Testpublic void termsIndex() throws IOException {SearchRequest searchRequest = new SearchRequest("person2");SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();// 查询条件TermsQueryBuilder termsQueryBuilder = QueryBuilders.termsQuery("address", "重庆", "区");sourceBuilder.query(termsQueryBuilder);searchRequest.source(sourceBuilder);SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);System.out.println(searchResponse.getHits());}
17 模糊查询 [ fuzzy ]
/*** GET /person2/_search* {* "query": {* "fuzzy": {* "address": {* "value": "南岸12",* "fuzziness":"2"* }* }* }* }*/@Testpublic void fuzzyIndex() throws IOException {SearchRequest searchRequest = new SearchRequest("person2");SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();// 查询条件FuzzyQueryBuilder fuzzyQueryBuilder = QueryBuilders.fuzzyQuery("address", "南岸12").fuzziness(Fuzziness.TWO);sourceBuilder.query(fuzzyQueryBuilder);searchRequest.source(sourceBuilder);SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);System.out.println(searchResponse.getHits());}
18 全文查询 [ match ] [or]
/*** # 默认取并集(or)* GET /person2/_search* {* "query": {* "match": {* "address":"重庆南岸"* }* }* }** @throws IOException*/@Testpublic void matchOrIndex() throws IOException {SearchRequest searchRequest = new SearchRequest("person2");SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();// 查询条件MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("address", "重庆南岸");sourceBuilder.query(matchQueryBuilder);searchRequest.source(sourceBuilder);SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);System.out.println(searchResponse.getHits());}
19 全文查询 [ match ] [and]
/*** # 交集(and)* GET /person2/_search* {* "query": {* "match": {* "address": {* "query": "重庆南岸",* "operator": "and"* }* }* }* }** @throws IOException*/@Testpublic void matchAndIndex() throws IOException {SearchRequest searchRequest = new SearchRequest("person2");SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();// 查询条件MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("address", "重庆南岸").operator(Operator.AND);sourceBuilder.query(matchQueryBuilder);searchRequest.source(sourceBuilder);SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);System.out.println(searchResponse.getHits());}
20 多字段检索 [ multi_match ]
/*** GET /person2/_search* {* "query": {* "multi_match": {* "query": "重庆",* "fields": ["address","name"]* }* }* }** @throws IOException*/@Testpublic void multiMatchIndex() throws IOException {SearchRequest searchRequest = new SearchRequest("person2");SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();// 查询条件MultiMatchQueryBuilder multiMatchQueryBuilder = QueryBuilders.multiMatchQuery("重庆", "address", "name");sourceBuilder.query(multiMatchQueryBuilder);searchRequest.source(sourceBuilder);SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);System.out.println(searchResponse.getHits());}
21 通配符检索 [ wildcard ]
/*** GET /person2/_search* {* "query": {* "wildcard": {* "address":"重*"* }* }* }*/@Testpublic void wildcardIndex() throws IOException {SearchRequest searchRequest = new SearchRequest("person2");SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();// 查询条件WildcardQueryBuilder wildcardQuery = QueryBuilders.wildcardQuery("address", "重*");sourceBuilder.query(wildcardQuery);searchRequest.source(sourceBuilder);SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);System.out.println(searchResponse.getHits());}
22 正则查询 [ regexp ]
/*** GET /person2/_search* {* "query": {* "regexp": {* "address":"(.)*"* }* }* }** @throws IOException*/@Testpublic void regexpIndex() throws IOException {SearchRequest searchRequest = new SearchRequest("person2");SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();// 查询条件RegexpQueryBuilder regexpQueryBuilder = QueryBuilders.regexpQuery("address", "(.)*");sourceBuilder.query(regexpQueryBuilder);searchRequest.source(sourceBuilder);SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);System.out.println(searchResponse.getHits());}
23 前缀查询 [ prefix ]
/*** GET /person2/_search* {* "query": {* "prefix": {* "address":"上"* }* }* }** @throws IOException*/@Testpublic void prefixIndex() throws IOException {SearchRequest searchRequest = new SearchRequest("person2");SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();// 查询条件PrefixQueryBuilder prefixQueryBuilder = QueryBuilders.prefixQuery("address", "上");sourceBuilder.query(prefixQueryBuilder);searchRequest.source(sourceBuilder);SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);System.out.println(searchResponse.getHits());}
24 范围查询 [ range ]
/*** GET /person2/_search* {* "query": {* "range": {* "age":{* "gte":18,* "lte":20* }* }* }* }** @throws IOException*/@Testpublic void rangeIndex() throws IOException {SearchRequest searchRequest = new SearchRequest("person2");SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();// 查询条件RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery("age").gte(18).lte(20);sourceBuilder.query(rangeQueryBuilder);searchRequest.source(sourceBuilder);SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);System.out.println(searchResponse.getHits());}
25 多条件查询 [ query_string ]
/*** GET /person2/_search* {* "query": {* "query_string": {* "default_field": "address",* "query": "重庆 AND 市 OR 区"* }* }* }** @throws IOException*/@Testpublic void queryStringIndex() throws IOException {SearchRequest searchRequest = new SearchRequest("person2");SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();// 查询条件QueryStringQueryBuilder queryStringQueryBuilder = QueryBuilders.queryStringQuery("重庆 AND 市 OR 区").defaultField("address");sourceBuilder.query(queryStringQueryBuilder);searchRequest.source(sourceBuilder);SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);System.out.println(searchResponse.getHits());}
26 自动分词的连接符 [ default_operator ]
/*** GET /person2/_search* {* "query": {* "query_string": {* "default_field": "address",* "default_operator": "AND",* "query": "上海市"* }* }* }*/@Testpublic void queryStringAndIndex() throws IOException {SearchRequest searchRequest = new SearchRequest("person2");SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();// 查询条件QueryStringQueryBuilder queryStringQueryBuilder = QueryBuilders.queryStringQuery("上海市").defaultField("address").defaultOperator(Operator.AND);sourceBuilder.query(queryStringQueryBuilder);searchRequest.source(sourceBuilder);SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);System.out.println(searchResponse.getHits());}
27 单例多条件查询 [ simple_query_string ]
/*** GET /person2/_search* {* "query": {* "simple_query_string": {* "query": "重庆 AND 市 OR 区",* "fields": ["address"]* }* }* }** @throws IOException*/@Testpublic void simpleQueryStringAndIndex() throws IOException {SearchRequest searchRequest = new SearchRequest("person2");SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();// 查询条件SimpleQueryStringBuilder simpleQueryStringBuilder = QueryBuilders.simpleQueryStringQuery("重庆 AND 市 OR 区").field("address");sourceBuilder.query(simpleQueryStringBuilder);searchRequest.source(sourceBuilder);SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);System.out.println(searchResponse.getHits());}
28 布尔查询 [ bool ] [must]
/*** GET /person2/_search* {* "query": {* "bool": {* "must": [* {* "term": {* "address": {* "value": "重庆"* }* }* }* ]* }* }* }**/@Testpublic void boolQueryMustTermIndex() throws IOException {SearchRequest searchRequest = new SearchRequest("person2");SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();//1.构建boolQueryBoolQueryBuilder boolQuery = QueryBuilders.boolQuery();// 查询条件TermsQueryBuilder termsQueryBuilder = QueryBuilders.termsQuery("address", "重庆");// 判断 mustboolQuery.must(termsQueryBuilder);sourceBuilder.query(boolQuery);searchRequest.source(sourceBuilder);SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);System.out.println(searchResponse.getHits());}
29 布尔查询 [ bool ] [filter]
/*** GET /person2/_search* {* "query": {* "bool": {* "filter": [* {* "term": {* "address": {* "value": "重庆"* }* }* }* ]* }* }* }*/@Testpublic void boolQueryFilterTermIndex() throws IOException {SearchRequest searchRequest = new SearchRequest("person2");SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();//1.构建boolQueryBoolQueryBuilder boolQuery = QueryBuilders.boolQuery();// 查询条件TermsQueryBuilder termsQueryBuilder = QueryBuilders.termsQuery("address", "重庆");// 判断 filterboolQuery.filter(termsQueryBuilder);sourceBuilder.query(boolQuery);searchRequest.source(sourceBuilder);SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);System.out.println(searchResponse.getHits());}
30 布尔查询 [ bool ] [should]
/*** GET /person2/_search* {* "query": {* "bool": {* "should": [* {* "terms": {* "address": [* "河南",* "河北",* "重庆"* ]* }* }* ]* }* }* }**/@Testpublic void boolQueryShouldTermIndex() throws IOException {SearchRequest searchRequest = new SearchRequest("person2");SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();//1.构建boolQueryBoolQueryBuilder boolQuery = QueryBuilders.boolQuery();// 查询条件TermsQueryBuilder termsQueryBuilder = QueryBuilders.termsQuery("address", "重庆","河南","河北");// 判断boolQuery.should(termsQueryBuilder);sourceBuilder.query(boolQuery);searchRequest.source(sourceBuilder);SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);System.out.println(searchResponse.getHits());}
31 布尔查询 [ bool ] 组合
/*** # 组合* GET /person2/_search* {* "query": {* "bool": {* "must": [* {* "term": {* "address": {* "value": "重庆"* }* }* }* ],* "filter": [* {* "match": {* "address": {* "value": "南岸"* }* }* }* ]* }* }* }*/@Testpublic void boolQueryMustAndFilterTermIndex() throws IOException {SearchRequest searchRequest = new SearchRequest("person2");SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();//1.构建boolQueryBoolQueryBuilder boolQuery = QueryBuilders.boolQuery();// 查询条件TermsQueryBuilder termsQueryBuilder = QueryBuilders.termsQuery("address", "重庆");// 判断boolQuery.must(termsQueryBuilder);MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("address", "南岸");boolQuery.filter(matchQueryBuilder);sourceBuilder.query(boolQuery);searchRequest.source(sourceBuilder);SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);System.out.println(searchResponse.getHits());}
32 倒序 [ sort ]
/*** GET /person2/_search* {* "query": { "match_all": {} },* "sort": [* { "_id": "desc" }* ]* }*/@Testpublic void querySortIndex() throws IOException {SearchRequest searchRequest = new SearchRequest("person2");SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();// 查询条件MatchAllQueryBuilder matchAllQueryBuilder = QueryBuilders.matchAllQuery();sourceBuilder.query(matchAllQueryBuilder);// 降序sourceBuilder.sort("_id", SortOrder.DESC);searchRequest.source(sourceBuilder);SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);System.out.println(searchResponse.getHits());}
33 关键字查询 [ includes ]
/*** GET /person2/_search* {* "query": { "match_all": {} },* "_source": ["name","张三"]* }*/@Testpublic void querySourceIndex() throws IOException {SearchRequest searchRequest = new SearchRequest("person2");//选择返回的字段String[] includes = new String[]{"name", "张三"};String[] excludes = Strings.EMPTY_ARRAY;SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();sourceBuilder.fetchSource(includes, excludes);// 查询条件MatchAllQueryBuilder matchAllQueryBuilder = QueryBuilders.matchAllQuery();sourceBuilder.query(matchAllQueryBuilder);SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);System.out.println(searchResponse.getHits());}
34 排除关键字查询 [ excludes ]
/*** GET /person2/_search* {* "_source": {* "excludes":"age"* },* "query": { "match_all": {} }* }*/@Testpublic void queryExcludesSourceIndex() throws IOException {SearchRequest searchRequest = new SearchRequest("person2");//选择返回的字段String[] includes = Strings.EMPTY_ARRAY;String[] excludes = new String[]{"age"};SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();sourceBuilder.fetchSource(includes, excludes);// 查询条件MatchAllQueryBuilder matchAllQueryBuilder = QueryBuilders.matchAllQuery();sourceBuilder.query(matchAllQueryBuilder);SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);System.out.println(searchResponse.getHits());}
35 分页查询
/*** GET /person2/_search* {* "query": { "match_all": {} },* "from": 3,* "size": 3,* "sort": { "age": "asc" }* }*/@Testpublic void queryFromSizeIndex() throws IOException {SearchRequest searchRequest = new SearchRequest("person2");SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();// 查询条件MatchAllQueryBuilder matchAllQueryBuilder = QueryBuilders.matchAllQuery();sourceBuilder.query(matchAllQueryBuilder);// 分页sourceBuilder.from(3);sourceBuilder.size(3);// 正序sourceBuilder.sort("age",SortOrder.ASC);SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);System.out.println(searchResponse.getHits());}
36 桶聚合 [ aggs ]
/*** GET person2/_search* {* "size": 0,* "query": {* "match": {* "address": "重庆"* }* },* "aggs": {* "address_name": {* "terms": {* "field": "name",* "size": 10* }* }* }* }*/@Testpublic void AggQuery() throws IOException {SearchRequest searchRequest = new SearchRequest("person2");SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();MatchQueryBuilder queryBuilder = QueryBuilders.matchQuery("address", "重庆");sourceBuilder.query(queryBuilder);// 查询前10个城市AggregationBuilder aggregation= AggregationBuilders.terms("address_name").field("name").size(10);sourceBuilder.aggregation(aggregation);SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);//7. 获取命中对象 SearchHitsSearchHits hits = searchResponse.getHits();//7.1 获取总记录数Long total= hits.getTotalHits().value;System.out.println("总数:"+total);// aggregations 对象Aggregations aggregations = searchResponse.getAggregations();//将aggregations 转化为mapMap<String, Aggregation> aggregationMap = aggregations.asMap();//通过key获取address_name对象 使用Aggregation的子类接收 buckets属性在Terms接口中体现// Aggregation address_name = aggregationMap.get("address_name");Terms address_name =(Terms) aggregationMap.get("address_name");//获取buckets 数组集合List<? extends Terms.Bucket> buckets = address_name.getBuckets();Map<String,Object>map=new HashMap<>();//遍历buckets key 属性名,doc_count 统计聚合数for (Terms.Bucket bucket : buckets) {System.out.println(bucket.getKey());map.put(bucket.getKeyAsString(),bucket.getDocCount());}System.out.println(map);}
37 指标聚合 [ aggs ]
/*** GET person2/_search* {* "query": {* "match": {* "address": "四川"* }* },* "aggs": {* "max_age": {* "max": {* "field": "age"* }* }* }* }*/@Testpublic void AggMaxQuery() throws IOException {SearchRequest searchRequest = new SearchRequest("person2");SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();MatchQueryBuilder queryBuilder = QueryBuilders.matchQuery("address", "重庆");sourceBuilder.query(queryBuilder);// 查询前10个城市AggregationBuilder aggregation = AggregationBuilders.max("max_age").field("age");sourceBuilder.aggregation(aggregation);SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);System.out.println(searchResponse.getAggregations());}
38 嵌套查询
/*** GET person2/_search* {* "size": 0,* "aggs": {* "my_name": {* "terms": {* "field": "name"* },* "aggs": {* "age_max":{* "max": {* "field": "age"* }* }* }* }* }* }*/@Testpublic void AggMaxAggQuery() throws IOException {SearchRequest searchRequest = new SearchRequest("person2");SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();sourceBuilder.size(0);// 查询前10个城市TermsAggregationBuilder terms = AggregationBuilders.terms("my_name").field("name");AggregationBuilder aggregation = AggregationBuilders.max("max_age").field("age");sourceBuilder.aggregation(terms);sourceBuilder.aggregation(aggregation);SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);System.out.println(searchResponse.getAggregations());}
39 阶梯分桶 [ histogram ]
/*** GET /person2/_search* {* "size": 0,* "aggs": {* "age": {* "histogram": {* "field": "age",* "interval": 2,* "min_doc_count":1* }* }* }* }*/@Testpublic void AggHistogramQuery() throws IOException {SearchRequest searchRequest = new SearchRequest("person2");SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();sourceBuilder.size(0);HistogramAggregationBuilder aggregationBuilder = AggregationBuilders.histogram("age").field("age").interval(2).minDocCount(1);sourceBuilder.aggregation(aggregationBuilder);SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);System.out.println(searchResponse.getAggregations());}
40 高亮查询 [ highlight ]
/*** GET person2/_search* {* "query": {* "match": {* "address": "四川"* }* },* "highlight": {* "fields": {* "address": {* "pre_tags": "<font color='red'>",* "post_tags": "</font>"* }* }* }* }* @throws IOException*/@Testpublic void testHighLightQuery() throws IOException {SearchRequest searchRequest = new SearchRequest("person2");SearchSourceBuilder sourceBulider = new SearchSourceBuilder();// 1. 查询title包含手机的数据MatchQueryBuilder query = QueryBuilders.matchQuery("address", "四川");sourceBulider.query(query);// 设置高亮HighlightBuilder highlighter = new HighlightBuilder();// 设置三要素highlighter.field("address");// 设置前后缀标签highlighter.preTags("<font color='red'>");highlighter.postTags("</font>");//加载已经设置好的高亮配置sourceBulider.highlighter(highlighter);searchRequest.source(sourceBulider);SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);SearchHits searchHits = searchResponse.getHits();// 获取记录数long value = searchHits.getTotalHits().value;System.out.println("总记录数:"+value);List<Person> personList = new ArrayList<>();SearchHit[] hits = searchHits.getHits();for (SearchHit hit : hits) {String sourceAsString = hit.getSourceAsString();//转为javaPerson person = JSON.parseObject(sourceAsString, Person.class);// 获取高亮结果,替换person中的addressMap<String, HighlightField> highlightFields = hit.getHighlightFields();HighlightField HighlightField = highlightFields.get("address");Text[] fragments = HighlightField.fragments();//highlight address替换 替换person中的addressperson.setAddress(fragments[0].toString());personList.add(person);}for (Person person : personList) {System.out.println(person);}}
41 复制索引 [ _reindex ]
/*** POST _reindex* {* "source": {"index": "person1"},* "dest": {"index": "person2"}* }*/@Testpublic void reindex() throws IOException {ReindexRequest request = new ReindexRequest(); //创建ReindexRequestrequest.setSourceIndices("person1"); //添加要从源中复制的列表request.setDestIndex("person2"); //添加目标索引request.setDestVersionType(VersionType.EXTERNAL); //设置versionType为EXTERNALrequest.setDestOpType("create"); //设置versionType为createrequest.setConflicts("proceed"); //设置版本冲突时继续request.setSourceQuery(new TermQueryBuilder("user", "kimchy")); //仅复制字段用户设置为kimchy的文档request.setSize(10); //只拷贝10个文档request.setSourceBatchSize(100); //单次处理100个文档request.setDestPipeline("my_pipeline"); //设置管线为my_pipeline// 同步执行BulkByScrollResponse bulkResponse =client.reindex(request, RequestOptions.DEFAULT);System.out.println(bulkResponse);}
