• 首页

  • 文章归档

  • 隔壁朋友

  • 关于博主
H B L A O
H B L A O

hblao

获取中...

03
15
java

springboot整合elasticsearch

发表于 2021-03-15 • elasticsearch • 被 8 人看爆

记录一下最入门的例子。

一:安装elasticsearch。
在本地安装elasticsearch。安装完成后启动,brew services start ElasticSearch就可以了。然后访问http://localhost:9200/,出现一个json串的界面就OK了。9200是http的端口,9300是给java用户的端口。
如果是linux,看看这篇http://blog.csdn.net/cwenao/article/details/54943505,包括修改cluster.name和network.host的作用。如果不修改cluster.name那么系统是有默认的值,在第三步设置application.yml时可以看到。如果是配置远程elasticsearch集群,则设置cluster.nodes为远程的地址。
这里我们什么都不改,默认就是本机。

二:新建spring boot的elasticsearch项目。
用idea新建,勾选web和nosql里的elasticsearch选项,等待创建完成即可。
起初我用spring boot1.5.3创建的,运行时死活报一个类找不到,后改用最新的2.0.0创建的就好了。


4.0.0

<groupId>com.example</groupId>
<artifactId>testelasticaearch</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>

<name>testelasticaearch</name>
<description>Demo project for Spring Boot</description>

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.0.M1</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <java.version>1.8</java.version>
</properties>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>net.java.dev.jna</groupId>
        <artifactId>jna</artifactId>
        <version>3.0.9</version>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

<repositories>
    <repository>
        <id>spring-snapshots</id>
        <name>Spring Snapshots</name>
        <url>https://repo.spring.io/snapshot</url>
        <snapshots>
            <enabled>true</enabled>
        </snapshots>
    </repository>
    <repository>
        <id>spring-milestones</id>
        <name>Spring Milestones</name>
        <url>https://repo.spring.io/milestone</url>
        <snapshots>
            <enabled>false</enabled>
        </snapshots>
    </repository>
</repositories>

<pluginRepositories>
    <pluginRepository>
        <id>spring-snapshots</id>
        <name>Spring Snapshots</name>
        <url>https://repo.spring.io/snapshot</url>
        <snapshots>
            <enabled>true</enabled>
        </snapshots>
    </pluginRepository>
    <pluginRepository>
        <id>spring-milestones</id>
        <name>Spring Milestones</name>
        <url>https://repo.spring.io/milestone</url>
        <snapshots>
            <enabled>false</enabled>
        </snapshots>
    </pluginRepository>
</pluginRepositories>

除了net.java.dev.jna那个是新加的,别的都是项目勾选elasticsearch后自动创建的,新加的这个依赖是因为启动后也是报类不存在,后来在网上找个jna依赖加上后就好了。

三:配置yml文件。
spring:
data:
elasticsearch:
#cluster-name: #默认为elasticsearch
#cluster-nodes: 127.0.0.1: #配置es节点信息,逗号分隔,如果没有指定,则启动ClientNode
properties:
path:
logs: ./elasticsearch/log #elasticsearch日志存储目录
data: ./elasticsearch/data #elasticsearch数据存储目录

四:创建javaBean文件。
我直接用http://www.tianshouzhi.com/api/tutorials/springboot/101这篇文章里的类。
把Author类和Tutorial类复制过来,还有Article类。简单说一下Article类。

package com.example.demo.pojo;

import org.springframework.data.elasticsearch.annotations.Document;

import java.io.Serializable;
import java.util.Date;

/**

  • Created by admin on 17/6/1.
    */
    @Document(indexName="projectname",type="article",indexStoreType="fs",shards=5,replicas=1,refreshInterval="-1")
    public class Article implements Serializable {
    @Id
    private Long id;
    /*标题/
    private String title;
    /*摘要/
    private String abstracts;
    /*内容/
    private String content;
    /*发表时间/
    private Date postTime;
    /*点击率/
    private Long clickCount;
    /*作者/
    private Author author;
    /*所属教程/
    private Tutorial tutorial;

    public Long getId() {
    return id;
    }

    public void setId(Long id)

    public String getTitle() {
    return title;
    }

    public void setTitle(String title)

    public String getAbstracts() {
    return abstracts;
    }

    public void setAbstracts(String abstracts)

    public String getContent() {
    return content;
    }

    public void setContent(String content)

    public Date getPostTime() {
    return postTime;
    }

    public void setPostTime(Date postTime)

    public Long getClickCount() {
    return clickCount;
    }

    public void setClickCount(Long clickCount)

    public Author getAuthor() {
    return author;
    }

    public void setAuthor(Author author)

    public Tutorial getTutorial() {
    return tutorial;
    }

    public void setTutorial(Tutorial tutorial)

    @Override
    public String toString() {
    return "Article{" +
    "id=" + id +
    ", title='" + title + ''' +
    ", abstracts='" + abstracts + ''' +
    ", content='" + content + ''' +
    ", postTime=" + postTime +
    ", clickCount=" + clickCount +
    ", author=" + author +
    ", tutorial=" + tutorial +
    '}';
    }
    }

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

@Persistent
@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target(
)
public @interface Document {

String indexName();//索引库的名称,个人建议以项目的名称命名

String type() default "";//类型,个人建议以实体的名称命名

short shards() default 5;//默认分区数

short replicas() default 1;//每个分区默认的备份数

String refreshInterval() default "1s";//刷新间隔

String indexStoreType() default "fs";//索引文件存储类型
}

加上了@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;
}

五:dao和controller
Dao:

public interface ArticleSearchRepository extends ElasticsearchRepository<Article, Long> {
}
1
2
controller:

package com.example.demo;

import com.example.demo.pojo.Article;
import com.example.demo.pojo.Author;
import com.example.demo.pojo.Tutorial;
import com.example.demo.repository.ArticleSearchRepository;
import org.elasticsearch.index.query.QueryStringQueryBuilder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.Date;
import java.util.Iterator;

/**

  • Created by admin on 17/6/1.
    */
    @RestController
    public class TestController {
    @Autowired
    private ArticleSearchRepository articleSearchRepository;

    @RequestMapping("/add")
    public void testSaveArticleIndex() {
    Author author = new Author();
    author.setId(1L);
    author.setName("tianshouzhi");
    author.setRemark("java developer");

     Tutorial tutorial = new Tutorial();
     tutorial.setId(1L);
     tutorial.setName("elastic search");
    
     Article article = new Article();
     article.setId(1L);
     article.setTitle("springboot integreate elasticsearch");
     article.setAbstracts("springboot integreate elasticsearch is very easy");
     article.setTutorial(tutorial);
     article.setAuthor(author);
     article.setContent("elasticsearch based on lucene,"
             + "spring-data-elastichsearch based on elaticsearch"
             + ",this tutorial tell you how to integrete springboot with spring-data-elasticsearch");
     article.setPostTime(new Date());
     article.setClickCount(1L);
    
     articleSearchRepository.save(article);
    

    }

    @RequestMapping("/query")
    public void testSearch() {
    String queryString = "springboot";//搜索关键字
    QueryStringQueryBuilder builder = new QueryStringQueryBuilder(queryString);
    Iterable

    searchResult = articleSearchRepository.search(builder);
    Iterator
    iterator = searchResult.iterator();
    while (iterator.hasNext()) {
    System.out.println(iterator.next());
    }
    }
    }

启动项目,先执行add,往elasticsearch添加一条数据,然后再访问query即可看到结果了。
其实非常类似于普通的DB查询,还支持很多条件查询,findAll,findTop之类的,就是JPA那一套可以直接用,因为继承的ElasticsearchRepository本身就是一个PagingAndSortingRepository。

原文链接:https://blog.csdn.net/tianyaleixiaowu/article/details/72833940

分享到:
Redis 线程模型
Java设计模式-工厂模式
  • 文章目录
  • 站点概览
hblao

Hihblao

QQ Email RSS
看爆 Top5
  • 设计一个高并发的高可用系统 434次看爆
  • MySQL 常用优化指南 224次看爆
  • Spring AOP 207次看爆
  • 人到中年 188次看爆
  • RedisTemplate常用使用说明 170次看爆

Copyright © 2022 hblao · 京ICP备16001163号

Proudly published with Halo · Theme by fyang · 站点地图 · 百度统计