springCloud-day09

                                     Elasticsearch

一:Elasticsearch介绍和安装
1.简介
①:我们了解了Lucene的使用,但是Lucene只是实现了全文检索的基础API,功能不够完善,我们在企业开发中,都会使用基于Lucene封装的专业的搜索框架,例如:Solr、Elasticsearch。
1):Solr:Apache的产品,与Lucene是一套。
2):ElasticSearch:elastic技术栈的一个。
3):HibernateSearch:Hibernate出品
②:Elastic
Elastic有一条完整的产品线:Elasticsearch、Kibana、Logstash等,前面说的三个就是大家常说的ELK技术栈。
在这里插入图片描述
③:Elasticsearch
在这里插入图片描述
如上所述,Elasticsearch具备以下特点:
1)分布式,无需人工搭建集群(solr就需要人为配置,使用Zookeeper作为注册中心)
2)Restful风格,一切API都遵循Rest原则,容易上手
3)近实时搜索,数据更新在Elasticsearch中几乎是完全同步的。
④:版本
目前Elasticsearch最新的版本是6.2.4,需要虚拟机JDK1.8及以上

2.安装和配置
①:新建一个用户shequ,设置密码:
useradd shequ
passwd shequ
②:上传安装包,并解压
1)我们将安装包上传到:/home/shequ目录
2)解压缩:tar xvf elasticsearch-6.2.4.tar.gz
3)我们把目录重命名:
mv elasticsearch-6.2.4/ elasticsearch
修改权限
chown shequ:shequ -R elasticsearch
4)进入,查看目录结构:
在这里插入图片描述
5)出于安全考虑,elasticsearch默认不允许以root账号运行。切换用户:
su - shequ
③:修改配置(jvm.options,elasticsearch.yml)
1):jvm.options(修改2个)
在这里插入图片描述
2):elasticsearch.yml(修改3个)
在这里插入图片描述
3):集群(只需要在这个配置文件中添加其它节点信息即可。elasticsearch.yml的其它可配置信息)
在这里插入图片描述
在这里插入图片描述
④:创建data和logs目录
刚才我们修改配置,把data和logs目录修改指向了elasticsearch的安装目录。但是这两个目录并不存在,因此我们需要创建出来,进入Elasticsearch的根目录,然后创建:
在这里插入图片描述

3.运行
①:运行
进入elasticsearch/bin目录,可以看到下面的执行文件:
在这里插入图片描述
②:错误1:内核过低
在这里插入图片描述
③:错误2:
在这里插入图片描述
④:错误3
在这里插入图片描述
⑤:错误4
在这里插入图片描述
⑥:然后执行命令:配置才能生效
sysctl -p
⑦:重启终端窗口
在这里插入图片描述
⑧:启动
在这里插入图片描述
在这里插入图片描述

4.安装kibana
①:什么是Kibana?
1)Kibana是一个基于Node.js的Elasticsearch索引库数据统计工具,可以利用Elasticsearch的聚合功能,生成各种图表,如柱形图,线状图,饼图等。
2)而且还提供了操作Elasticsearch索引数据的控制台,并且提供了一定的API提示,非常有利于我们学习Elasticsearch的语法。
②:安装
1)先安装node.js
在这里插入图片描述
2)再安装kibana
在这里插入图片描述
③:配置运行
在这里插入图片描述
在这里插入图片描述

④:控制台
在这里插入图片描述
在这里插入图片描述

5.安装ik分词器
①:安装
在这里插入图片描述
在这里插入图片描述

②:测试
在这里插入图片描述

在这里插入图片描述

6.API(了解)

二:索引库操作
1.基本概念
Elasticsearch也是基于Lucene的全文检索库,本质也是存储数据,很多概念与MySQL类似的。
在这里插入图片描述
在这里插入图片描述

2.创建索引库
①:语法
Elasticsearch采用Rest风格API,因此其API就是一次http请求,你可以用任何工具发起http请求
创建索引的请求格式:
在这里插入图片描述

②:RestClient创建索引库(postman等工具创建)
在这里插入图片描述

③:使用kibana创建
在这里插入图片描述

3.查看索引库
在这里插入图片描述

4.删除索引库
在这里插入图片描述

三:类型及映射操作
1.创建映射字段
①:请求方式依然是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 shequ/_mapping/goods        --shequ(为索引库--database) goods(为类型--表)
{
  "properties": {
    "title": {                  --properties(title,images,price下面为3个字段属性)
      "type": "text",
      "index": true"store": true"analyzer": "ik_max_word"
    },
    "images": {
      "type": "keyword",     --keyword(不分词)   text(分词)
      "index": "false"
    },
    "price": {
      "type": "float"
    }
  }
}

响应结果:
在这里插入图片描述

2.查看映射关系
查看某个索引库中的所有类型的映射。如果要查看某个类型映射,可以再路径后面跟上类型名称。即:
在这里插入图片描述

3.映射属性详解(type,index,store,ik)–重要
①:type
在这里插入图片描述
下面复杂的类型数据举例:(数组和对象的情况)
在这里插入图片描述

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

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

④:ik
1)TextField–text:可分词
2)StringField–keyword:不可分词

4.一次创建索引库和类型
①:我们可以创建索引库和类型分开来做,其实也可以在创建索引库的同时,直接指定索引库中的类型,基本语法:

put /索引库名
{
    "mappings":{
        "类型名":{
            "properties":{
                "字段名":{
                    "映射属性名":"映射属性值"
                }
            }
        }
    }
}

②:举例

PUT /shequ
{
  "mappings": {
    "goods": {
      "properties": {
        "title": {
          "type": "text",
          "analyzer": "ik_max_word"
        }
      }
    }
  }
}

四:文档操作(post,delete,put,get–增删改查)
1.新增文档
①:新增并随机生成id(语法)

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

②:代码示

POST /shequ/goods/
{
    "title":"小米手机",
    "images":"http://image.leyou.com/12479122.jpg",
    "price":2699.00
}

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

2.查看文档
①:根据rest风格,新增是post,查询应该是get,不过查询一般都需要条件,这里我们把刚刚生成数据的id带上。
通过kibana查看数据:
GET /shequ/goods/r9c1KGMBIhaxtY5rlRKv
②:结果
在这里插入图片描述

3.新增文档并自定义id
①:语法:

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

②:举例

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

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

4.修改数据
①:请求方式改为PUT,就是修改了。不过修改必须指定id,

  • id对应文档存在,则修改
  • id对应文档不存在,则新增
    1)比如,我们把使用id为3,不存在,则应该是新增:
PUT /shequ/goods/3
{
    "title":"超米手机",
    "images":"http://image.shequ.com/12479122.jpg",
    "price":3899.00,
    "stock": 100,
    "saleable":true
}

结果:

{
  "_index": "shequ",
  "_type": "goods",
  "_id": "3",
  "_version": 1,
  "result": "created",  --创建
  "_shards": {
    "total": 2,
    "successful": 1,
    "failed": 0
  },
  "_seq_no": 1,
  "_primary_term": 1
}

2)我们再次执行刚才的请求,不过把数据改一下:

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

结果:

{
  "_index": "ahequ",
  "_type": "goods",
  "_id": "3",
  "_version": 2,
  "result": "updated",  --成为修改
  "_shards": {
    "total": 2,
    "successful": 1,
    "failed": 0
  },
  "_seq_no": 2,
  "_primary_term": 1
}

5.删除数据
①:删除使用DELETE请求,同样,需要根据id进行删除:
DELETE /索引库名/类型名/id值
在这里插入图片描述

6.智能判断
①:刚刚我们在新增数据时,添加的字段都是提前在类型中定义过的,如果我们添加的字段并没有提前定义过,能够成功吗?
②:事实上Elasticsearch非常智能,你不需要给索引库设置任何mapping映射,它也可以根据你输入的数据来判断类型,动态添加数据映射。
③:举例:我们额外添加了stock库存,saleable是否上架,subtitle副标题、3个字段。

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

结果:(有默认的配置)

{
  "_index": "shequ",
  "_type": "goods",
  "_id": "3",
  "_version": 3,
  "result": "updated",
  "_shards": {
    "total": 2,
    "successful": 1,
    "failed": 0
  },
  "_seq_no": 3,
  "_primary_term": 1
}

④:这种智能映射,底层原理是动态模板映射,如果我们想修改这种智能映射的规则,其实只要修改动态模板即可!

7.动态映射模板
①:动态模板的语法:
在这里插入图片描述
1)模板名称,随便起
2)匹配条件,凡是符合条件的未定义字段,都会按照这个规则来映射
3)映射规则,匹配成功后的映射规则
②:举例
在这里插入图片描述
在这个案例中,我们把做了两个映射配置:

  • title字段:统一映射为text类型,并制定分词器
  • 其它字段:只要是string类型,统一都处理为keyword类型。
    这样,未知的string类型数据就不会被映射为text和keyword并存,而是统一以keyword来处理!

五:查询
1.基本查询
基本语法:

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

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

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

①:查询所有(match_all)

GET /shequ/_search
{
    "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": "shequ",
        "_type": "goods",
        "_id": "2",
        "_score": 1,
        "_source": {
          "title": "大米手机",
          "images": "http://image.leyou.com/12479122.jpg",
          "price": 2899
        }
      },
      {
        "_index": "shequ",
        "_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–or,and关系)
GET /shequ/_search
{
“query”:{
“match”:{
“title”:“小米电视”
}
}
}
③:多字段查询(multi_match)

④:词条查询(term–不分词查询)

GET /shequ/_search
{
    "query":{
        "term":{
            "price":2699.00
        }
    }
}

⑤:多词条精准匹配(terms)
1):terms 查询和 term 查询一样,但它允许你指定多值进行匹配。如果这个字段包含了指定值中的任何一个值,那么这个文档满足条件:
2):
GET /shequ/_search
{
“query”:{
“terms”:{
“price”:[2699.00,2899.00,3899.00]
}
}
}
3):结果(有3个)

{
  "took": 4,
  "timed_out": false,
  "_shards": {
    "total": 3,
    "successful": 3,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 3,
    "max_score": 1,
    "hits": [
      {
        "_index": "shequ",
        "_type": "goods",
        "_id": "2",
        "_score": 1,
        "_source": {
          "title": "大米手机",
          "images": "http://image.leyou.com/12479122.jpg",
          "price": 2899
        }
      },
      {
        "_index": "shequ",
        "_type": "goods",
        "_id": "r9c1KGMBIhaxtY5rlRKv",
        "_score": 1,
        "_source": {
          "title": "小米手机",
          "images": "http://image.leyou.com/12479122.jpg",
          "price": 2699
        }
      },
      {
        "_index": "shequ",
        "_type": "goods",
        "_id": "3",
        "_score": 1,
        "_source": {
          "title": "小米电视4A",
          "images": "http://image.leyou.com/12479122.jpg",
          "price": 3899
        }
      }
    ]
  }
}

2.结果过滤
默认情况下,elasticsearch在搜索的结果中,会把文档中保存在_source的所有字段都返回。
如果我们只想获取其中的部分字段,我们可以添加_source的过滤.
①:直接指定字段

GET /shequ/_search
{
  "_source": ["title","price"],
  "query": {
    "term": {
      "price": 2699
    }
  }
}

返回的结果:(只要返回这俩个字段title","price)

{
  "took": 12,
  "timed_out": false,
  "_shards": {
    "total": 3,
    "successful": 3,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 1,
    "max_score": 1,
    "hits": [
      {
        "_index": "shequ",
        "_type": "goods",
        "_id": "r9c1KGMBIhaxtY5rlRKv",
        "_score": 1,
        "_source": {
          "price": 2699,
          "title": "小米手机"
        }
      }
    ]
  }
}

②:指定includes和excludes
我们也可以通过:

  • includes:来指定想要显示的字段
  • excludes:来指定不想要显示的字段
    1):includes
GET /shequ/_search
{
  "_source": {
    "includes":["title","price"]
  },
  "query": {
    "term": {
      "price": 2699
    }
  }
}

2):与下面的结果将是一样的:(excludes)

GET /shequ/_search
{
  "_source": {
     "excludes": ["images"]
  },
  "query": {
    "term": {
      "price": 2699
    }
  }
}

3.高级查询
①:布尔组合(bool)
bool把各种其它查询通过must(与–交集)、must_not(非–排除)、should(或–并集)的方式进行组合
GET /shequ/_search
{
“query”:{
“bool”:{
“must”: { “match”: { “title”: “大米” }},
“must_not”: { “match”: { “title”: “电视” }},
“should”: { “match”: { “title”: “手机” }}
}
}
}

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

③:模糊查询(fuzzy)
在这里插入图片描述

4.过滤(filter)
①:所有的查询都会影响到文档的评分及排名。如果我们需要在查询结果中进行过滤,并且不希望过滤条件影响评分,那么就不要把过滤条件作为查询条件来用。而是使用filter方式:

GET /shequ/_search
{
    "query":{
        "bool":{
        	"must":{ "match": { "title": "小米手机" }},
        	"filter":{
                "range":{"price":{"gt":2000.00,"lt":3800.00}}
        	}
        }
    }
}

5.排序
①:单字段排序
sort 可以让我们按照不同的字段进行排序,并且通过order指定排序的方

GET /shequ/_search
{
  "query": {
    "match": {
      "title": "小米手机"
    }
  },
  "sort": [
    {
      "price": {
        "order": "desc"
      }
    }
  ]
}

分页:(from,size–相当于MySQL的limit关键字start,end分页)
在这里插入图片描述

②:多字段排序(使用 price和 _score(得分) 进行查询,并且匹配的结果首先按照价格排序,然后按照相关性得分排序:)

GET /goods/_search
{
    "query":{
        "bool":{
        	"must":{ "match": { "title": "小米手机" }},
        	"filter":{
                "range":{"price":{"gt":200000,"lt":300000}}
        	}
        }
    },
    "sort": [
      { "price": { "order": "desc" }},
      { "_score": { "order": "desc" }}
    ]
}

6.高亮
①:elasticsearch中实现高亮的语法比较简单:

GET /shequ/_search
{
  "query": {
    "match": {
      "title": "手机"
    }
  },
  "highlight": {
    "pre_tags": "<em>",
    "post_tags": "</em>", 
    "fields": {
      "title": {}
    }
  }
}

在使用match查询的同时,加上一个highlight属性:

  • pre_tags:前置标签
  • post_tags:后置标签
  • fields:需要高亮的字段
    • title:这里声明title字段需要高亮,后面可以为这个字段设置特有配置,也可以空
      ②:结果:
{
  "took": 8,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 3,
    "max_score": 0.2876821,
    "hits": [
      {
        "_index": "shequ",
        "_type": "goods",
        "_id": "2",
        "_score": 0.2876821,
        "_source": {
          "title": "大米手机",
          "images": "http://image.leyou.com/12479122.jpg",
          "price": 2899
        },
        "highlight": {
          "title": [
            "大米<em>手机</em>"
          ]
        }
      },
      {
        "_index": "shequ",
        "_type": "goods",
        "_id": "JP6xa2kBtq36Pzvxpjaf",
        "_score": 0.19856805,
        "_source": {
          "title": "小米手机",
          "images": "http://image.leyou.com/12479122.jpg",
          "price": 2699
        },
        "highlight": {
          "title": [
            "小米<em>手机</em>"
          ]
        }
      },
      {
        "_index": "shequ",
        "_type": "goods",
        "_id": "3",
        "_score": 0.16853254,
        "_source": {
          "title": "超大米手机",
          "images": "http://image.leyou.com/12479122.jpg",
          "price": 3299,
          "stock": 200,
          "saleable": true,
          "subTitle": "哈哈"
        },
        "highlight": {
          "title": [
            "超大米<em>手机</em>"
          ]
        }
      }
    ]
  }
}

③:注意点:_source数据和高亮数据分开返回的。

总结:
1.es的介绍和安装(es,kibana,ik)
2.索引库的操作(库的–增删改查)
3.类型以及映射操作(表和字段–增删改查)
4.文档的操作(具体数据记录的–增删改查)
5.搜索
①:基本查询(分词,不分词,匹配)
②:结果过滤(返回指定字段)
③:高级查询(布尔,范围,模糊)
④:过滤(影响分数)
⑤:排序(升序,降序)
⑥:高亮(后端加标签,前端做渲染显示)

weixin151云匹面粉直供微信小程序+springboot后端毕业源码案例设计 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值