ElasticSearch 常用JAVA API调用
ElasticSearch 常用JAVA API调用
本次使用的版本是Java High Level REST Client,transport Client已经在7.0废止,8.0完全移除。
pom
<!--引入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>
基础
命令的前期学习
https://blog.csdn.net/qq_41520636/article/details/116081185
下面代码完全对照该博客例子,编写的java 例子。
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() {
}
@Override
public String toString() {
return "Person{" + ", name='" + name + '\'' + ", age=" + age + ", address='" + address + '\'' + '}';
}
}
/**
* 对象转换JSON
*/
@Test
public 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":"张三"}]
索引是否存在 [exists]
/**
* 索引是否存在
*/
@Test
public void existIndex() throws IOException {
IndicesClient indices = client.indices();
GetIndexRequest getIndexRequest = new GetIndexRequest("person2");
boolean exists = indices.exists(getIndexRequest, RequestOptions.DEFAULT);
System.out.println(exists);
}
关闭索引 [close]
/**
* 关闭索引
* POST /person2/_close
*
* @throws IOException
*/
@Test
public void closeIndex() throws IOException {
CloseIndexRequest closeIndexRequest = new CloseIndexRequest("person2");
CloseIndexResponse close = client.indices().close(closeIndexRequest, RequestOptions.DEFAULT);
System.out.println(close.isAcknowledged());
}
打开索引 [open]
/**
* 打开索引
* POST /person2/_open
*
* @return
* @throws IOException
*/
@Test
public void openIndex() throws IOException {
OpenIndexRequest openIndexRequest = new OpenIndexRequest("person2");
boolean acknowledged = client.indices().open(openIndexRequest, RequestOptions.DEFAULT).isAcknowledged();
System.out.println(acknowledged);
}
创建索引 [create]
/**
* 创建索引
* PUT /person2
*
* @throws IOException
*/
@Test
public 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>() {
@Override
public void onResponse(
CreateIndexResponse createIndexResponse) {
// 6、处理响应
boolean acknowledged = createIndexResponse.isAcknowledged();
boolean shardsAcknowledged = createIndexResponse
.isShardsAcknowledged();
System.out.println("acknowledged = " + acknowledged);
System.out.println(
"shardsAcknowledged = " + shardsAcknowledged);
}
@Override
public void onFailure(Exception e) {
System.out.println("创建索引异常:" + e.getMessage());
}
};
client.indices().createAsync(request, RequestOptions.DEFAULT, listener);*/
}
添加索引,并添加映射
/**
* 添加索引,并添加映射
* PUT person2
* {
* "mappings": {
* "properties": {
* "name": {
* "type": "keyword"
* },
* "age" : {
* "type" : "long"
* }
* "address": {
* "type": "text",
* "analyzer": "ik_max_word"
* }
* }
* }
* }
*/
@Test
public void addIndexAndMapping() throws IOException {
//1.使用client获取操作索引对象
IndicesClient indices = client.indices();
//2.具体操作获取返回值
//2.具体操作,获取返回值
CreateIndexRequest createIndexRequest = new CreateIndexRequest("person2");
//2.1 设置mappings
String 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());
}
@Test
public void addIndexAndMapping2() throws IOException {
//1.使用client获取操作索引对象
IndicesClient indices = client.indices();
//2.具体操作获取返回值
//2.具体操作,获取返回值
CreateIndexRequest createIndexRequest = new CreateIndexRequest("person2");
//2.1 设置mappings
IndexRequest 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());
}
查询索引 [get]
/**
* 查询索引
* GET /person2
*/
@Test
public 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());
}
}
删除索引 [delete]
/**
* 删除索引
* DELETE /person2
*/
@Test
public 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());
}
修改配置 [update]
/**
* 修改配置
* POST /person2/_close
* PUT /person2/_settings
* {
* "index":{
* "number_of_replicas":2
* }
* }
* POST /person2/_open
*
* @throws IOException
*/
@Test
public 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();
}
修改文档 [update]
/**
* 修改文档
*
* @throws IOException
*/
@Test
public 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();
}
添加文档 [add]
/**
* 添加文档
* POST /person2/_doc/1
* {
* "name":"张三",
* "age":18,
* "address":"重庆市江北区"
* }
*
*/
@Test
public 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>() {
@Override
public void onResponse(IndexResponse indexResponse) {
}
@Override
public void onFailure(Exception e) {
}
};
client.indexAsync(request, RequestOptions.DEFAULT, listener);*/
}
批量导入文档 [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
*/
@Test
public 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>() {
@Override
public void onResponse(BulkResponse bulkResponse) {
}
@Override
public void onFailure(Exception e) {
}
};
client.bulkAsync(bulkRequest,RequestOptions.DEFAULT, listener);*/
}
查询所有 [matchAll]
/**
* 查询所有
* 1. matchAll
* 2. 将查询结果封装为Goods对象,装载到List中
* 3. 分页。默认显示10条
* # 全文检索
* GET /person2/_search
* {
* "query": { "match_all": {} }
* }
*/
@Test
public void matchAllIndex() throws IOException {
//2. 构建查询请求对象,指定查询的索引名称
SearchRequest searchRequest = new SearchRequest("person2");
//4. 创建查询条件构建器SearchSourceBuilder
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
//6. 查询条件
QueryBuilder queryBuilder = QueryBuilders.matchAllQuery();
//5. 指定查询条件
sourceBuilder.query(queryBuilder);
//3. 添加查询条件构建器 SearchSourceBuilder
searchRequest.source(sourceBuilder);
// 8 . 添加分页信息 不设置 默认10条
// sourceBuilder.from(0);
// sourceBuilder.size(100);
//1. 查询,获取查询结果
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
//7. 获取命中对象 SearchHits
SearchHits 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);
}
}
单个词条检索 [term]
/**
* GET /person2/_search
* {
* "query": {
* "term": {
* "address": {
* "value": "南岸"
* }
* }
* }
* }
*/
@Test
public 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());
}
多词条检索 [ terms ]
/**
* GET /person2/_search
* {
* "query": {
* "terms": {
* "address": ["重庆","区"]
* }
* }
* }
*/
@Test
public 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());
}
模糊查询 [ fuzzy ]
/**
* GET /person2/_search
* {
* "query": {
* "fuzzy": {
* "address": {
* "value": "南岸12",
* "fuzziness":"2"
* }
* }
* }
* }
*/
@Test
public 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());
}
全文查询 [ match ] [or]
/**
* # 默认取并集(or)
* GET /person2/_search
* {
* "query": {
* "match": {
* "address":"重庆南岸"
* }
* }
* }
*
* @throws IOException
*/
@Test
public 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());
}
全文查询 [ match ] [and]
/**
* # 交集(and)
* GET /person2/_search
* {
* "query": {
* "match": {
* "address": {
* "query": "重庆南岸",
* "operator": "and"
* }
* }
* }
* }
*
* @throws IOException
*/
@Test
public 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());
}
多字段检索 [ multi_match ]
/**
* GET /person2/_search
* {
* "query": {
* "multi_match": {
* "query": "重庆",
* "fields": ["address","name"]
* }
* }
* }
*
* @throws IOException
*/
@Test
public 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());
}
通配符检索 [ wildcard ]
/**
* GET /person2/_search
* {
* "query": {
* "wildcard": {
* "address":"重*"
* }
* }
* }
*/
@Test
public 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());
}
正则查询 [ regexp ]
/**
* GET /person2/_search
* {
* "query": {
* "regexp": {
* "address":"(.)*"
* }
* }
* }
*
* @throws IOException
*/
@Test
public 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());
}
前缀查询 [ prefix ]
/**
* GET /person2/_search
* {
* "query": {
* "prefix": {
* "address":"上"
* }
* }
* }
*
* @throws IOException
*/
@Test
public 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());
}
范围查询 [ range ]
/**
* GET /person2/_search
* {
* "query": {
* "range": {
* "age":{
* "gte":18,
* "lte":20
* }
* }
* }
* }
*
* @throws IOException
*/
@Test
public 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());
}
多条件查询 [ query_string ]
/**
* GET /person2/_search
* {
* "query": {
* "query_string": {
* "default_field": "address",
* "query": "重庆 AND 市 OR 区"
* }
* }
* }
*
* @throws IOException
*/
@Test
public 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());
}
自动分词的连接符 [ default_operator ]
/**
* GET /person2/_search
* {
* "query": {
* "query_string": {
* "default_field": "address",
* "default_operator": "AND",
* "query": "上海市"
* }
* }
* }
*/
@Test
public 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());
}
单例多条件查询 [ simple_query_string ]
/**
* GET /person2/_search
* {
* "query": {
* "simple_query_string": {
* "query": "重庆 AND 市 OR 区",
* "fields": ["address"]
* }
* }
* }
*
* @throws IOException
*/
@Test
public 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());
}
布尔查询 [ bool ] [must]
/**
* GET /person2/_search
* {
* "query": {
* "bool": {
* "must": [
* {
* "term": {
* "address": {
* "value": "重庆"
* }
* }
* }
* ]
* }
* }
* }
*
*/
@Test
public void boolQueryMustTermIndex() throws IOException {
SearchRequest searchRequest = new SearchRequest("person2");
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
//1.构建boolQuery
BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
// 查询条件
TermsQueryBuilder termsQueryBuilder = QueryBuilders.termsQuery("address", "重庆");
// 判断 must
boolQuery.must(termsQueryBuilder);
sourceBuilder.query(boolQuery);
searchRequest.source(sourceBuilder);
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
System.out.println(searchResponse.getHits());
}
布尔查询 [ bool ] [filter]
/**
* GET /person2/_search
* {
* "query": {
* "bool": {
* "filter": [
* {
* "term": {
* "address": {
* "value": "重庆"
* }
* }
* }
* ]
* }
* }
* }
*/
@Test
public void boolQueryFilterTermIndex() throws IOException {
SearchRequest searchRequest = new SearchRequest("person2");
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
//1.构建boolQuery
BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
// 查询条件
TermsQueryBuilder termsQueryBuilder = QueryBuilders.termsQuery("address", "重庆");
// 判断 filter
boolQuery.filter(termsQueryBuilder);
sourceBuilder.query(boolQuery);
searchRequest.source(sourceBuilder);
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
System.out.println(searchResponse.getHits());
}
布尔查询 [ bool ] [should]
/**
* GET /person2/_search
* {
* "query": {
* "bool": {
* "should": [
* {
* "terms": {
* "address": [
* "河南",
* "河北",
* "重庆"
* ]
* }
* }
* ]
* }
* }
* }
*
*/
@Test
public void boolQueryShouldTermIndex() throws IOException {
SearchRequest searchRequest = new SearchRequest("person2");
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
//1.构建boolQuery
BoolQueryBuilder 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());
}
布尔查询 [ bool ] 组合
/**
* # 组合
* GET /person2/_search
* {
* "query": {
* "bool": {
* "must": [
* {
* "term": {
* "address": {
* "value": "重庆"
* }
* }
* }
* ],
* "filter": [
* {
* "match": {
* "address": {
* "value": "南岸"
* }
* }
* }
* ]
* }
* }
* }
*/
@Test
public void boolQueryMustAndFilterTermIndex() throws IOException {
SearchRequest searchRequest = new SearchRequest("person2");
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
//1.构建boolQuery
BoolQueryBuilder 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());
}
倒序 [ sort ]
/**
* GET /person2/_search
* {
* "query": { "match_all": {} },
* "sort": [
* { "_id": "desc" }
* ]
* }
*/
@Test
public 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());
}
关键字查询 [ includes ]
/**
* GET /person2/_search
* {
* "query": { "match_all": {} },
* "_source": ["name","张三"]
* }
*/
@Test
public 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());
}
排除关键字查询 [ excludes ]
/**
* GET /person2/_search
* {
* "_source": {
* "excludes":"age"
* },
* "query": { "match_all": {} }
* }
*/
@Test
public 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());
}
分页查询
/**
* GET /person2/_search
* {
* "query": { "match_all": {} },
* "from": 3,
* "size": 3,
* "sort": { "age": "asc" }
* }
*/
@Test
public 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());
}
桶聚合 [ aggs ]
/**
* GET person2/_search
* {
* "size": 0,
* "query": {
* "match": {
* "address": "重庆"
* }
* },
* "aggs": {
* "address_name": {
* "terms": {
* "field": "name",
* "size": 10
* }
* }
* }
* }
*/
@Test
public 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. 获取命中对象 SearchHits
SearchHits hits = searchResponse.getHits();
//7.1 获取总记录数
Long total= hits.getTotalHits().value;
System.out.println("总数:"+total);
// aggregations 对象
Aggregations aggregations = searchResponse.getAggregations();
//将aggregations 转化为map
Map<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);
}
指标聚合 [ aggs ]
/**
* GET person2/_search
* {
* "query": {
* "match": {
* "address": "四川"
* }
* },
* "aggs": {
* "max_age": {
* "max": {
* "field": "age"
* }
* }
* }
* }
*/
@Test
public 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());
}
嵌套查询
/**
* GET person2/_search
* {
* "size": 0,
* "aggs": {
* "my_name": {
* "terms": {
* "field": "name"
* },
* "aggs": {
* "age_max":{
* "max": {
* "field": "age"
* }
* }
* }
* }
* }
* }
*/
@Test
public 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());
}
阶梯分桶 [ histogram ]
/**
* GET /person2/_search
* {
* "size": 0,
* "aggs": {
* "age": {
* "histogram": {
* "field": "age",
* "interval": 2,
* "min_doc_count":1
* }
* }
* }
* }
*/
@Test
public 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());
}
高亮查询 [ highlight ]
/**
* GET person2/_search
* {
* "query": {
* "match": {
* "address": "四川"
* }
* },
* "highlight": {
* "fields": {
* "address": {
* "pre_tags": "<font color='red'>",
* "post_tags": "</font>"
* }
* }
* }
* }
* @throws IOException
*/
@Test
public 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();
//转为java
Person person = JSON.parseObject(sourceAsString, Person.class);
// 获取高亮结果,替换person中的address
Map<String, HighlightField> highlightFields = hit.getHighlightFields();
HighlightField HighlightField = highlightFields.get("address");
Text[] fragments = HighlightField.fragments();
//highlight address替换 替换person中的address
person.setAddress(fragments[0].toString());
personList.add(person);
}
for (Person person : personList) {
System.out.println(person);
}
}
复制索引 [ _reindex ]
/**
* POST _reindex
* {
* "source": {"index": "person1"},
* "dest": {"index": "person2"}
* }
*/
@Test
public void reindex() throws IOException {
ReindexRequest request = new ReindexRequest(); //创建ReindexRequest
request.setSourceIndices("person1"); //添加要从源中复制的列表
request.setDestIndex("person2"); //添加目标索引
request.setDestVersionType(VersionType.EXTERNAL); //设置versionType为EXTERNAL
request.setDestOpType("create"); //设置versionType为create
request.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);
}
————————————————
版权声明:本文为CSDN博主「hikktn」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_41520636/article/details/116132943