elasticSearch java API及基本的nested结构使用
1、创建索引:PUT fmmallproductsindex,所有单词要求小写
CreateIndexRequest fmmallProductsIndex = new CreateIndexRequest("fmmallproductsindex"); CreateIndexResponse createIndexResponse = restHighLevelClient.indices().create(fmmallProductsIndex, RequestOptions.DEFAULT); System.out.println(createIndexResponse.isAcknowledged());
2、删除索引:DELETE fmmallproductsindex
DeleteIndexRequest index = new DeleteIndexRequest("fmmallproductsindex"); AcknowledgedResponse delete = restHighLevelClient.indices().delete(index, RequestOptions.DEFAULT); System.out.println(delete.isAcknowledged());
3、添加文档:一定要使用实体添加,否则添加字段名不对会导致所有自动添加字段
POST index4/_doc/2 { "bookId": 102, "bookName": "C++程序设计", "author": "谭浩强", "time": 1704623538911 }
Product product = new Product(1, "咪咪虾条", 2.00, "美味的海鲜虾条"); IndexRequest index6 = new IndexRequest("bar"); index6.id(product.getProductId() + ""); index6.source(objectMapper.writeValueAsString(product), XContentType.JSON); IndexResponse index = restHighLevelClient.index(index6, RequestOptions.DEFAULT); System.out.println(index.status().getStatus());
4、批量添加文档:
BulkRequest bulkRequest = new BulkRequest(); Product product = new Product(1, "加丽加虾条", 6.00, "比奥利奥好吃的饼干"); IndexRequest index1 = new IndexRequest("index6"); index1.id(product.getProductId() + ""); index1.source(objectMapper.writeValueAsString(product), XContentType.JSON); bulkRequest.add(index1); Product product2 = new Product(2, "旺旺小饼干", 12.00, "旺旺"); IndexRequest index2 = new IndexRequest("index6"); index2.id(product2.getProductId() + ""); index2.source(objectMapper.writeValueAsString(product2), XContentType.JSON); bulkRequest.add(index2); BulkResponse bulk = restHighLevelClient.bulk(bulkRequest, RequestOptions.DEFAULT);
关于如下结构的实体添加到es,list会会被简单的扁平化为字段名称对应的数组对象结构
@Data @AllArgsConstructor @NoArgsConstructor public class Product4Es { private String productId; private String productName; private List<String> productsImg; private List<ProductSku4Es> productSku4Es; }
如果想存nested结构则需要事先建好索引,或者使用索引模板来创建,才会保存为nested的结构
如下则会创建为nested结构
1、先建索引模板
PUT _template/template_1?create=false&order=0 { "index_patterns": [ "fmmall*", "bar*" ], "settings": { "number_of_shards": 1 }, "order": 0, "mappings": { "properties": { "productId": { "type": "long" }, "productName": { "type": "text" }, "productsImg": { "type": "text", "fields": { "keyword": { "type": "keyword", "ignore_above": 256 } } }, "productSku4Es": { "type": "nested", "properties": { "skuId": { "type": "long" }, "skuName": { "type": "text" }, "sellPrice": { "type": "float" } } } } } }
2、批量添加数据
List<Product4Es> product4Es = productMapper.selectProduct4Es(); BulkRequest bulkRequest = new BulkRequest(); for (Product4Es product4E : product4Es) { IndexRequest index = new IndexRequest("fmmallproductsindex"); index.id(product4E.getProductId() + ""); index.source(objectMapper.writeValueAsString(product4E), XContentType.JSON); bulkRequest.add(index); } BulkResponse bulk = restHighLevelClient.bulk(bulkRequest, RequestOptions.DEFAULT); System.out.println(bulk.status().getStatus());
3、一个复杂一点的查询的demo:包括分页、nested查询条件、高亮、查询结果的封装等
public ResultVo getProductsByKeyword(String keyword, int pageNum, int pageSize) throws IOException { int start = (pageNum - 1) * pageSize; SearchRequest searchRequest = new SearchRequest(); searchRequest.indices("fmmallproductsindex"); SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); //查询条件 BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); boolQueryBuilder.should(QueryBuilders.matchQuery("productName", keyword)) .should(QueryBuilders.nestedQuery("productSku4Es", QueryBuilders.matchQuery("productSku4Es.skuName", keyword), ScoreMode.Avg)); searchSourceBuilder.query(boolQueryBuilder); //分页 searchSourceBuilder.from(start); searchSourceBuilder.size(pageSize); //高亮 HighlightBuilder highlightBuilder = new HighlightBuilder(); HighlightBuilder.Field field1 = new HighlightBuilder.Field("productName"); HighlightBuilder.Field field2 = new HighlightBuilder.Field("skuName"); highlightBuilder.field(field1).field(field2).preTags("<em style='color: red'>").postTags("</em>"); searchSourceBuilder.highlighter(highlightBuilder); searchRequest.source(searchSourceBuilder); SearchResponse search = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT); SearchHits hits = search.getHits(); Long totalHits = hits.getTotalHits().value; long pageCount = totalHits % pageSize == 0 ? totalHits / pageSize : totalHits / pageSize + 1; ArrayList<Product4Es> product4EsArrayList = new ArrayList<>(); //查询结果的封装 for (SearchHit hit : hits) { String sourceAsString = hit.getSourceAsString(); objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); Product4Es product4Es = objectMapper.readValue(sourceAsString, Product4Es.class); Map<String, HighlightField> highlightFields = hit.getHighlightFields(); HighlightField highlightField1 = highlightFields.get("productName"); if(highlightField1 != null) { String productName = ""; for (Text fragment : highlightField1.fragments()) { productName += fragment; } product4Es.setProductName(productName); } product4EsArrayList.add(product4Es); } PageHelperVo<Product4Es> productVoPageHelperVo = new PageHelperVo(totalHits, pageCount, product4EsArrayList); return new ResultVo(200, "success", productVoPageHelperVo); }
标签:
Elasticsearch
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· winform 绘制太阳,地球,月球 运作规律
· 上周热点回顾(3.3-3.9)