elasticSearch java API及基本的nested结构使用

发布时间 2024-01-09 23:45:17作者: 曹伟666

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());