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);
    }
复制代码

 

posted @   曹伟666  阅读(220)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· winform 绘制太阳,地球,月球 运作规律
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示