Java如何操作Elasticsearch

目录

前言

Procuct实体类

一、操作索引

二、操作文档

三、查询文档

四、复杂条件查询

五、分页查询

六、结果排序


本文文章介绍的是通过template的方法操作elasticsearch,他的话直接本地注入使用就行,repository方法还需要实现接口,所以我个人喜欢template(他还支持复杂查询嘞!)

前言

Procuct实体类

java 复制代码
@Document(indexName = "product",createIndex = true)
@Data
@AllArgsConstructor
public class Product {
    @Id
    @Field(type = FieldType.Integer,store = true,index = true)
    private Integer id;
    @Field(type = FieldType.Text,store = true,index = true,analyzer = "ik_max_word",searchAnalyzer = "ik_max_word")
    private String productName;
    @Field(type = FieldType.Text,store = true,index = true,analyzer = "ik_max_word",searchAnalyzer = "ik_max_word")
    private String productDesc;
}

一、操作索引

java 复制代码
@SpringBootTest
public class TemplateTest {
  @Autowired
  private ElasticsearchTemplate template;


  // 新增索引
  @Test
  public void addIndex() {
    // 获得索引操作对象
    IndexOperations indexOperations = template.indexOps(Product.class);
    // 创建索引,注:该方法无法设置索引结构,不推荐使用
    indexOperations.create();
   }


  // 删除索引
  @Test
  public void delIndex() {
    // 获得索引操作对象
    IndexOperations indexOperations = template.indexOps(Product.class);
    // 删除索引
    indexOperations.delete();
   }
}

不过一般我们创建索引在实体类创建时就创建或者是在kibna中自己创建就行!

二、操作文档

java 复制代码
// 新增/修改文档
@Test
public void addDocument() {
  Product product = new Product(7, "es1", "es是一款优秀的搜索引擎");
  template.save(product);
}


// 删除文档
@Test
public void delDocument() {
  template.delete("7", Product.class);
}


// 根据id查询
@Test
public void findAllDocument() {
  Product product = template.get("1", Product.class);
  System.out.println(product);
}

三、查询文档

template的search方法可以查询文档

java 复制代码
SearchHits<T> search(Query query, Class<T> clazz):查询文档,query是查询条件对象,clazz是结果类型。
java 复制代码
// 查询文档2
@Test
public void searchDocument2() {
  String productName = "三体";
  String productDesc = "优秀";


  // 1.构建查询条件
  NativeQuery query=new NativeQueryBuilder()
                .withQuery(Queries.matchAllQueryAsQuery())
                .build();
 


  // 2.查询
  SearchHits<Product> result = template.search(query, Product.class);
  // 3.处理查询结果
  for (SearchHit<Product> productSearchHit : result) {
    Product product = productSearchHit.getContent();
    System.out.println(product);
   }
}

四、复杂条件查询

java 复制代码
// 复杂查询
@Test
public void searchDocument2(){
  String productName = "三体";
  String productDesc = "优秀";


  // 1.构造查询条件
  NativeQueryBuilder nativeQueryBuilder = new NativeQueryBuilder();
  // 如果没有传入参数,查询所有
  if (productName == null && productDesc == null){
    nativeQueryBuilder.withQuery(Queries.matchAllQueryAsQuery());
   }else {
    BoolQuery.Builder boolQuery = QueryBuilders.bool();
    if (productName != null){
      boolQuery.must(Queries.matchQueryAsQuery("productName",productName,null,null));
     }
    if (productDesc != null){
      boolQuery.must(Queries.matchQueryAsQuery("productDesc",productDesc,null,null));
     }
    nativeQueryBuilder.withQuery(boolQuery.build()._toQuery());
   }
  NativeQuery query = nativeQueryBuilder.build();


  // 2.查询
  SearchHits<Product> result = template.search(query, Product.class);
  // 3.处理查询结果
  for (SearchHit<Product> productSearchHit : result) {
    Product product = productSearchHit.getContent();
    System.out.println(product);
   }
}

五、分页查询

java 复制代码
// 分页查询文档
@Test
public void searchDocumentPage() {


  // 1.构建查询条件
  Pageable pageable = PageRequest.of(0, 3);
  NativeQuery query = new NativeQueryBuilder()
     .withQuery(Queries.matchAllQueryAsQuery())
     .withPageable(pageable)
     .build();
  // 2.查询
  SearchHits<Product> result = template.search(query, Product.class);


  // 3.处理查询结果
  List<Product> content = new ArrayList();
  for (SearchHit<Product> productSearchHit : result) {
    Product product = productSearchHit.getContent();
    content.add(product);
   }


  /**
     * 封装Page对象,参数1:具体数据,参数2:分页条件对象,参数3:总条数
     */
  Page<Product> page = new PageImpl(content, pageable, result.getTotalHits());


  System.out.println(page.getTotalElements());
  System.out.println(page.getTotalPages());
  System.out.println(page.getContent());
}

六、结果排序

java 复制代码
// 结果排序
@Test
public void searchDocumentSort() {
  // 1.构建查询条件
  NativeQuery query = new NativeQueryBuilder()
     .withQuery(Queries.matchAllQueryAsQuery())
     .withSort(Sort.by(Sort.Direction.DESC, "id"))
     .build();
  // 2.查询
  SearchHits<Product> result = template.search(query, Product.class);


  // 3.处理查询结果
  for (SearchHit<Product> productSearchHit : result) {
    Product product = productSearchHit.getContent();
    System.out.println(product);
   }
}
相关推荐
西猫雷婶6 分钟前
python画图|在3D图上画2D直方图(作图平面移动)
开发语言·python·平面
测试界兮兮12 分钟前
Python的调试工具之交互式调试器
开发语言·自动化测试·软件测试·python·功能测试·单元测试·压力测试
coffee_baby27 分钟前
撤销与恢复的奥秘:设计模式之备忘录模式详解
java·设计模式·备忘录模式
明矾java32 分钟前
Redis-分片集群
java·数据库·redis
Daking-42 分钟前
「队列」实现优先队列(priority_queue)的功能 / 手撕数据结构(C++)
开发语言·数据结构·c++
林小果143 分钟前
设计模式总览
java·开发语言·设计模式
gopher95111 小时前
go语言 结构体
开发语言·后端·golang
唤醒手腕1 小时前
2024 年最新前端ES-Module模块化、webpack打包工具详细教程(更新中)
前端·elasticsearch·webpack
阿华的代码王国1 小时前
【JavaEE】线程创建和终止,Thread类方法,变量捕获(7000字长文)
java·java-ee·intellij-idea
武子康1 小时前
大数据-137 - ClickHouse 集群 表引擎详解2 - MergeTree 存储结构 一级索引 跳数索引
java·大数据·sql·clickhouse·flink