乐优商城 Day06 (包括虚拟机下安装Elasticsearch ,jdk1.8,分词器,非教程)

乐优商城学习Day06:

注意:此次代码都是在第五天的基础上
第五天的链接如下:
https://blog.csdn.net/zcylxzyh/article/details/99655894

此次笔记内容主要为:
1.在linux下安装Elasticsearch
2.安装 jdk1.8
3.安装Kibana和分词器
4.操作索引(增删改查)
5.聚合aggregations
6.java代码操作索引


下面开始第六天的学习:

1.在linux下安装Elasticsearch

1.1 Elasticsearch介绍

用户访问我们的首页,一般都会直接搜索来寻找自己想要购买的商品。

而商品的数量非常多,而且分类繁杂。如果能正确的显示出用户想要的商品,并进行合理的过滤,尽快促成交易,是搜索系统要研究的核心。

面对这样复杂的搜索业务和数据量,使用传统数据库搜索就显得力不从心,一般我们都会使用全文检索技术,比如之前大家学习过的Solr。

不过今天,我们要讲的是另一个全文检索技术:Elasticsearch。

Elasticsearch具备以下特点:

  • 分布式,无需人工搭建集群(solr就需要人为配置,使用Zookeeper作为注册中心)
  • Restful风格,一切API都遵循Rest原则,容易上手
  • 近实时搜索,数据更新在Elasticsearch中几乎是完全同步的。

1.2 Elasticsearch安装

首先文件上传

cd /home/leyou
在这里插入图片描述
使用FileZilla
在这里插入图片描述
在这里插入图片描述
然后解压
在这里插入图片描述
在这里插入图片描述
删除压缩包
在这里插入图片描述
修改权限
在这里插入图片描述
cd进入观察后cd退出来
在这里插入图片描述
重命名:
在这里插入图片描述
cd进入
在这里插入图片描述
修改
在这里插入图片描述
在这里插入图片描述
修改
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
然后创建目录
在这里插入图片描述
然后切换到leyou用户并进入bin(在root下转换账号不需要密码)
在这里插入图片描述
然后把当前的目录下权限全都变成leyou用户
在这里插入图片描述
然后修改上级目录下的文件
在这里插入图片描述
在最下面加
在这里插入图片描述
然后新开一个root账号的终端修改一些权限
在这里插入图片描述
在最下面添加
在这里插入图片描述
在这里插入图片描述
改为4096
在这里插入图片描述
在这里插入图片描述
在最下面加
在这里插入图片描述
输入命令让配置生效

sysctl -p
在这里插入图片描述
然后关闭终端
重新启动虚拟机
开启新终端
在执行下面命令
在这里插入图片描述
访问看到这个,说明配置成功
在这里插入图片描述
至此,第一部分结束。

2.安装jdk1.8

在这里插入图片描述
在这里插入图片描述
安装jdk链接

https://www.cnblogs.com/ocean-sky/p/8392444.html

至此,第二部分结束。


3.安装Kibana和分词器

3.1 安装Kibana

直接解压到相应的目录下
在这里插入图片描述
然后进入conf文件
在这里插入图片描述
注意:这里是虚拟机的地址。

3.2.安装分词器:

先关闭elastsearch
然后进入目录:
在这里插入图片描述
解压:
在这里插入图片描述
在这里插入图片描述
删除安装包:
在这里插入图片描述
修改目录名字:
在这里插入图片描述
进入目录
在这里插入图片描述
重新运行elasticsearch
在这里插入图片描述
结果:
在这里插入图片描述
至此,第三部分结束。


4.操作索引(增删改查)

4.1创建索引(库):

Elasticsearch采用Rest风格API,因此其API就是一次http请求,你可以用任何工具发起http请求

创建索引的请求格式:

  • 请求方式:PUT
  • 请求路径:/索引库名
  • 请求参数:json格式:
    {
    “settings”: {
    “number_of_shards”: 3,
    “number_of_replicas”: 2
    }
    }
    • settings:索引库的设置
      • number_of_shards:分片数量
      • number_of_replicas:副本数量

用Insomnia
3个分片,两个备份:
在这里插入图片描述
用kibana
在这里插入图片描述

查询刚才创建的:
Get请求可以帮我们查看索引信息,格式:

GET /索引库名

在这里插入图片描述
在这里插入图片描述
或者,我们可以使用*来查询所有索引库配置。

删除:
删除索引使用DELETE请求

语法

DELETE /索引库名

示例:
在这里插入图片描述
再次查看heima2:
在这里插入图片描述
当然,我们也可以用HEAD请求,查看索引是否存在:
在这里插入图片描述

4.2 映射配置

索引有了,接下来肯定是添加数据。但是,在添加数据之前必须定义映射。

什么是映射?

映射是定义文档的过程,文档包含哪些字段,这些字段是否保存,是否索引,是否分词等

只有配置清楚,Elasticsearch才会帮我们进行索引库的创建(不一定)

创建映射字段:

语法

请求方式依然是PUT

PUT /索引库名/_mapping/类型名称
{
  "properties": {
    "字段名": {
      "type": "类型",
      "index": true,
      "store": true,
      "analyzer": "分词器"
    }
  }
}
  • 类型名称:就是前面将的type的概念,类似于数据库中的不同表
    字段名:任意填写 ,可以指定许多属性,例如:
  • type:类型,可以是text、long、short、date、integer、object等
  • index:是否索引,默认为true
  • store:是否存储,默认为false
  • analyzer:分词器,这里的ik_max_word即使用ik分词器

示例:


PUT /heima/_mapping/goods
{
    
    
  "properties": {
    
    
    "title": {
    
    
      "type": "text",
      "analyzer": "ik_max_word"
    },
    "images": {
    
    
      "type": "keyword",
      "index": "false"
    },
    "price": {
    
    
      "type": "float"
    }
  }
}

在这里插入图片描述
查看映射关系:
语法:

GET /索引库名/_mapping

示例:
在这里插入图片描述
在这里插入图片描述

4.3 字段属性详解

type :

Elasticsearch中支持的数据类型非常丰富:

我们说几个关键的:

  • String类型,又分两种:
    • text:可分词,不可参与聚合
    • keyword:不可分词,数据会作为完整字段进行匹配,可以参与聚合
  • Numerical:数值类型,分两类
    • 基本数据类型:long、interger、short、byte、double、float、half_float
    • 浮点数的高精度类型:scaled_float
      • 需要指定一个精度因子,比如10或100。elasticsearch会把真实值乘以这个因子后存储,取出时再还原。
  • Date:日期类型
    elasticsearch可以对日期格式化为字符串存储,但是建议我们存储为毫秒值,存储为long,节省空间。

index :

index影响字段的索引情况。

  • true:字段会被索引,则可以用来进行搜索。默认值就是true
  • false:字段不会被索引,不能用来搜索

index的默认值就是true,也就是说你不进行任何配置,所有字段都会被索引。

但是有些字段是我们不希望被索引的,比如商品的图片信息,就需要手动设置index为false。


store :

是否将数据进行额外存储。

在学习lucene和solr时,我们知道如果一个字段的store设置为false,那么在文档列表中就不会有这个字段的值,用户的搜索结果中不会显示出来。

但是在Elasticsearch中,即便store设置为false,也可以搜索到结果。

原因是Elasticsearch在创建文档索引时,会将文档中的原始数据备份,保存到一个叫做_source的属性中。而且我们可以通过过滤_source来选择哪些要显示,哪些不显示。

而如果设置store为true,就会在_source以外额外存储一份数据,多余,因此一般我们都会将store设置为false,事实上,store的默认值就是false。


4.4 新增数据:

随机生成id

通过POST请求,可以向一个已经存在的索引库中添加数据。

语法:

POST /索引库名/类型名
{
    "key":"value"
}

示例:
在这里插入图片描述

  • _source:源文档信息,所有的数据都在里面。
  • _id:这条文档的唯一标示,与文档自己的id字段没有关联
POST /heima/goods/
{
    
    
    "title":"小米手机",
    "images":"http://image.leyou.com/12479122.jpg",
    "price":2699.00
}

自定义id:
如果我们想要自己新增的时候指定id,可以这么做:

POST /索引库名/类型/id值
{
    ...
}

示例:

在这里插入图片描述

POST /heima/goods/1
{
    
    
    "title":"大米手机",
    "images":"http://image.leyou.com/12479122.jpg",
    "price":2899.00
}

查询刚才新增的:
查所有:
在这里插入图片描述
查id为1
在这里插入图片描述
智能判断:

在学习Solr时我们发现,我们在新增数据时,只能使用提前配置好映射属性的字段,否则就会报错。

不过在Elasticsearch中并没有这样的规定。

事实上Elasticsearch非常智能,你不需要给索引库设置任何mapping映射,它也可以根据你输入的数据来判断类型,动态添加数据映射。

测试一下:

在这里插入图片描述


POST /heima/goods/3
{
    
    
    "title":"超米手机",
    "images":"http://image.leyou.com/12479122.jpg",
    "price":2899.00,
    "stock": 200,
    "saleable":true,
    "subTitle":"呵呵"
}

查询一下:
在这里插入图片描述

4.5 修改数据:

把刚才新增的请求方式改为PUT,就是修改了。不过修改必须指定id,

  • id对应文档存在,则修改
  • id对应文档不存在,则新增

先增加一个:

在这里插入图片描述
查询:
在这里插入图片描述
修改:
在这里插入图片描述

PUT /heima/goods/2
{
    
    
    "title":"超大米手机",
    "images":"http://image.leyou.com/12479122.jpg",
    "price":3899.00,
    "stock": 100,
    "saleable":true
}

查一下:

在这里插入图片描述

4.6 删除数据

删除使用DELETE请求,同样,需要根据id进行删除:

语法

DELETE /索引库名/类型名/id值

示例:
在这里插入图片描述

4.7 查询

基本查询:全文检索的查询:(先分词后查询)
基本语法

GET /索引库名/_search
{
    "query":{
        "查询类型":{
            "查询条件":"查询条件值"
        }
    }
}

这里的query代表一个查询对象,里面可以有不同的查询属性

  • 查询类型:
    • 例如:match_all, match,term , range 等等
  • 查询条件:查询条件会根据类型的不同,写法也有差异,后面详细讲解

查询所有(match_all)

示例:

GET /heima/_search
{
    "query":{
        "match_all": {}
    }
}
  • query:代表查询对象
  • match_all:代表查询所有

结果:

{
  "took": 2,
  "timed_out": false,
  "_shards": {
    "total": 3,
    "successful": 3,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 2,
    "max_score": 1,
    "hits": [
      {
        "_index": "heima",
        "_type": "goods",
        "_id": "2",
        "_score": 1,
        "_source": {
          "title": "大米手机",
          "images": "http://image.leyou.com/12479122.jpg",
          "price": 2899
        }
      },
      {
        "_index": "heima",
        "_type": "goods",
        "_id": "r9c1KGMBIhaxtY5rlRKv",
        "_score": 1,
        "_source": {
          "title": "小米手机",
          "images": "http://image.leyou.com/12479122.jpg",
          "price": 2699
        }
      }
    ]
  }
}
  • took:查询花费时间,单位是毫秒
  • time_out:是否超时
  • _shards:分片信息
  • hits:搜索结果总览对象
    • total:搜索到的总条数
    • max_score:所有结果中文档得分的最高分
    • hits:搜索结果的文档对象数组,每个元素是一条搜索到的文档信息
      • _index:索引库
      • _type:文档类型
      • _id:文档id
      • _score:文档得分
      • _source:文档的源数据

匹配查询(match)

GET /heima/_search
{
    
    
  "query": {
    
    
    "match": {
    
    
      "title": "大米手机"
    }
    
  }
}

这个是分词后按照or去查

  • or关系

match类型查询,会把查询条件进行分词,然后进行查询,多个词条之间是or的关系

在这里插入图片描述

GET /heima/_search
{
    
    
  "query": {
    
    
    "match": {
    
    
      "title": {
    
    "query":"大米手机","operator": "and"}
    }
    
  }
}

这个是分词后按照and去查

  • and关系

某些情况下,我们需要更精确查找,我们希望这个关系变成and,可以这样做:

在这里插入图片描述

词条匹配(term) (词条搜索:分词后有的词条才能找到)

term 查询被用于精确值 匹配,这些精确值可能是数字、时间、布尔或者那些未分词的字符串

GET /heima/_search
{
    
    
  "query": {
    
    
    "term": {
    
    
      "title": {
    
    
        "value": "大米手机" 
      }
    }
  }
}

在这里插入图片描述
在这里插入图片描述
结果过滤:
默认情况下,elasticsearch在搜索的结果中,会把文档中保存在_source的所有字段都返回。

如果我们只想获取其中的部分字段,我们可以添加_source的过滤

GET /heima/_search
{
    
    
  "_source": "title", 
  "query": {
    
    
    "match": {
    
    
      "title": "大米手机"
    }
  }
}

在这里插入图片描述

GET /heima/_search
{
    
    
  "_source": ["title","price"], 
  "query": {
    
    
    "match": {
    
    
      "title": "大米手机"
    }
  }
}

在这里插入图片描述

GET /heima/_search
{
    
    
  "_source": {
    
    
    "includes": "price"
  }, 
  "query": {
    
    
    "match": {
    
    
      "title": "大米手机"
    }
  }
}

包含price信息
在这里插入图片描述

GET /heima/_search
{
    
    
  "_source": {
    
    
    "excludes": "images"
  }, 
  "query": {
    
    
    "match": {
    
    
      "title": "大米手机"
    }
  }
}

不包含image信息
在这里插入图片描述
高级查询:

模糊查询(fuzzy)
fuzzy 查询是 term 查询的模糊等价。它允许用户搜索词条与实际词条的拼写出现偏差,但是偏差的编辑距离不得超过2

GET /heima/_search
{
    
    
  "_source": {
    
    
    "excludes": "images"
  }, 
  "query": {
    
    
    "fuzzy": {
    
    
      "title":"appla"
    }
  }
}

在这里插入图片描述
范围查询(range):

range 查询找出那些落在指定区间内的数字或者时间

range查询允许以下字符:

操作符 说明
gt 大于
gte 大于等于
lt 小于
lte 小于等于
GET /heima/_search
{
    
    
  "_source": {
    
    
    "excludes": "images"
  }, 
  "query": {
    
    
    "range": {
    
    
      "price": {
    
    
        "gte": 1000,
        "lte": 3000
      }
    }
  }
}

在这里插入图片描述
布尔查询(bool) :
must:一定,与
must_not:一定不,非

bool把各种其它查询通过must(与)、must_not(非)、should(或)的方式进行组合

GET /heima/_search
{
    
    
  "_source": {
    
    
    "excludes": "images"
  }, 
  "query": {
    
    
    "bool": {
    
    
      "must": [
        {
    
    "match": {
    
    
            "title": "apple"
          }},
          {
    
    
            "range": {
    
    
              "price": {
    
    
                "gte": 3000
              }
            }
          }
      ]
    }
  }
}

名字是Apple,价格在3000以上
在这里插入图片描述
把过滤字段写到filter中,这样就不会影响搜索的得分等等东西

GET /heima/_search
{
    
    
  "_source": {
    
    
    "excludes": "images"
  }, 
  "query": {
    
    
    "bool": {
    
    
      "must": [
        {
    
    "match": {
    
    
            "title": "大米"
          }}
      ],
      "filter": {
    
    
            "range": {
    
    
              "price": {
    
    
                "gte": 1000
              }
            }
      }
    }
  }
}

在这里插入图片描述
排序:

排序通过NativeSearchQueryBuilder完成

GET /heima/_search
{
    
    
  "_source": {
    
    
    "excludes": "images"
  }, 
  "query": {
    
    
    "bool": {
    
    
      "must": [
        {
    
    "match": {
    
    
            "title": "大米"
          }}
      ],
      "filter": {
    
    
            "range": {
    
    
              "price": {
    
    
                "gte": 1000
              }
            }
      }
    }
  },
  "sort": [
    {
    
    
      "price": {
    
    
        "order": "desc"
      }
    }
  ]
}

在这里插入图片描述
分页:

利用NativeSearchQueryBuilder可以方便的实现分页:

GET /heima/_search
{
    
    
  "_source": {
    
    
    "excludes": "images"
  }, 
  "query": {
    
    
    "bool": {
    
    
      "must": [
        {
    
    "match": {
    
    
            "title": "大米"
          }}
      ],
      "filter": {
    
    
            "range": {
    
    
              "price": {
    
    
                "gte": 1000
              }
            }
      }
    }
  },
  "sort": [
    {
    
    
      "price": {
    
    
        "order": "desc"
      }
    }
  ],
  "from": 1,
  "size": 1
}

在这里插入图片描述
至此,第四部分结束。


5.聚合aggregations

重新准备一个索引库用作聚合的操作:

PUT /cars
{
    
    
  "settings": {
    
    
    "number_of_shards": 1,
    "number_of_replicas": 0
  },
  "mappings": {
    
    
    "transactions": {
    
    
      "properties": {
    
    
        "color": {
    
    
          "type": "keyword"
        },
        "make": {
    
    
          "type": "keyword"
        }
      }
    }
  }
}
POST /cars/transactions/_bulk
{
    
     "index": {
    
    }}
{
    
     "price" : 10000, "color" : "red", "make" : "honda", "sold" : "2014-10-28" }
{
    
     "index": {
    
    }}
{
    
     "price" : 20000, "color" : "red", "make" : "honda", "sold" : "2014-11-05" }
{
    
     "index": {
    
    }}
{
    
     "price" : 30000, "color" : "green", "make" : "ford", "sold" : "2014-05-18" }
{
    
     "index": {
    
    }}
{
    
     "price" : 15000, "color" : "blue", "make" : "toyota", "sold" : "2014-07-02" }
{
    
     "index": {
    
    }}
{
    
     "price" : 12000, "color" : "green", "make" : "toyota", "sold" : "2014-08-19" }
{
    
     "index": {
    
    }}
{
    
     "price" : 20000, "color" : "red", "make" : "honda", "sold" : "2014-11-05" }
{
    
     "index": {
    
    }}
{
    
     "price" : 80000, "color" : "red", "make" : "bmw", "sold" : "2014-01-01" }
{
    
     "index": {
    
    }}
{
    
     "price" : 25000, "color" : "blue", "make" : "ford", "sold" : "2014-02-12" }

在这里插入图片描述
聚合为桶:
桶就是分组,比如这里我们按照品牌brand进行分组

GET /cars/_search
{
    
    
  "size": 0, 
  "aggs": {
    
    
    "popular_brand": {
    
    
      "terms": {
    
    
        "field": "make"
      }
    }
  }
}

size : 0是不显示查询结果
在这里插入图片描述
加上了价格的平均值:

GET /cars/_search
{
    
    
  "size": 0, 
  "aggs": {
    
    
    "popular_brand": {
    
    
      "terms": {
    
    
        "field": "make"
      },
       "aggs": {
    
    
        "price_avg": {
    
    
          "avg": {
    
    
            "field": "price"
          }
        }
      }
    }
  }
}

在这里插入图片描述
至此,第五部分结束。


6.java代码操作索引

要记得:打开Kibana,还有打开虚拟机(按照上面配置的)

Elasticsearch提供的Java客户端有一些不太方便的地方:

  • 很多地方需要拼接Json字符串,在java中拼接字符串有多恐怖你应该懂的
  • 需要自己把对象序列化为json存储
  • 查询到结果也需要自己反序列化为对象

因此,我们这里就不讲解原生的Elasticsearch客户端API了。

而是学习Spring提供的套件:Spring Data Elasticsearch。

我们新建一个工程,取名为es-demo:
在这里插入图片描述
然后导入所需要依赖:

es-pom代码如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.leyou.demo</groupId>
    <artifactId>es-demo</artifactId>
    <version>1.0-SNAPSHOT</version>

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

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.4.RELEASE</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-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
    </dependencies>

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

然后按照如下结构进行构造:
在这里插入图片描述
配置文件代码如下:

spring:
  data:
    elasticsearch:
      cluster-name: elasticsearch
      cluster-nodes: 192.168.133.128:9300

启动类EsApplication代码如下:

package com.leyou;

        import org.springframework.boot.SpringApplication;
        import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class EsApplication {
    
    
    public static void main(String[] args) {
    
    
        SpringApplication.run(EsApplication.class);
    }
}

映射

Spring Data通过注解来声明字段的映射属性,有下面的三个注解:

  • @Document 作用在类,标记实体类为文档对象,一般有两个属性
    • indexName:对应索引库名称
    • type:对应在索引库中的类型
    • shards:分片数量,默认5
    • replicas:副本数量,默认1
  • @Id 作用在成员变量,标记一个字段作为id主键
  • @Field 作用在成员变量,标记为文档的字段,并指定字段映射属性:
    • type:字段类型,取值是枚举:FieldType
    • index:是否索引,布尔类型,默认是true
    • store:是否存储,布尔类型,默认是false
    • analyzer:分词器名称

Item实体类代码如下:

package com.leyou.es.pojo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;
@AllArgsConstructor
@NoArgsConstructor
@Data
@Document(indexName = "heima3",type = "item",shards = 1)
public class Item {
    
    
    @Field(type = FieldType.Long)
    @Id
    Long id;

    @Field(type = FieldType.Text,analyzer = "ik_smart")
    String title; //标题
    @Field(type = FieldType.Keyword)
    String category;// 分类
    @Field(type = FieldType.Keyword)
    String brand; // 品牌
    @Field(type = FieldType.Double)
    Double price; // 价格
    @Field(type = FieldType.Keyword , index = false)
    String images; // 图片地址
}

Spring Data 的强大之处,就在于你不用写任何DAO处理,自动根据方法名或类的信息进行CRUD操作。只要你定义一个接口,然后继承Repository提供的一些子接口,就能具备各种基本的CRUD功能。

我们只需要定义接口,然后继承它就OK了。

ItemRepository接口代码如下:

package com.leyou.es.repository;

import com.leyou.es.pojo.Item;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;

import java.util.List;

public interface ItemRepository extends ElasticsearchRepository<Item,Long>{
    
    
    List<Item> findByPriceBetween(Double begin , Double end);
}

EsTest代码如下:

package com.leyou.es.demo;

import com.leyou.es.pojo.Item;
import com.leyou.es.repository.ItemRepository;
import lombok.AllArgsConstructor;
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.data.elasticsearch.core.ElasticsearchTemplate;
import org.springframework.test.context.junit4.SpringRunner;

import java.util.ArrayList;
import java.util.List;

@RunWith(SpringRunner.class)
@SpringBootTest
public class EsTest {
    
    

    @Autowired
    ElasticsearchTemplate template;
    @Autowired
    private ItemRepository repository;
    @Test
    public void testCreate(){
    
    
        //创建索引库
        template.createIndex(Item.class);
        //映射关系
        template.putMapping(Item.class);
    }

    @Test
    public void indexList() {
    
    
        List<Item> list = new ArrayList<>();
        list.add(new Item(1L, "小米手机7", "手机", "小米", 3299.00, "http://image.leyou.com/13123.jpg"));
        list.add(new Item(2L, "坚果手机R1", "手机", "锤子", 3699.00, "http://image.leyou.com/13123.jpg"));
        list.add(new Item(3L, "华为META10", "手机", "华为", 4499.00, "http://image.leyou.com/13123.jpg"));
        list.add(new Item(4L, "小米Mix2S", "手机", "小米", 4299.00, "http://image.leyou.com/13123.jpg"));
        list.add(new Item(5L, "荣耀V10", "手机", "华为", 2799.00, "http://image.leyou.com/13123.jpg"));
        // 接收对象集合,实现批量新增
        repository.saveAll(list);
    }

    @Test
    public void testFind(){
    
    
        Iterable<Item> all = repository.findAll();
        for (Item item : all){
    
    
            System.out.println("item = " + item);
        }
    }

    @Test
    public void testFindBy(){
    
    
        List<Item> list = repository.findByPriceBetween(2000d, 4000d);
        for (Item item : list){
    
    
            System.out.println("item = "+item);
        }
    }
}

创建索引:

结果:
在这里插入图片描述
新增:

结果:
在这里插入图片描述
查询:
在这里插入图片描述
自定义查询:

Spring Data 的另一个强大功能,是根据方法名称自动实现功能。

比如:你的方法名叫做:findByTitle,那么它就知道你是根据title查询,然后自动帮你完成,无需写实现类。

当然,方法名称要符合一定的约定:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
自己写方法名,他帮你生成
结果:
在这里插入图片描述
至此,今天的学习结束。

猜你喜欢

转载自blog.csdn.net/zcylxzyh/article/details/99943700