从零开始学习SpringBoot

SpringBoot - ElasticSearch

2018-06-07  本文已影响35人  BzCoder

1.什么是ElasticSearch

ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。

我们建立一个网站或应用程序,并要添加搜索功能,但是想要完成搜索工作的创建是非常困难的。我们希望搜索解决方案要运行速度快,我们希望能有一个零配置和一个完全免费的搜索模式,我们希望能够简单地使用JSON通过HTTP来索引数据,我们希望我们的搜索服务器始终可用,我们希望能够从一台开始并扩展到数百台,我们要实时搜索,我们要简单的多租户,我们希望建立一个云的解决方案。因此我们利用Elasticsearch来解决所有这些问题及可能出现的更多其它问题。

ElasticSearch对事物的处理能力差,但是对数据检索的能力很强。

2.部属ElasticSearch

继续祭出我们的神奇的Docker。

3.ElasticSearch入门教程

一切请参考ElasticSearch官方文档

4.SpringBoot与ElasticSearch

首先依旧查看SpringBoot中有关于ElasticSearch的自动配置类。
我们发现在两个方法可以操作ElasticSearch:

a.Jest

  1. 首先添加Maven
<!-- https://mvnrepository.com/artifact/io.searchbox/jest -->
<dependency>
    <groupId>io.searchbox</groupId>
    <artifactId>jest</artifactId>
    <version>5.3.3</version>
</dependency>
  1. 配置文件,记得加上http://,使用的是9200端口
spring:
  elasticsearch:
    jest:
      uris: http://192.168.15.128:9200
  1. 配置测试Bean文件,需要添加@JestID声明主键
ublic class UserBean {

    @JestId
    int id;
    String name;
    int age;
    String password;

    public UserBean(int id, String name, int age, String password) {
        this.id = id;
        this.name = name;
        this.age = age;
        this.password = password;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }
 ....
}
  1. 测试文件
@RunWith(SpringRunner.class)
@SpringBootTest
public class ElasticApplicationTests {
    @Autowired
    JestClient jestClient;

    @Test
    public void save() {
        UserBean userBean = new UserBean(1, "baozhou", 27, "123456");
        //构建一个索引功能
        Index build = new Index.Builder(userBean).index("indexname").type("users").build();
        try {
            //执行
            jestClient.execute(build);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Test
    public void search() {
        String queryJson = "{\n" +
                "    \"query\" : {\n" +
                "        \"match\" : {\n" +
                "            \"name\" : \"baozhou\"\n" +
                "        }\n" +
                "    }\n" +
                "}";
        //构建一个搜索
        Search build = new Search.Builder(queryJson).addIndex("indexname").addType("users").build();
        try {
            //执行
            SearchResult result =jestClient.execute(build);
            System.out.println(result.getJsonString());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    }

b.SpringData

使用SpringData非常曲折,在SpringBoot2.x里折腾了半天也没有调通,最后使用了SpringBoot 1.x
首先一点需要注意的是SpringData于ElasticSearch是有版本对应规则的,详情对应参考https://github.com/spring-projects/spring-data-elasticsearch

在SpringData下也有两种工具可以操作Elasticsearch,他们分别为ElasticsearchRepository,ElasticsearchTemplate。有关于他们的使用方法可以参考SpringData官方文档,当然接下来也要演示一下使用方法。

1. ElasticsearchRepository

  1. 配置文件
spring:
  data:
    elasticsearch:
      cluster-nodes: 192.168.15.128:9301
      cluster-name: elasticsearch
  1. Bean文件,注意添加标注,说明添加的索引以及类型。
@Document(indexName = "test", type = "book")
public class TestBean {
    Integer id;
    String name;
    String author;

    public TestBean(Integer id, String name, String author) {
        https://github.com/spring-projects/spring-data-elasticsearch
        this.id = id;
        this.name = name;
        this.author = author;
    }
....
}

3.定义Repository文件。假如只是需要基础功能,那么只需要继承Repository即可。要增加功能,只需要像官方文档中的示例按名称申明接口即可(并不需要去实现)。

// 基础功能
public interface ElasticsearchRepository<T, ID extends Serializable> extends ElasticsearchCrudRepository<T, ID> {
    <S extends T> S index(S var1);

    Iterable<T> search(QueryBuilder var1);

    Page<T> search(QueryBuilder var1, Pageable var2);

    Page<T> search(SearchQuery var1);

    Page<T> searchSimilar(T var1, String[] var2, Pageable var3);

    void refresh();

    Class<T> getEntityClass();
}
// 自定义语句
  public interface BookRepository extends Repository<Book, String> {

        List<Book> findByNameAndPrice(String name, Integer price);

        List<Book> findByNameOrPrice(String name, Integer price);
        
        Page<Book> findByName(String name,Pageable page);

        Page<Book> findByNameNot(String name,Pageable page);

        Page<Book> findByPriceBetween(int price,Pageable page);

        Page<Book> findByNameLike(String name,Pageable page);

        @Query("{\"bool\" : {\"must\" : {\"term\" : {\"message\" : \"?0\"}}}}")
        Page<Book> findByMessage(String message, Pageable pageable);
    }

4.操作存储一个数据。

    @Autowired
    TestRepository testRepository;

    @Test
    public void contextLoads() {
        testRepository.index(new TestBean(1,"baozhou","zuozhe"));
    }

2. ElasticsearchTemplate

暂时留空,以后用到回来填坑。

上一篇 下一篇

猜你喜欢

热点阅读