zoukankan      html  css  js  c++  java
  • 【SpringBoot整合Elasticsearch】SpringBoot整合ElasticSearch

    一、Linux下安装ElasticSearch

    1、检测是否安装了Elasticsearch

    1 ps aux |grep elasticsearch

    2、安装JDK

    3、下载Elasticsearch

    1 wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.0.0.tar.gz

    解压Elasticsearch

    tar -zxvf elasticsearch-6.0.0.tar.gz

    移动Elasticsearch到/usr/local/elasticsearch

    1 mv elasticsearch-6.0.0 /usr/local/elasticsearch

    4、修改配置文件

    进入/usr/local/elasticsearch/config目录,使用vi编辑器

    1 vi elasticsearch.yml
    1 network.host: 192.168.181.201
    2 discovery.zen.ping.unicast.hosts: ["192.168.181.201"]

    修改/etc/sysctl.conf否则会出现

    max virutal memory areas vm.max_map_count [65530] is too low, increase to at least [262144]

    vm.max_map_count=262144

    退出保存后执行如下命令:

    1 sysctl -p

    使用vi编辑器,修改/etc/security/limits.conf文件,在文件末尾添加如下代码,否则会出现

    max number of threads [3750] for user [xxx] is too low, increase to at least [4096]

    1 # sanglp为登录服务器的用户名
    2 
    3 sanglp soft nofile 65536
    4 sanglp hard nofile 65536
    5 sanglp soft nproc  4096
    6 sanglp hard nproc  4096

    切记退出重新登录。

    5、启动Elasticsearch

    进入/usr/local/elasticsearch目录之中,输入以下命令,开始Elasticsearch服务:

    1 ./bin/elasticsearch

    测试:

    二、新建spring boot的elasticsearch项目

     在start.spring.io中新建springboot项目,并导入到intellij中

    pom.xml

      1 <?xml version="1.0" encoding="UTF-8"?>
      2 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      3     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
      4     <modelVersion>4.0.0</modelVersion>
      5 
      6     <groupId>com.slp</groupId>
      7     <artifactId>springboot-elasticsearch</artifactId>
      8     <version>0.0.1-SNAPSHOT</version>
      9     <packaging>jar</packaging>
     10 
     11     <name>springboot-elasticsearch</name>
     12     <description>Demo project for Spring Boot</description>
     13 
     14     <parent>
     15         <groupId>org.springframework.boot</groupId>
     16         <artifactId>spring-boot-starter-parent</artifactId>
     17         <version>2.1.0.BUILD-SNAPSHOT</version>
     18         <relativePath/> <!-- lookup parent from repository -->
     19     </parent>
     20 
     21     <properties>
     22         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
     23         <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
     24         <java.version>1.8</java.version>
     25     </properties>
     26 
     27     <dependencies>
     28         <!--添加web的应用依赖-->
     29         <dependency>
     30             <groupId>org.springframework.boot</groupId>
     31             <artifactId>spring-boot-starter-web</artifactId>
     32         </dependency>
     33         <!--添加spring-data-elasticsearch的依赖-->
     34         <dependency>
     35             <groupId>org.springframework.boot</groupId>
     36             <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
     37         </dependency>
     38 
     39         <dependency>
     40             <groupId>org.springframework.boot</groupId>
     41             <artifactId>spring-boot-starter-test</artifactId>
     42             <scope>test</scope>
     43         </dependency>
     44 
     45         <dependency>
     46             <groupId>net.java.dev.jna</groupId>
     47             <artifactId>jna</artifactId>
     48             <version>3.0.9</version>
     49         </dependency>
     50     </dependencies>
     51 
     52     <build>
     53         <plugins>
     54             <plugin>
     55                 <groupId>org.springframework.boot</groupId>
     56                 <artifactId>spring-boot-maven-plugin</artifactId>
     57             </plugin>
     58         </plugins>
     59     </build>
     60 
     61     <repositories>
     62         <repository>
     63             <id>spring-snapshots</id>
     64             <name>Spring Snapshots</name>
     65             <url>https://repo.spring.io/snapshot</url>
     66             <snapshots>
     67                 <enabled>true</enabled>
     68             </snapshots>
     69         </repository>
     70         <repository>
     71             <id>spring-milestones</id>
     72             <name>Spring Milestones</name>
     73             <url>https://repo.spring.io/milestone</url>
     74             <snapshots>
     75                 <enabled>false</enabled>
     76             </snapshots>
     77         </repository>
     78     </repositories>
     79 
     80     <pluginRepositories>
     81         <pluginRepository>
     82             <id>spring-snapshots</id>
     83             <name>Spring Snapshots</name>
     84             <url>https://repo.spring.io/snapshot</url>
     85             <snapshots>
     86                 <enabled>true</enabled>
     87             </snapshots>
     88         </pluginRepository>
     89         <pluginRepository>
     90             <id>spring-milestones</id>
     91             <name>Spring Milestones</name>
     92             <url>https://repo.spring.io/milestone</url>
     93             <snapshots>
     94                 <enabled>false</enabled>
     95             </snapshots>
     96         </pluginRepository>
     97     </pluginRepositories>
     98 
     99 
    100 </project>

    application.yml

    1 spring:
    2    data:
    3         elasticsearch:
    4             cluster-name:  elasticsearch #默认为elasticsearch
    5             cluster-nodes: 192.168.181.201:9300 #配置es节点信息,逗号分隔,如果没有指定,则启动ClientNode
    6             properties:
    7                 path:
    8                   logs: ./elasticsearch/log #elasticsearch日志存储目录
    9                   data: ./elasticsearch/data #elasticsearch数据存储目录

    Article.java

      1 package com.slp.springbootelasticsearch.pojo;
      2 
      3 import org.springframework.data.elasticsearch.annotations.Document;
      4 
      5 import java.io.Serializable;
      6 
      7 /**
      8  * @author sanglp
      9  * @create 2018-07-04 9:06
     10  * @desc 文章实体类,默认情况下添加@Document注解会对实体中的所有属性建立索引,
     11  **/
     12 @Document(indexName = "projectname",type = "article",indexStoreType = "fs",shards = 5,replicas = 1,refreshInterval = "-1")
     13 public class Article implements Serializable {
     14 
     15     private Long id;
     16     /**
     17      * 标题
     18      */
     19     private String title;
     20     /**
     21      * 摘要
     22      */
     23     private String abstracts;
     24     /**
     25      * 内容
     26      */
     27     private String content;
     28     /**
     29      * 发表时间
     30      */
     31     private String postTime;
     32     /**
     33      * 点击率
     34      */
     35     private String clickCount;
     36     /**
     37      * 作者
     38      */
     39     private Author author;
     40     /**
     41      * 所属教程
     42      */
     43     private Tutorial tutorial;
     44 
     45     public Long getId() {
     46         return id;
     47     }
     48 
     49     public void setId(Long id) {
     50         this.id = id;
     51     }
     52 
     53     public String getTitle() {
     54         return title;
     55     }
     56 
     57     public void setTitle(String title) {
     58         this.title = title;
     59     }
     60 
     61     public String getContent() {
     62         return content;
     63     }
     64 
     65     public void setContent(String content) {
     66         this.content = content;
     67     }
     68 
     69     public String getPostTime() {
     70         return postTime;
     71     }
     72 
     73     public void setPostTime(String postTime) {
     74         this.postTime = postTime;
     75     }
     76 
     77     public String getClickCount() {
     78         return clickCount;
     79     }
     80 
     81     public void setClickCount(String clickCount) {
     82         this.clickCount = clickCount;
     83     }
     84 
     85     public Author getAuthor() {
     86         return author;
     87     }
     88 
     89     public void setAuthor(Author author) {
     90         this.author = author;
     91     }
     92 
     93     public Tutorial getTutorial() {
     94         return tutorial;
     95     }
     96 
     97     public void setTutorial(Tutorial tutorial) {
     98         this.tutorial = tutorial;
     99     }
    100 
    101     public String getAbstracts() {
    102         return abstracts;
    103     }
    104 
    105     public void setAbstracts(String abstracts) {
    106         this.abstracts = abstracts;
    107     }
    108 }

    Author.java

     1 package com.slp.springbootelasticsearch.pojo;
     2 
     3 import java.io.Serializable;
     4 
     5 /**
     6  * @author sanglp
     7  * @create 2018-07-04 9:04
     8  * @desc 作者实体类
     9  **/
    10 public class Author  implements Serializable{
    11     /**
    12      * 作者ID
    13      */
    14     private Long id;
    15     /**
    16      * 作者姓名
    17      */
    18     private String name;
    19     /**
    20      * 作者简介
    21      */
    22     private String remark;
    23 
    24     public Long getId() {
    25         return id;
    26     }
    27 
    28     public void setId(Long id) {
    29         this.id = id;
    30     }
    31 
    32     public String getName() {
    33         return name;
    34     }
    35 
    36     public void setName(String name) {
    37         this.name = name;
    38     }
    39 
    40     public String getRemark() {
    41         return remark;
    42     }
    43 
    44     public void setRemark(String remark) {
    45         this.remark = remark;
    46     }
    47 }

    Tutorial.java

     1 package com.slp.springbootelasticsearch.pojo;
     2 
     3 import java.io.Serializable;
     4 
     5 /**
     6  * @author sanglp
     7  * @create 2018-07-04 9:03
     8  * @desc 实体类
     9  **/
    10 public class Tutorial implements Serializable {
    11     private Long id;
    12     //教程名称
    13     private String name ;
    14 
    15     public Long getId() {
    16         return id;
    17     }
    18 
    19     public void setId(Long id) {
    20         this.id = id;
    21     }
    22 
    23     public String getName() {
    24         return name;
    25     }
    26 
    27     public void setName(String name) {
    28         this.name = name;
    29     }
    30 }

    @Document注解里面的几个属性,类比mysql的话是这样: 
    index –> DB 
    type –> Table 
    Document –> row 
    @Id注解加上后,在Elasticsearch里相应于该列就是主键了,在查询时就可以直接用主键查询,后面再看。其实和mysql非常类似,基本就是一个数据库。

     1 @Persistent
     2 @Inherited
     3 @Retention(RetentionPolicy.RUNTIME)
     4 @Target({ElementType.TYPE})
     5 public @interface Document {
     6 
     7 String indexName();//索引库的名称,个人建议以项目的名称命名
     8 
     9 String type() default "";//类型,个人建议以实体的名称命名
    10 
    11 short shards() default 5;//默认分区数
    12 
    13 short replicas() default 1;//每个分区默认的备份数
    14 
    15 String refreshInterval() default "1s";//刷新间隔
    16 
    17 String indexStoreType() default "fs";//索引文件存储类型
    18 }

    加上了@Document注解之后,默认情况下这个实体中所有的属性都会被建立索引、并且分词。 
    我们通过@Field注解来进行详细的指定,如果没有特殊需求,那么只需要添加@Document即可。

    @Field注解的定义如下:
    
    @Retention(RetentionPolicy.RUNTIME)
    @Target(ElementType.FIELD)
    @Documented
    @Inherited
    public @interface Field {
    
    FieldType type() default FieldType.Auto;#自动检测属性的类型
    
    FieldIndex index() default FieldIndex.analyzed;#默认情况下分词
    
    DateFormat format() default DateFormat.none;
    
    String pattern() default "";
    
    boolean store() default false;#默认情况下不存储原文
    
    String searchAnalyzer() default "";#指定字段搜索时使用的分词器
    
    String indexAnalyzer() default "";#指定字段建立索引时指定的分词器
    
    String[] ignoreFields() default {};#如果某个字段需要被忽略
    
    boolean includeInParent() default false;
    }

    ArticleSearchRepository.java相当于dao

     1 package com.slp.springbootelasticsearch.repository;
     2 
     3 import com.slp.springbootelasticsearch.pojo.Article;
     4 import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
     5 
     6 /**
     7  * @author sanglp
     8  * @create 2018-07-04 9:27
     9  * @desc 文章reposiroty  泛型的参数分别是实体类型和主键类型
    10  **/
    11 public interface ArticleSearchRepository extends ElasticsearchRepository<Article,Long> {
    12 
    13 }

    测试用例

    package com.slp.springbootelasticsearch;
    
    import com.slp.springbootelasticsearch.pojo.Article;
    import com.slp.springbootelasticsearch.pojo.Author;
    import com.slp.springbootelasticsearch.pojo.Tutorial;
    import com.slp.springbootelasticsearch.repository.ArticleSearchRepository;
    import org.elasticsearch.index.query.QueryStringQueryBuilder;
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.context.SpringBootTest;
    import org.springframework.test.context.junit4.SpringRunner;
    
    import java.util.Iterator;
    
    @RunWith(SpringRunner.class)
    @SpringBootTest
    public class SpringbootElasticsearchApplicationTests {
    
        @Test
        public void contextLoads() {
        }
        @Autowired
        private ArticleSearchRepository articleSearchRepository;
        @Test
        public void testSaveArticleIndex(){
            Author author = new Author();
            author.setId(1L);
            author.setName("slp");
            author.setRemark("test");
    
            Tutorial tutorial = new Tutorial();
            tutorial.setId(1L);
            tutorial.setName("elastic search");
    
            Article article = new Article();
            article.setId(1L);
            article.setTitle("spring boot integrate elasticsearch");
            article.setAbstracts("elasticsearch is very easy");
            article.setTutorial(tutorial);
            article.setAuthor(author);
            article.setContent("elasticsearch based on lucene");
            article.setPostTime("20180704");
            article.setClickCount("1");
            articleSearchRepository.save(article);
    
        }
    
        @Test
        public void testSearch(){
            String queryString="spring";//搜索关键字
            QueryStringQueryBuilder builder=new QueryStringQueryBuilder(queryString);
            Iterable<Article> searchResult = articleSearchRepository.search(builder);
            Iterator<Article> iterator = searchResult.iterator();
            while(iterator.hasNext()){
                System.out.println(iterator.next().getAbstracts());
            }
        }
    }

    问题:

    1、Exception in thread "main" org.elasticsearch.client.transport.NoNodeAvailableException: None of the configured nodes are available:

    先直接访问,并查看是否是配置有误,切记要关闭防火墙!!!

    
    
  • 相关阅读:
    我的SICP习题解答-chapter 1
    redis主从复制实验,使用ruby
    python连接redis
    ruby连接redis
    python中的classmethod和staticmethod有什么不同[转载]
    安装配置rails环境
    试用memcached高可用repcached
    试用memcached
    Python一个很好玩的特性decorator
    mybatis随笔四之MapperProxy
  • 原文地址:https://www.cnblogs.com/dream-to-pku/p/9259934.html
Copyright © 2011-2022 走看看