SpringBoot - ElasticSearch

作者: BzCoder | 来源:发表于2018-06-07 02:22 被阅读35次

    1.什么是ElasticSearch

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

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

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

    2.部属ElasticSearch

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

    • docker pull elasticsearch 安装elasticsearch。
    • docker run -e ES_JAVA_OPTS="-Xms256m -Xmx256m" -d -p 9200:9200 -p 9300:9300 --name mysearch 671bb2d7da44这里额外的参数要注意下,ES_JAVA_OPTS="-Xms256m -Xmx256m 为申请内存的大小,9200为服务访问端口,9300为在分布式情况下节点间通讯的接口。
    • 此时我们访问本地的9200端口返回以下数据就说明部署成功。


      访问9200端口

    3.ElasticSearch入门教程

    一切请参考ElasticSearch官方文档

    4.SpringBoot与ElasticSearch

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

    • Jest,基于HTTP的。
    • SpringData操作,基于TCP。

    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

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

    相关文章

      网友评论

        本文标题:SpringBoot - ElasticSearch

        本文链接:https://www.haomeiwen.com/subject/ifcmsftx.html