阅读 203

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


文章分类
后端
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐