四、Springboot2.0.5整合Spring data elasticSearch3.0.10

  本文作者使用的Springboot版本为2.0.6.RELEASE,spring-data-elasticsearch版本为3.0.11.RELEASE,其中elasticsearch版本为6.2.2。其他版本的可能不具有参考价值。

(一)依赖

		
			org.springframework.boot
			spring-boot-starter-data-elasticsearch
		

(二)待索引实体对象

备注:若elasticsearch中已经存在mysql中导入的数据,那么,这里在新建索引实体对象时,@Document(indexName = "book", type = "it")必须和elasticsearch中的的indextype对应上,否则下面在初始化BookElasticsearchRepository时会报错!!!

/**
 * ElasticSearch索引对象必须标注@Document注解,indexName为索引名,type为索引类型(PS:这是
 * ElasticSearch特性,同样的索引,可以分为不同的类型,来分别做索引)
 */
@Document(indexName = "book", type = "it")
public class Book implements Serializable {
    /**
     * 坑一:这里的id主键必须为String类型,且必须加@Id注解,否则创建索引时,无法将主键转换成
     *     索引id,这样索引id就是null
     * @Id是org.springframework.data.annotation.Id
     */
    @Id
    private String id;
    private String name;
    private Float price;
    private Date publishDate;
}

(三)改造启动类,开启Elasticsearch

/**
 * Spring Data系列之Elasticsearch(Redis、Monogdb等被springdata集成的数据库都差不多):
 * 开启Elasticsearch
 *     在启动类上加上“@Enable数据库Repositories”,这里就是@EnableElasticsearchRepositories
 * 		basePackages指向elasticsearch仓储类所在的包
 */
@SpringBootApplication
@EnableElasticsearchRepositories(basePackages = "org.pc.repository")
public class ElasticsearchApplication {

	public static void main(String[] args) {
		SpringApplication.run(ElasticsearchApplication.class, args);
	}
}

(四)配置elasticsearch

#elasticsearch
spring:
  data:
    elasticsearch:
      #集群名
      cluster-name: spring-boot
      #注意java的es默认连接端口是9300,9200是http端口,这两个在使用中应注意区分
      cluster-nodes: 192.168.10.130:9300

(五)自定义elasticsearch仓储类

@Repository("bookRepository")
public class BookElasticsearchRepository extends AbstractElasticsearchRepository<Book, String> {
    /**
     *     当AbstractElasticsearchRepository提供的方法不足以完成全部功能时,即可通过该对象自定义
     * 操作行为。
     */
    private ElasticsearchOperations elasticsearchOperations;
    /**
     * 注入ElasticsearchOperations,并实例化BookElasticsearchRepository
     * 这里注入ElasticsearchOperations对象就是在application.yml中配置的参数自动装载的对象
     *
     * 坑二:必须super(createElasticsearchEntityInformation(), elasticsearchOperations),否则
     * 会报错
     */
    @Autowired
    public BookElasticsearchRepository(ElasticsearchOperations elasticsearchOperations){
        super(createElasticsearchEntityInformation(), elasticsearchOperations);
        this.elasticsearchOperations = elasticsearchOperations;
    }

    /**
     * 创建ElasticsearchEntityInformation对象,该对象实现对索引对象相关信息的读取
     */
    private static ElasticsearchEntityInformation<Book,String> createElasticsearchEntityInformation() {
        TypeInformation<Book> typeInformation = ClassTypeInformation.from(Book.class);

        ElasticsearchPersistentEntity<Book> entity = new SimpleElasticsearchPersistentEntity<Book>(typeInformation);

        return new MappingElasticsearchEntityInformation<>(entity);
    }

    /**
     * id的展示方式
     * @param aLong id
     */
    @Override
    protected String stringIdRepresentation(String aLong) {
        return aLong;
    }
}

(六)使用elasticsearch仓储类,实现索引的增删改查

@RestController
public class BookController {
    /**
     * 备注:因为这里是PagingAndSortingRepository抽象类,所有类型的数据仓库都会继承这个类,所以
     *       为了避免数据源切换时,无法识别出哪一个数据源,这里可以根据数据仓库的name来进行鉴别,
     *       改造@Repository("bookRepository")加上name,通过@Resource配合识别数据仓库。
     */
    @Resource
    private PagingAndSortingRepository bookRepository;
    @GetMapping("/book/{id}")
    public Book getBookById(@PathVariable String id){
        Optional bookOptional = bookRepository.findById(id);
        return return bookOptional.orElse(null);;
    }

    @PostMapping("/book")
    public Book addBook(@RequestBody Book book){
        book.setPublishDate(new Date(System.currentTimeMillis()));
        return bookRepository.save(book);
    }
}

你可能感兴趣的:(ElasticSearch)