ElasticSearch(一)


ElasticSearch

狂神说ElasticSearch

大数据的时代发展

ElasticSearch是基于Lucene的一个封装的,Lunece是一个用于文本搜索的函数库,其目标是为各种小型应用软件加入全文检索功能。(作者Doug Cutting)

Google针对Nutch中的一些问题,分享了一篇谷歌文件系统GFS(Google File System),为了解决存储海量搜索的数据而设计的文件系统。随后基于GFS实现了分布式文件存储系统,并命名为NDFS(Nutch Distributed File System),还介绍了Mapreduce编程模型,用于大规模数据集的并行分析运算。

大数据发展,谷歌发表论文BigTable,是一种分布式数据存储系统,用来处理海量数据的非关系性数据库。Doug Cutting 在Hadoop系统中加入了BigTable并命名为HBase。(Hadoop 、Hbase、MapReduce)。

Lunece

lunece的简单使用 自己看着之前的老师做的简单的实验,能够提供简单的入门。

lunece是一套信息检索工具包,jar包,不包含搜索引擎系统。其包含有索引结构、读写索引的工具、排序、搜索工具。

lunece和ElasticSearch关系:

ElasticSearch是基于Lucene的一个封装和增强。

Es是一个开源的分布式文件检索引擎,其近乎实时的存储、检索数据;本身扩展性好,可扩展到上百台服务器,处理pb级别的数据。使用Restful api来隐藏lunece的复杂性,让全文索引更简单。

ELK技术:ElasticSearch+logstash+Kibana

ElasticSearch与Solr

1.ElasticSearch解压就可以使用,Solr需要安装,稍微复杂

2.Solr利用Zookeeper进行分布式管理,ES自身携带分布式协调管理功能

3.Solr支持更多格式的数据,利用json、xml、csv,ES仅支持json文件格式

4.Solr官网提供的功能更多,ES本身侧重与核心功能,大多数使用第三方插件提供,使用Kibana

5.Solr查询更快,但更新索引慢,ES建立索引快,实时性查询快

6.Solr更加成熟,开源社区、用户更成熟,ES相对开发维护者较少,学习使用成本高

ElasticSearch安装

官网下载地址

推荐网友提供的华为镜像下载地址(好用):

windows下应该下载三个工具的zip文件,直接解压即用。

ElasticSearch

logstash

kibana

按照狂神的课程,个人下载的是7.6.2版本。

解压es,其目录结构

bin 启动文件

config

​ log4j 日志配置文件

​ jvm.options java虚拟机相关设置,如果买的阿里云等设备内存等较小,需将jvm参数调节

​ elasticsearch.yml elasticsearch的相关配置文件,默认端口号9200

lib 相关的jar包

modules 功能模块

plugins 插件

启动bin目录下elasticsearch.bat,将es启动。

在浏览器端输入:localhost:9200会有

{
  "name" : "AFABW-809061946",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "cu6diFVuQ36nvenA9z2PPw",
  "version" : {
    "number" : "7.6.2",
    "build_flavor" : "default",
    "build_type" : "zip",
    "build_hash" : "ef48eb35cf30adf4db14086e8aabd07ef6fb113f",
    "build_date" : "2020-03-26T06:34:37.794943Z",
    "build_snapshot" : false,
    "lucene_version" : "8.4.0",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}

安装可视化界面

课程中学习使用的head插件

依赖环境node.js

从github下载elasticsearch-head:传送门

加压后进入目录,使用npm命令进行安装

npm install

npm run start

##使用淘宝镜像更快一些

cnpm install

cnpm run start

浏览器中的会出现跨域的问题,因此需要设置:elasticsearch.yml

http.cors.enabled: true
http.cors.allow-origin: "*"

测试连接访问:

启动eshead

将索引作为一个数据库。

简单了解ELK

ELK是Elasticsearch、Logstash、Kibana三大开源框架首字母大写简称。市面上也被成为Elastic Stack。其中Elasticsearch是一个基于Lucene、分布式、通过Restful方式进行交互的近实时搜索平台框架。像类似百度、谷歌这种大数据全文搜索引擎的场景都可以使用Elasticsearch作为底层支持框架,可见Elasticsearch提供的搜索能力确实强大,市面上很多时候我们简称Elasticsearch为es。Logstash是ELK的中央数据流引擎,用于从不同目标(文件/数据存储/MQ)收集的不同格式数据,经过过滤后支持输出到不同目的地(文件/MQ/redis/elasticsearch/kafka等)。Kibana可以将elasticsearch的数据通过友好的页面展示出来,提供实时分析的功能。

了解更多

结构图查看

安装Kibana

Kibana是一个针对Elasticsearch的开源分析及可视化平台,用来搜索、查看交互存储在es索引中的数据。使用kibana,可以通过各种图表进行高级数据分析与展示,kibana使得海量数据更容易理解。操作简单、基于浏览器的用户界面可以快速穿件仪表板(dashboard)实时显示es查询动态。

kibana官方网站

ELK基本为拆箱即用,解压后即可使用,kibana依赖node.js环境,解压时间比较长久,默认的端口是5601。

启动kibana,bin目录下的libana.bat,打开即可使用。

浏览器输入localhost:5601,可视化界面以及开发工具。

使用kibana自带开发工具

开发工具(postman、head、谷歌插件)

该工具支持汉化,在config文件夹下找到kibana.yml文件,更改文件后重启

i18n.locale: "zh-CN"

汉化后的kibana

汉化的kibana

Es核心概念

专业名词:集群、节点、索引、类型、文档、分片、映射。Es是面向文档

Relational DB Elasticsearch
数据库(database) 索引(indices)
表(tables) types (不常用,会被弃用)
行(rows) documents
字段(columns) fields

Es中包含多个索引(数据库),每个索引中可以包含多个类型,每个类型下又包含多个文档,每个文档包含有多个字段(列)。

物理设计 Es在后台把每个索引划分成多个分片,每份分片可以在集群中的不同服务器间迁移

逻辑设计 一个索引类型中,包含有多个文档,当索引一篇文档时,寻找的顺序是索引>>类型>>文档id

倒排索引

lunece底层使用倒排序索引,这种结构适用于快速的全文索引,一个索引有文档中所有不重复的列表构成,对于每一个词,都有一个包含它的文档列表。

举例:

Study every day ,good good up to forever.

To forever,study every day,good good up.

创建倒排序索引,首先将文档拆分成独立的词(tokens),然后创建一个包含所有不重复的词条的排序列表,然后列出每个词条出现在那个文档中。下面的表格1表示出现过,0表示没有出现

term doc1 doc2
study 0 1
to 1 0
every 1 1
day 1 0
forever 1 1
Study 1 0
To 1 0
up 1 1

例如搜索to forever时,文档1的匹配度更高,权重更大,文档二权重更低。

在Es中索引被分为多个分片,每份分片是lunece的索引,因此,一个elasticsearch索引是由多个lunece索引组成的。

Es核心是:索引、字段类型(映射关系)、文档

IK分词插件

0.ik分词器简单介绍

分词:即把中文或者别的划分为一个个关键字,我们在搜索时会把自己的信息进行分词,会把数据库中或者索引库中的数据进行分词,然后进行一个匹配操作,默认的中文分词是将每一个字看做一个词,这是不符合中文分词的要求的,因此需要使用第三方的分词器解决分词问题。

ik分词器中的算法:ik_smart和ik_max_word,其中ik_smart为最少切分,ik_max_word为最细粒度划分

1.下载ik分析器

下载对应的ik版本,个人使用的是ES7.6.2,因此下载的ik为7.6.2,视频中使用7.6.1

ik分析器7.6.2版本下载地址

2.将ik分词的jar包放在ES中的插件plugins目录下

3.重启Es、以及kibana

4.使用 elasticsearch-plugin list 命令查看ik分词器插件是否安装

查看ik插件

5.使用kibana进行测试

ik分词的两种算法

自己定义ik分词器字典

在es的插件的ik分词文件夹下的config文件夹下有IKAnalyzer.cfg.xml将自己的词典配置在该文件中

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
    <comment>IK Analyzer 扩展配置</comment>
    <!--用户可以在这里配置自己的扩展字典 自己定义的词典文件mytest.dic-->
    <entry key="ext_dict">mytest.dic</entry>
     <!--用户可以在这里配置自己的扩展停止词字典-->
    <entry key="ext_stopwords"></entry>
    <!--用户可以在这里配置远程扩展字典 -->
    <!-- <entry key="remote_ext_dict">words_location</entry> -->
    <!--用户可以在这里配置远程扩展停止词字典-->
    <!-- <entry key="remote_ext_stopwords">words_location</entry> -->
</properties>

自定义字典词汇

如果自己有什么样的分词就自己定义分词的词典。

Rust风格

Rust是一种软件架构风格,不是一种标准,是提供一组设计原则和约束条件。主要用于客户端和服务器之间的交互类的软件,基于该风格的软件更加简洁更有层次,易于实现缓存机制。

Rust命令说明:

method url地址 描述
PUT localhost:9200/索引名称/类型名称/文档id 创建文档(指定文档id)
POST localhost:9200/索引名称/类型名称 创建文档(随机文档id)
POST localhost:9200/索引名称/类型名称/文档id/_update 修改文档
DELETE localhost:9200/索引名称/类型名称/文档id 删除文档
GET localhost:9200/索引名称/类型名称/文档id 查询文档通过文档id
POST localhost:9200/索引名称/类型名称/文档id/_search 查询所有数据

1.创建一个索引

##向服务器发送一个创建索引的命令

PUT /索引名/类型名/文档id

{请求体}

创建一个索引文档

使用head查看如下,完成了索引的创建

head查看文档信息

2.关于类型

字符串类型: text keyword

数值类型:long、integer、short、byte、double、float、half float、scaled float

日期类型:date

布尔类型:boolean

二进制类型:binary

3.创建索引规则

类似于关系型数据库建表的过程

PUT /test2
{
  "mappings": {
    "properties": {
      "name": {
        "type": "text"
      },
      "age": {
        "type": "long"
      },
      "birthday": {
        "type": "date"
      }
    }
  }
}

创建规则

创建一个索引规则

获取规则

GET /test2

查看默认的信息,默认会给定数据类型。

默认创建文档以及类型查看

#使用命令查看索引库信息

GET _cat/indices?v

kibana查看索引库信息

修改操作:

POST /test3/_doc/1/_update
{
  "doc": {
    "name": "星仔"
  }
}

删除索引

##使用DELETE命令删除指定的索引或文档

DELETE test3

文档操作

较难,需掌握,基本操作与之前的索引较为相似

基本操作

1.添加一个用户(文档操作相当于关系型数据库中的一行数据)

PUT /xing/user/1
{
  "name": "itxing",
  "age": 25,
  "desc": "最棒的星仔",
  "tags": ["技术学习者","暖男","阳光"]
}

2.更新数据

PUT /xing/user/3
{
  "name": "xiaomei",
  "age": 29,
  "desc": "职业前台",
  "tags": ["旅游","美女","会聊"]
}

POST更新

POST /xing/user/2/_update
{
  "doc": {
    "desc": "使用E滑步"
  }
}

3.简单的查询

GET xing/user/2 ##使用id查询

GET xing/user/_search?q=name:itxing ##name精确匹配

复杂操作

排序、分页、高亮、模糊查询、精准查询

GET xing/user/_search
{
  "query": {
    "match": {
      "name": "itxing"
    }
  }
}

查询自定义字段的信息

GET xing/user/_search
{
  "query": {
    "match": {
      "name": "itxing"
    }
  },
  "_source": ["name","desc"]
}

对匹配的结果进行升序(asc)或降序(desc)排序,以及对数据分页,起始页以及每页显示的数据条数。

GET xing/user/_search
{
  "query": {
    "match": {
      "name": "itxing"
    }
  },
  "sort": [
    {
      "age": {
      "order": "asc"
       }
    }
  ],
  "from": 0,
  "size": 1
}

使用rust风格的分页: /search/{current}/{pagesize}

多条件查询,使用布尔值进行查询

must命令:多个条件全部符合,是一个且的关系

GET xing/user/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "name": "itxing"
          }
        },
        {
          "match":{
            "age": 26
          }
        }
        ]
    }
  }
}

should命令:多个条件只要符合一个就将其返回,是一个或的关系

must_not命令: 多个命令不符合的,相当于非的关系

过滤器

GET xing/user/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "name": "itxing"
          }
        }
        ],
        "filter": [
          {
            "range": {
              "age": {
                "lt": 26
              }
            }
          }
        ]
    }
  }
}

gt 大于

gte 大于等于

lt 小于

lte 小于等于

匹配多个条件,多个条件使用空格分开

GET xing/user/_search
{
  "query": {
   "match": {
     "tags": "男 技术"
   }
  }
}

精确查询

term命令:直接通过倒排序索引指定的词条进程精确查找的

关于分词:term直接查询精确的值 match会使用分词器解析(先分析文档,然后再通过分析的文档进行查询)

两个类型(重要)

text类型和keyword类型

//该分词不会将text中的内容拆分进行处理
GET _analyze
{
  "analyzer": "keyword",
  "text": "itxing学java"
}
//该分词将每个字符拆分进行处理
GET _analyze
{
  "analyzer": "standard",
  "text": "itxing学java"
}

keyword类型的字段不会被分词器解析

多个值精确匹配解析

GET testdb/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "term": {
            "t1": "22"
          }
        },
        {
          "term": {
            "term": {
              "t2": "25"
            }
          }
        }
      ]
    }
  }
}

高亮查询

GET xing/user/_search
{
  "query": {
    "match": {
      "name": "itxing学java"
    }
  },
  "highlight": {
    "fields": {
      "name": {}
    }
  }
}

自定义高亮条件

GET xing/user/_search
{
  "query": {
    "match": {
      "name": "itxing学java"
    }
  },
  "highlight": {
    "pre_tags": "<p class='key' style='color:red'>", 
    "post_tags": "</p>", 
    "fields": {
      "name": {}
    }
  }
}

文章作者: it星
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 it星 !
 上一篇
ElasticSearch(二) ElasticSearch(二)
it星
1. ES继承SpringBoot自学一门技术首先去官方文档找资料。 ES客户端官网 一般使用高级客户端的文档:7.6的文档传送门 1.1 获取ESmaven依赖<dependency> <groupId>org.ela
2020-07-19
下一篇 
计算机的相关知识点 计算机的相关知识点
计算机中的相关知识点(较杂)注:为了面试将计算机底层知识进行相关复习 计算机的由来(听的是马老师的公开,讲的计算机的底层,但是课程较短) cpu制作过程:沙子+铜+胶水+特定的工艺+特殊金属 沙子脱氧-》石英-》二氧化硅-》提纯-》硅锭-
  目录