SpringBoot与检索

检索

我们的应用经常需要添加检索功能,开源的ElasticSearch是目前全文搜索引擎的首选。它可以快速的存储、搜索和分析海量数据。SpringBoot通过整合SpringData ElasticSearch为我们提供了非常便捷的检索功能支持

ElasticSearch是一个分布式搜索服务,提供Restful API,底层基于Lucene,采用多shard(分片)的方式保证数据安全,并且提供自动resharding的功能

 

ElasticSearch中索引、类型、文档、属性的关系:

使用ElasticSearch

详情查看官方文档

添加文档

使用PUT请求,给urlhttp://172.17.119.176:9200/megacorp/employee/1添加一条json数据

路径  /megacorp/employee/1  包含了三部分的信息:

  • megacorp:索引名称
  • employee:类型名称
  • 1:特定雇员的ID

检索文档

使用GET请求,发送 http://172.17.119.176:9200/megacorp/employee/1即可检索出相关信息

 

轻量搜索

使用GET请求,发送http://172.17.119.176:9200/megacorp/employee/_search 即可检索出全部信息

高亮搜索

通过特定的参数去搜索,例如查询出last_nameSmith的员工

使用GET请求:http://172.17.119.176:9200/megacorp/employee/_search?q=last_name:Smith

使用查询表达式搜索

通过POST请求,在请求体里面使用表达式搜索

url: http://172.17.119.176:9200/megacorp/employee/_search

复杂搜索

使用filter查询年纪大于30的姓氏为Smith的员工

使用POST请求,url: http://172.17.119.176:9200/megacorp/employee/_search

全文搜索

搜索喜欢攀岩的雇员:

使用POST请求,url: http://172.17.119.176:9200/megacorp/employee/_search

短语搜索

上面搜索的是单个单词的,现在搜索含有某个短语的,只需要把match变成match_phrase

使用POST请求,url: http://172.17.119.176:9200/megacorp/employee/_search

高亮搜索

有的时候希望将搜索出的内容高亮显示,可以使用高亮搜索,只需要加上highlight参数

使用POST请求, url: http://172.17.119.176:9200/megacorp/employee/_search

SpringBoot整合Elasticsearch

创建项目,选中Elasticsearch组件

SpringBoot默认支持两种方式跟ES进行交互

1、Jest(默认不生效)

  (1) 需要导入jest的工具包(JestClient

2、SpringData ElasticSearch

  (1) ElasticSearchTemplate操作es

  (2) 编写一个ElasticsearchRepository的子接口操作es

使用Jest操作es

首先注掉SpringData

<!--<dependency>-->
    <!--<groupId>org.springframework.boot</groupId>-->
    <!--<artifactId>spring-boot-starter-data-elasticsearch</artifactId>-->
<!--</dependency>-->

引入Jest的相关依赖

可以去Maven Repository找到相关依赖

版本根据es相关版本选择,例如这里选择5版本的Jest

导入依赖:

<!-- 导入jest -->
<dependency>
    <groupId>io.searchbox</groupId>
    <artifactId>jest</artifactId>
    <version>5.3.4</version>
</dependency>

配置Jest

如果es在别的机器上,要配置uri

spring:
  elasticsearch:
    jest:
      uris: http://172.17.119.176:9200

使用

首先准备一个javaBean,并标识主键

public class Article {
    @JestId    // 标识主键
    private Integer id;
    private String author;
    private String title;
    private String content;


    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }
}
View Code
索引(添加)一个文档
@Autowired
JestClient jestClient;

@Test
public void contextLoads() throws IOException {
    Article article = new Article(1, "zahngsan", "好消息", "Hello World");

    // 构建一个索引功能
    Index build = new Index.Builder(article).index("jinxin")        // 指定索引
                                            .type("news")           // 指定类型
                                            .build();               // 开始构建
    // 执行
    jestClient.execute(build);
}

索引完成后再浏览器通过 /索引/类型/id 的形式搜索,

http://172.17.119.176:9200/jinxin/news/1,可以看到索引的信息,证明索引成功!

搜索
@Autowired
JestClient jestClient;

@Test
public void search() throws IOException {
    String json = "{\n" +
            "    \"query\" : {\n" +
            "        \"match\" : {\n" +
            "            \"content\" : \"Hello\"\n" +
            "        }\n" +
            "    }\n" +
            "}";

    // 构建搜索
    Search search = new Search.Builder(json).addIndex("jinxin")         // 添加索引
                                            .addType("news")            // 添加类型
                                            .build();                   // 构建

    // 执行
    SearchResult result = jestClient.execute(search);
    // 打印结果
    System.out.println(result.getJsonString());
}

使用SpringData Elasticsearch

导入依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>

配置

application.yaml中配置节点

其中cluseter-name9200端口返回的数据指定

cluseter-nodes填写主机IP + 9300端口即可

spring:
  elasticsearch:
    jest:
      uris: http://172.17.119.176:9200
  data:
    elasticsearch:
      cluster-name: elasticsearch
      cluster-nodes: 172.17.119.176:9300

使用

SpringData提供了两种方式去操作es,一种是使用ElasticsearchTemplate操作,一个使用ElasticsearchRepository的子接口操作es

实现ElasticsearchRepository

首先创建一个JavaBean,并指定索引跟类型

@Document(indexName = "jinxin", type = "books")   // 指定索引跟类型
public class Book {
    private Integer id;
    private String bookName;
    private String author;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getBookName() {
        return bookName;
    }

    public void setBookName(String bookName) {
        this.bookName = bookName;
    }

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

    @Override
    public String toString() {
        return "Book{" +
                "id=" + id +
                ", bookName='" + bookName + '\'' +
                ", author='" + author + '\'' +
                '}';
    }
}
View Code

然后定义一个接口继承ElasticsearchRepository,里面要填写两个泛型,一个是JavaBean,一个是主键的类型

public interface BookRepository extends ElasticsearchRepository<Book, Integer> {
}

之后就可以测试使用了

@Autowired
BookRepository bookRepository;

@Test
public void dataes(){
    Book book = new Book();
    book.setId(1);
    book.setBookName("java");
    book.setAuthor("jojo");
    bookRepository.index(book);
}

 

posted @ 2018-09-20 09:12  Jin同学  阅读(776)  评论(0编辑  收藏  举报