1.搭建ES的服务
  • 导入依赖

    1  <dependency>
    2             <groupId>org.springframework.boot</groupId>
    3             <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
    4 </dependency>
  • 配置ES

    ...
    spring:
    application:
      name: hrm-es-service
    data:
      elasticsearch:
        cluster-name: elasticsearch
        cluster-nodes: 127.0.0.1:9300 #9200是图形界面端,9300代码端
        ...
2.创建EmployeeDoc
/**
* 针对于 Employee 表的文档映射
* indexName:索引库
* type:类型(表类型)
*/
@Document(indexName = "hrm" , type = "employee")
public class EmployeeDoc {

  //对应文档的id
  @Id
  private Long id;

  @Field(type = FieldType.Keyword)   //指定为 不分词
  private String userName;

  private int age;

  @Field(type =FieldType.Text,analyzer = "ik_max_word",searchAnalyzer = "ik_max_word")
  private String intr;
  ...
3.创建索引库
@RunWith(SpringRunner.class)
@SpringBootTest(classes = EsServiceApplication2050.class)
public class ESTest {

  @Autowired
  private ElasticsearchTemplate elasticsearchTemplate;

  @Test
  public void testCreateIndex() {
      //创建索引
      elasticsearchTemplate.createIndex(EmployeeDoc.class);
      //做文档映射
      elasticsearchTemplate.putMapping(EmployeeDoc.class);
  }
}
4.定义ElasticsearchRepository
@Repository
public interface EmployeeElasticsearchRepository extends ElasticsearchRepository<EmployeeDoc,Long> {}
5.基本CRUD
@Autowired
  private EmployeeElasticsearchRepository employeeElasticsearchRepository;

  //初始化
  @Test
  public void testCreateIndex() {
      //创建索引
      elasticsearchTemplate.createIndex(EmployeeDoc.class);
      //做文档映射
      elasticsearchTemplate.putMapping(EmployeeDoc.class);
  }
  //添加数据
  @Test
  public void testAdd(){

      //准备数据
      EmployeeDoc employeeDoc = new EmployeeDoc();
      employeeDoc.setAge(18);
      employeeDoc.setUserName("王大锤");
      employeeDoc.setIntr("我爱中国");

      //添加数据到es
      employeeElasticsearchRepository.save(employeeDoc);
  }

  //添加数据
  @Test
  public void testUpdate(){

      //准备数据
      EmployeeDoc employeeDoc = new EmployeeDoc();
      employeeDoc.setId(5L); //有id就是修改
      employeeDoc.setAge(18);
      employeeDoc.setUserName("周伯通");
      employeeDoc.setIntr("深的童子通真传");

      //添加数据到es
      employeeElasticsearchRepository.save(employeeDoc);
  }
  //删除数据
  @Test
  public void testDelete(){
      employeeElasticsearchRepository.deleteById(5L);
  }
  //获取数据
  @Test
  public void testGet(){
      Optional<EmployeeDoc> optional = employeeElasticsearchRepository.findById(5L);
      System.out.println(optional.get());
  }
6.高级查询分页
    //通过索引库,高级查询和分页
   /**
    * 用户名为 隔壁老王
    * age在 10 - 20
    * 按照 id排序降序
    * 分页 每页 2条 取第一页
    */
   @Test
   public void testSearchAndPage() throws Exception{
       //1.创建查询建造器对象
       NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();

       //2.给查询建造器添加查询条件对象
           //1.创建组合查询条件对象
       BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
           //2.添加查询条件:分词查询:username
       List<QueryBuilder> must= boolQuery.must();
       must.add(QueryBuilders.matchQuery("username","周伯通" ));
           //2.添加查询条件:范围查询:age:10到30
       List<QueryBuilder> filter = boolQuery.filter();
       filter.add(QueryBuilders.rangeQuery("age").lte(30).gte(10));
           //3.给查询建造器添加查询条件对象
       queryBuilder.withQuery(boolQuery);

       //3.给查询建造器添加分页对象:从第0页开始,每页2条
       queryBuilder.withPageable(PageRequest.of(0,2 ));

       //4.给查询建造器添加排序
           //1.创建排序对象:id,降序
       FieldSortBuilder sortBuilder = new FieldSortBuilder("id").order(SortOrder.DESC);
           //2.给查询建造器添加排序
       queryBuilder.withSort(sortBuilder);

       //5.创建查询对象
       NativeSearchQuery searchQuery = queryBuilder.build();

       //6.传给search方法,执行高级查询分页排序功能,得到分页对象
       Page<EmployeeDoc> page = employeeElasticsearchRepository.search(searchQuery);

       //7.获取结果
           //获得总条数
       int totalPages = page.getTotalPages();
       System.out.println(totalPages);
           //获得当前页数据
       Iterator<EmployeeDoc> iterator = page.getContent().iterator();
       while (iterator.hasNext()){
           System.out.println(iterator.next());
      }
  }
01-23 17:03