引入依赖:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-elasticsearch</artifactId> </dependency>
配置客户端:
@Configuration public class ESRestClientConfig extends AbstractElasticsearchConfiguration { @Value("${Elasticsearch.Host}") String host; public RestHighLevelClient elasticsearchClient() { final ClientConfiguration clientConfiguration = ClientConfiguration.builder() .connectedTo(host) .build(); return RestClients.create(clientConfiguration).rest(); } }
ES默认提供了两个客户端对象:
- ElasticSearchOperations:主要以对象进行ES操作
- RestHighlevelClient(推荐):以Rest的风格进行交互
1.ElasticSearchOperations客户端操作
ElasticSearchOperations始终以对象方式操作ES
- 索引:用来存放相似文档集合
- 映射:用来决定放入文档的每个字段以什么样方式录入到ES中(字段类型 分词器)
- 文档:可以被索引最小单元json数据格式
@Document(indexName = "products",createIndex = true) public class Product { @Id private Integer id; @Field(type = FieldType.Keyword) private String title; @Field(type = FieldType.Double) private Double price; @Field(type = FieldType.Text,analyzer = "ik_max_word") private String description; }
1,@Document:标注在类上代表一个对象为一个文档
- indexName:创建索引的名称
- createIndex:是否创建索引
2,@id:用于属性,将对象id字段与ES文档的_id对应
3,@Field:用于属性,用来描述属性在ES中存储类型以及分词情况……
- type:指定字段类型
- analyzer:指定分词器
例:测试保存一条文档
@SpringBootTest class SpringbootEsApplicationTests { @Autowired ElasticsearchOperations elasticsearchOperations; @Test void contextLoads() { Product product = new Product(); product.setId(1); product.setTitle("光影笔墨"); product.setPrice(123.12); product.setDescription("留声机的回忆"); elasticsearchOperations.save(product); }}
其他操作:
@Autowired ElasticsearchOperations elasticsearchOperations; //1,保存数据 @Test void contextLoads() { Product product = new Product(); product.setId(1); product.setTitle("光影笔墨"); product.setPrice(123.12); product.setDescription("留声机的回忆"); elasticsearchOperations.save(product); } //2,按照id查询文档 @Test void selectId() { Product product = elasticsearchOperations.get("1", Product.class); System.out.println(product.getTitle()+"\n"+product.getDescription()); } //3,按照id删除 @Test void deleteId() { String delete = elasticsearchOperations.delete("1", Product.class); System.out.println(delete); } //4,查询所有文档 @Test void selectAll() throws JsonProcessingException { SearchHits<Product> search = elasticsearchOperations.search(Query.findAll(), Product.class); System.out.println(search.getTotalHits());//总条数 for (SearchHit<Product> pro:search){ System.out.println(new ObjectMapper().writeValueAsString(pro.getContent())); } }
2. RestHigLevelClient客户端
2.1 创建索引
@Autowired RestHighLevelClient restHighLevelClient; //创建索引 @Test void Createindex() throws IOException { //创建索引对象,传入参数索引名 CreateIndexRequest createIndexRequest = new CreateIndexRequest("index-wql"); /**创建映射 *1,参数1:映射内容 *2,参数2:映射内容的格式 * **/ createIndexRequest.mapping("{\n" + " \"properties\": {\n" + " \"title\":{\n" + " \"type\":\"text\"\n" + " },\n" + " \"price\":{\n" + " \"type\": \"double\"\n" + " },\n" + " \"create_at\":{\n" + " \"type\":\"date\"\n" + " }\n" + " }\n" + " }", XContentType.JSON); //参数1:索引对象 参数2:请求的配置对象 CreateIndexResponse createIndexResponse = restHighLevelClient.indices().create(createIndexRequest, RequestOptions.DEFAULT); System.out.println(createIndexResponse.isAcknowledged()); restHighLevelClient.close(); } //删除索引 @Test void DeleteIndex() throws IOException { //索引删除对象 DeleteIndexRequest deleteIndexRequest = new DeleteIndexRequest("pro"); AcknowledgedResponse delete = restHighLevelClient.indices().delete(deleteIndexRequest, RequestOptions.DEFAULT); System.out.print(delete.isAcknowledged()); }
CreateIndexRequest:创建索引的对象
- mapping():指定映射
restHighLevelClient.indices():索引的操作对象
2.2 文档操作
2.2.1 文档的创建
//创建文档 @Test void indexDocment() throws IOException { //参数:索引名称 IndexRequest indexRequest = new IndexRequest("index-wql"); indexRequest.id("1")//指定文档id .source("{\n" + //指定文档数据 " \"title\":\"英雄联盟手机壳\",\n" + " \"price\":20,\n" + " \"create_at\":\"2022-09-01\"\n" + "}",XContentType.JSON); //创建文档 IndexResponse index = restHighLevelClient.index(indexRequest, RequestOptions.DEFAULT); System.out.print(index.status()); }
- IndexRequest:文档操作对象
2.2.2 更新文档
@Test void updateDocment() throws IOException { //更新文档对象 参1:索引 参2:文档id UpdateRequest updateRequest = new UpdateRequest("index-wql","1"); //更新的文档内容 updateRequest.doc("{\n" + " \"title\":\"我TM是个废物\",\n" + " \"price\":\"0.1\",\n" + " \"create_at\":\"2022-09-01\"\n" + "}",XContentType.JSON); UpdateResponse update = restHighLevelClient.update(updateRequest,RequestOptions.DEFAULT); System.out.print(update.status()); }
- UpdateRequest:更新文档对象
2.2.3 删除文档
//删除文档 @Test void deleteDocment() throws IOException { //删除文档对象 DeleteRequest deleteRequest = new DeleteRequest("index-wql","1000"); DeleteResponse delete = restHighLevelClient.delete(deleteRequest,RequestOptions.DEFAULT); System.out.print(delete.status()); }
- DeleteRequest:删除文档对象
2.2.4 基于ID查询文档
//基于id查询文档 @Test void getDocment() throws IOException { //查询对象 GetRequest getRequest = new GetRequest("index-wql","1"); GetResponse documentFields = restHighLevelClient.get(getRequest, RequestOptions.DEFAULT); System.out.print(documentFields.getSourceAsString()+"\n"+documentFields.getId()); }
- GetRequest:查询对象
2.3 文档查询操作
1,查询所有文档
@Autowired RestHighLevelClient restHighLevelClient; @Test void QueryAll() throws IOException { //创建搜索对象 参数:指定索引 SearchRequest searchRequest = new SearchRequest("index-wql"); //创建查询条件对象 SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); searchSourceBuilder.query(QueryBuilders.matchAllQuery());//查询所有 searchRequest.source(searchSourceBuilder); SearchResponse search = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT); //获取结果 SearchHit[] hits = search.getHits().getHits(); for (SearchHit h:hits){ System.out.println(h.getId()+"\t"+h.getSourceAsString()); }
- SearchRequest:条件查询对象
- SearchSourceBuilder:条件约束对象
它的API跟Kibana的返回json是一样的,用对象的方式调用json结果
2,关键字查询
//关键字查询 @Test void QueryTerm() throws IOException { SearchRequest searchRequest = new SearchRequest("index-wql"); SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); searchSourceBuilder.query(QueryBuilders.termQuery("title","废")); searchRequest.source(searchSourceBuilder); SearchResponse search = restHighLevelClient.search(searchRequest,RequestOptions.DEFAULT); SearchHit[] hits = search.getHits().getHits(); for (SearchHit h:hits){ System.out.println(h.getId()+"\t"+h.getSourceAsString()); }
- QueryBuilders.termQuery():关键字查询方法 (参1:字段,参2:值)
3,范围查询
@Test void QueryRange() throws IOException { SearchRequest searchRequest = new SearchRequest("index-wql"); SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); searchSourceBuilder.query(QueryBuilders.rangeQuery("price").lt(50)); searchRequest.source(searchSourceBuilder); SearchResponse search = restHighLevelClient.search(searchRequest,RequestOptions.DEFAULT); SearchHit[] hits = search.getHits().getHits(); for (SearchHit h:hits){ System.out.println(h.getId()+"\t"+h.getSourceAsString()); } }
- QueryBuilders.rangeQuery:范围查询方法
其他查询格式都是一样的唯一变的是QueryBuilders方法:
- 前缀查询:QueryBuilders.prefixQuery()
- 通配符查询:QueryBuilders.wildcardQuery()
- 多ID查询:QueryBuilders.idsQuery().addIds();
- 多字段查询:QueryBuilders.multiMatchQuery("值","字段……","")
4,分页高亮排序查询
//分页排序查询 @Test void QueryPageSort() throws IOException { SearchRequest searchRequest = new SearchRequest("index-wql"); //创建一个高亮器 HighlightBuilder highlightBuilder = new HighlightBuilder(); /** * field():需要高亮的字段 * requireFieldMatch():关闭字段匹配 * preTags():自定义高亮标签前缀 * postTags():标签后缀 */ highlightBuilder.requireFieldMatch(false).field("title").preTags("<span style='color:red'>").postTags("</span>"); SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); searchSourceBuilder.query(QueryBuilders.termQuery("title","废")) .from(0)//起始位置 .size(10)//每页条数 .sort("price", SortOrder.DESC)//排序字段 .fetchSource(new String[]{},new String[]{"create_at"})//数组1:结果需要包含的字段 数组2:结果需要排除的字段 .highlighter(highlightBuilder);//指定高亮 searchRequest.source(searchSourceBuilder); SearchResponse search = restHighLevelClient.search(searchRequest,RequestOptions.DEFAULT); SearchHit[] hits = search.getHits().getHits(); for (SearchHit h:hits){ System.out.println(h.getId()+"\t"+h.getSourceAsString()); Map<String, HighlightField> highlightFields = h.getHighlightFields(); if(highlightFields.containsKey("title")){ System.out.print("title高亮结果"+highlightFields.get("title").fragments()[0]); } } }
- from():起始位置
- size():单页条数
- sort():排序,指定排序字段(可选项排序规则)
- ……
5,过滤查询
- query:查询精确,查询计算文档得分,并根据得分进行返回
- filter query:过滤查询,用来在大量数据中筛选出本地查询相关数据,不会计算文档得分,经常使用filter query的结果会进行缓存
注:一旦使用query和filterQuery,es优先执行filter Query然后再执行Query
@Test void QueryFilter() throws IOException { SearchRequest searchRequest = new SearchRequest("index-wql"); SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); searchSourceBuilder.query(QueryBuilders.matchAllQuery()) //指定过滤条件 .postFilter(QueryBuilders.termQuery("title","物")); searchRequest.source(searchSourceBuilder); SearchResponse search = restHighLevelClient.search(searchRequest,RequestOptions.DEFAULT); SearchHit[] hits = search.getHits().getHits(); for (SearchHit h:hits){ System.out.println(h.getId()+"\t"+h.getSourceAsString()); } }
- postFilter:指定过滤条件
Comments | NOTHING
Warning: Undefined variable $return_smiles in /www/wwwroot/wql_luoqin_ltd/wp-content/themes/Sakura/functions.php on line 1109