博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
springboot与检索(elasticsearch)
阅读量:4164 次
发布时间:2019-05-26

本文共 7547 字,大约阅读时间需要 25 分钟。

springboot与检索(elasticsearch)

一、检索

Elasticsearch是一个分布式搜索服务,提供Restful API,底层基于Lucene,采用多shard(分片)的方式保证数据安全,并且提供自动resharding的功能,github等大型的站点也是采用了ElasticSearch作为其搜索服务,

  • 在docker中安装 启动elasticsearch 容器

启动 elasticsearch容器:

# 拉取镜像# docker pull elasticsearch:2.4.0# 启动 elasticsearch 容器# docker run -e ES_JAVA_OPTS="-Xms256m -Xmx256m" -di -p 9200:9200 -p 9300:9300 --name es01 elasticsearch:2.4.0

若开启了防火墙,记得开放 9200 和 9300 端口

查看已经开放的端口# firewall-cmd --list-ports    开启端口# firewall-cmd --zone=public --add-port=80/tcp --permanent      # –zone #作用域# –add-port=80/tcp #添加端口,格式为:端口/通讯协议# –permanent #永久生效,没有此参数重启后失效    重启firewall  # firewall-cmd --reload

启动容器后:在浏览器中输入 elasticsearch 安装的容器所在的服务器的 ip:9200

  • elasticsearch 通过restful api 的方式来操作:

    将HTTP命令由puT改为GET可以用来检索文档,同样的,可以使用DELETE命令来删除文档,以及使用HEAD指令来检查文档是否存在。如果想更新已存在的文档,只需再次PUT。

    例:

    PUT ip:9200/megacorp/employee/1

    {
    "username":"superzheng", "password":"密码"}

    GET ip:9200/megacorp/employee/1

    或者搜索:

    GET ip:9200/megacorp/employee/_search?q=last_name:Smith

    通过json数据体搜索:

    POST ip:9200/megacorp/employee/_search

    # match 为模糊匹配 last_name 为字段  Smith为匹配值# 将 match 改为 match_phrase 为完全匹配{
    "query":{
    "match":{
    "last_name":"Smith" } }}

    通过json数据体高级搜索:

    POST ip:9200/megacorp/employee/_search

    # 匹配 姓名为 smith 的并且年龄必须大于 30 的{
    "query":{
    "bool":{
    "must":{
    "match":{
    "1ast_name":"Smith" } }, "filter":{
    "range":{
    "age":{
    "gt":30} } } } }, "highlight":{
    "fields":{
    "about" : {
    } } }}

二、在项目中操作 elasticsearch

  • 以 jest 的方式操作 elasticsearch

导入 jest 需要的jar 包:

io.searchbox
jest
5.3.3

实体类(用到了 lombok)

@ToString@Builder@AllArgsConstructor@NoArgsConstructor@Getter@Setterpublic class Article {
/** * 标识这是主键 */ @JestId private Long id; private String author; private String title; private String content;}
@ToString@Builder@AllArgsConstructor@NoArgsConstructor@Getter@Setter@Document(indexName = "mesmile", type = "book") // indexName 索引名  type 类型public class Book {
private Long id; private String bookName; private String author;}

测试elasticsearch 的存储与搜索

package cn.mesmile.springboot.elastic;import cn.mesmile.springboot.elastic.domain.Article;import cn.mesmile.springboot.elastic.domain.Book;import cn.mesmile.springboot.elastic.repository.BookRepository;import io.searchbox.client.JestClient;import io.searchbox.core.Index;import io.searchbox.core.Search;import io.searchbox.core.SearchResult;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.io.IOException;import java.util.List;@RunWith(SpringRunner.class)@SpringBootTestpublic class ElasticApplicationTests {
/** * 对 elasticsearch 进行操作有两种方式 * * 方式 ① jest 的方式 * 方式① 需要导入 jar 包 *
*
*
io.searchbox
*
jest
*
5.3.3
*
* * 方式 ② springdataes 的方式,需要继承 ElasticsearchRepository
接口 T为实体类,D为实体类主键类型 * * 注意 springboot 版本 和 elasticsearch 版本 匹配 * 【记得没错此依赖只针对的是6.0版本以上ES,6.0版本以下ES不适用于SpringBoot的依赖。】 * 这里选用的是【 springboot:1.5.9 elasticsearch:2.4.0】 */ @Autowired private JestClient jestClient; @Autowired private BookRepository bookRepository; /** * jest 的方式对 elasticsearch 进行展示 */ @Test public void contextLoads() {
Article article = Article.builder() .id(1L) .author("superzheng") .title("通知") .content("今天项目上线了") .build(); // 构建一个索引 保存什么 保存在哪 类型是什么 Index index = new Index.Builder(article).index("mesmile").type("news").build(); try {
// 执行 // 执行成功后再网址验证查询 ip:9200/mesmile/news/1 jestClient.execute(index); /* 结果如下: { "_index": "mesmile", "_type": "news", "_id": "1", "_version": 1, "found": true, "_source": { "id": 1, "author": "superzheng", "title": "通知", "content": "今天项目上线了" } } */ } catch (IOException e) {
e.printStackTrace(); } } @Test public void testSearch() {
String json = "{\n" + " \"query\":{\n" + "\t\t\"match\":{\n" + "\t\t\t\"content\":\"项目\"\n" + " }\n" + " }\n" + "}"; // 构建搜索 Search search = new Search.Builder(json).addIndex("mesmile").addType("news").build(); try {
// 执行搜索 SearchResult result = jestClient.execute(search); // 生成 json 字符串 System.out.println(result.getJsonString()); // 搜索并转换成我们需要的 Article sourceAsObject = result.getSourceAsObject(Article.class,true); System.out.println(sourceAsObject); } catch (IOException e) {
e.printStackTrace(); } /* { "took": 58, "timed_out": false, "_shards": { "total": 5, "successful": 5, "skipped": 0, "failed": 0 }, "hits": { "total": 1, "max_score": 0.5716521, "hits": [{ "_index": "mesmile", "_type": "news", "_id": "1", "_score": 0.5716521, "_source": { "id": 1, "author": "superzheng", "title": "通知", "content": "今天项目上线了" } }] } } */ } /** * repository的方式 */ @Test public void testBook() {
Book book = Book.builder() .id(1L) .bookName("红楼梦") .author("曹雪芹") .build(); // 存储数据 bookRepository.index(book); } @Test public void testSearchLike() {
// 模糊查询 List
data = bookRepository.findByBookNameLike("楼"); data.forEach(System.out::println); }}

三、出现异常

NoNodeAvailableException[None of the configured nodes are available: [{
#transport#-1}{
BCBUirWrTIy-RJ5ZnNj3xA}{
40.100.00.200}{
40.100.00.200:9300}]]
org.springframework.boot
spring-boot-starter-data-elasticsearch

项目配置文件

# 9200作为Http协议,主要用于外部通讯#9300作为Tcp协议,jar之间就是通过tcp协议通讯#ES集群之间是通过9300进行通讯#9200 是ES节点与外部通讯使用的端口。它是http协议的RESTful接口(各种CRUD操作都是走的该端口,如查询:http://localhost:9200/user/_search)。#9300是ES节点之间通讯使用的端口。它是tcp通讯端口,集群间和TCPclient都走的它。(java程序中使用ES时,在配置文件中要配置该端口)spring:  elasticsearch:    jest:      uris: http://40.100.00.200:9200  data:    elasticsearch:      cluster-nodes: 40.100.00.200:9300      # 默认名称是 elasticsearch 通过 ip:9200 查看      cluster-name: elasticsearch

转载地址:http://qqxxi.baihongyu.com/

你可能感兴趣的文章
系统设计类面试题
查看>>
架构师的职责都有哪些?
查看>>
看女程序员是怎么坑大师兄的, 网友: 真的惨,笑死我了!
查看>>
C/C++程序员面试基础知识(一)
查看>>
程序员提离职遭领导威胁,一线企业总监我都认识,我让你混不下去
查看>>
朝九晚六吊打互联网企业,程序员:又开始无脑吹国企了!
查看>>
网友话数万元转行程序员,但是却没人要,网友:是学历问题吗?
查看>>
程序员辞掉30W年薪接私活:6个月就能赚回30W,庆幸自己当初辞职
查看>>
马云四天三谈996被骂上热搜:抱歉,这届年轻人不好“骗”了!
查看>>
中国牛逼的程序员有哪些?入职华为两天转正,半个月升主任
查看>>
为什么大学里的计算机老师,不去大公司当程序员呢?
查看>>
eclipse的java facets的runtimes如何删除tomcat?
查看>>
oracle序列的cache_size说明
查看>>
oracle中两个时间戳相减得到间隔毫秒数
查看>>
Oracle中将毫秒数转换为timestamp类型的两种方法
查看>>
mybatis配置and rownum< minus 查询第几行到第几行数据的sql原型和mybatis原型。
查看>>
oracle的concat函数使用问题。
查看>>
eclipse编辑状态下怎样让指定行左移或右移?
查看>>
plsql developer如何导入导出表结构和数据以及如何复制表结构和数据?
查看>>
oracle如何去除某个字段中两边的空格?
查看>>