Elasticsearch第二谈(ES核心概念、ES简单操做、构建查询、查询结果过滤排序分页、term和match查询区别、自定义查询结果高亮)

写博客便是为了记录本身的学习历程,也但愿可以结交志同道合的朋友一块儿学习。文章在撰写过程当中不免有疏漏和错误,欢迎指出文章的不足之处;更多内容请点进👉爱敲代码的小游子👈查看。
临渊羡鱼,不如退而结网。一块儿加油!java

Elasticsearch相关概念

一、Elasticsearch面向文档、关系行数据库、和Elasticsearch对比

Elasticsearch的文件存储,Elasticsearch是面向文档型数据库,一条数据在这里就是一个文档,用JSON做为文档序列化的格式git

关系数据库      ⇒ 数据库       ⇒  表         	 ⇒ 行            ⇒ 列(Columns)
 
Elasticsearch  ⇒ 索引(Index) ⇒  文档(Docments) ⇒ 字段(Fields)  ⇒类型(至关于一个类,把同一类的索引保存)

二、文档

Elasticsearch是面向文档的,索引和搜索数据最小单位是文档,Elasticsearch中文档重要的属性:github

  • 自我包含、一篇文档同时包含字段和对应的值,key:value
  • 能够是层次的,一个文档中包含自文档(就是一个json对象,fastjson进行自动转换)
  • 灵活的结构,文档不依赖于预先定义的模式

三、类型

类型是文档的逻辑容器,就像关系型数据库,表格是行的容器。类型中对于字段的定义称为映射,好比name映射为字符串类型。文档是无模式的,它不须要有映射中定义的全部字段;web

四、索引

可理解为数据库
索引是映射类型的容器,Elasticsearch中的索引是一个很是大的文档集合。索引存储了映射类型中的字段和其余设置。而后他们被保存到了各个分片上算法

物理设计:节点和分片 如何工做?数据库

  • 一个集群至少有一个节点,而一个节点就是一个Elasticsearch进程,节点能够有多个索引默认的,若是你建立一个索引,那么索引将会有5个分片(主分片),每个分片会有一个副本(赋值分片)

五、分片

到了必定数量级,索引文件就会占满整个服务器的磁盘,磁盘容量只是其中一个问题,索引文件变的大,会严重下降搜索的效率。怎么解决这个问题呢json

  • 分片就是用来解决这些问题的,简单来说,分片就是把单索引文件分红多份存储,且这些索引的分片能够分部在不一样的机器上。假设单台机器磁盘容量1TB,如今须要存放5TB的索引数据,那就能够把5TB索引分红10份,分别存放到10台机器上每份500G,这就是所谓的倒排索引

Elasticsearch 使用一种称为 倒排索引 的结构,它适用于快速的全文搜索。一个倒排索引由文档中全部不重复词的列表构成,对于其中每一个词,有一个包含它的文档列表。
例如,假设咱们有两个文档,每一个文档的 content 域包含以下内容:bash

  • The quick brown fox jumped over the lazy dog
  • Quick brown foxes leap over lazy dogs in summer

为了建立倒排索引,首先要将每一个文档拆分红独立的词,而后建立一个包全部不重复的词条排序列表,而后列出每一个词条出如今哪一个文档:
image.png
如今查询to forever,只须要查看包含每一个词条的文档
image.png
在这里插入图片描述服务器

IK分词器

一、什么是ik分词器:

分词:即把一段中文或者别的划分红一个个的关键字,咱们在搜索时候会把本身的信息进行分词,会把数据库中或者索引库中的数据进行分词,而后进行一个匹配操做app

默认的中文分词是将每一个字当作一个词,好比"中国的花"会被分为"中",“国”,“的”,“花”,这显然是不符合要求的,因此咱们须要安装中文分词器ik来解决这个问题。

IK提供了两个分词算法ik_smart 和 ik_max_word,其中 ik_smart 为最少切分,ik_max_word为最细粒度划分

二、安装

地址:https://github.com/medcl/elasticsearch-analysis-ik

image.png
解压到Elasticsearch安装目录中的plugins中便可
image.png

三、重启观察es

image.png

四、使用elasticsearch-plugin查看插件

image.png

五、使用Kibana测试

GET _analyze
{
  "analyzer": "ik_max_word",
  "text": ["爱敲代码的小游子"]
}

image.png

六、ik分词器增长本身的配置

问题:自定义的词,“小游子”被拆开了

须要本身加入分词器的字典中
image.png
新建分词词典(注意dic文件存储要使用UTF-8才能生效),引入

image.png

重启es

image.png

执行查询操做

image.png

Rest风格

image.png

1、操做索引

一、建立一个索引

PUT /索引名/~文档类型~/文档id
	{
		请求体
	}

在这里插入图片描述
在这里插入图片描述

二、数据类型

image.png

三、指定字段的类型

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

image.png

四、得到规则信息

GET 索引名

在这里插入图片描述

五、查看默认的信息

image.png

六、扩展命令

  • 查看es信息

GET _cat/…

  • 查看索引信息
GET _cat/indices?v

在这里插入图片描述

七、修改索引

  1. 可使用PUT提交,覆盖以前的设置
    改掉须要修改的参数值便可(不论是否修改,全部的参数值都必须有,若是没有,修改后就为空)
PUT /yky/user/0001
{
  "name":"爱敲代码的小游子",
  "age":20,
  "tag":["爱敲代码","Java大佬","offer收割机"]
}

在这里插入图片描述

  1. post方式修改
    只须要写出须要修改的参数值便可
POST /库名/类型/文档id/_update

{
	"doc": {
		参数
	}
}

在这里插入图片描述

八、删除索引

image.png

2、文档的基本操做

一、添加数据

PUT /索引名/类型/id
{
  参数体
}

二、获取数据

GET 索引名/类型/id

在这里插入图片描述

三、更新数据

  • PUT
  • POST _update
#新增
PUT /yky/user/003
{
  "name": "李四",
  "age": 22,
  "desc": "很强",
  "tags": ["初中生","c大佬","暖男"]
}

#查询
GET /yky/user/001

#更新数据
POST /yky/user/001/_update
{
  "doc":{
    "name": "爱敲代码的小游子"
  }
}

四、条件查询

GET 索引名/类型/_search?q=key:value

在这里插入图片描述

3、花式查询

一、使用Query DSL

其输出和上面使用/_search?q=john的输出同样。上面的multi_match关键字一般在查询多个fields的时候做为match关键字的简写方式。fields属性指定须要查询的字段,若是咱们想查询全部的字段,这时候可使用_all关键字,正如上面的同样。以上两种方式都容许咱们指定查询哪些字段

GET /yky/user/_search
{
  "query":{
    "match": {
      "FIELD": "TEXT"
    }
  }
}

在这里插入图片描述

二、构建的查询

image.png

三、结果的过滤

image.png

GET yky/user/_search
{
  "query": {
    "match": {
      "name": "小游子"
    }
  },
  "_source": ["name","age"]
}

四、排序

GET yky/user/_search
{
  "query": {
    "match": {
      "name": "小游子"
    }
  },
  "sort": [
    {
      "age": {
        "order": "desc"
      }
    }
  ]
}

四、分页查询

"from": 从第几条诗句开始显示(从0开始),
 "size": 每页显示数据条数,
 "sort": 排序,

image.png
数据下标从0开始

能够进行多条件查询

must == > and ==> 全部条件都要符合

image.png

GET yky/user/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "name": "小游子"
          }
        },
        {
          "match": {
            "age": 20
          }
        }
      ]
    }
  }
}

should ==> or

GET /yky/user/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "match": {
            "name": "小游子"
          }
        },
        {
          "match": {
            "name": "yky"
          }
        }
      ]
    }
  }
}

must_not ==> not

查询不知足全部条件的数据
image.png

六、过滤器

  • lt小于
  • gt大于
  • gte大于等于
  • lte小于等于

在这里插入图片描述

"filter": [{
   "range": {
      "age": {
         "gt": 0,
        "lte": 100
      }
    }
  }]

七、匹配多个条件

多个条件只要知足一个就能查询

image.png

GET /yky/user/_search
{
  "query":{
    "match": {
      "参数名": "条件一 条件二"
    }
  }
}

八、精确查询

term查询直接经过倒排索引指定的词条查询的

  • 分词:term直接查询精确的

  • match:会使用分词器解析,先分析文档

两个类型:text keyword ==》 text类型能够被分词器解析,keyword类型不会被分词器解析

term和match查询区别

一、match查询

match的查询匹配就会进行分词,好比"爱敲代码的的小游子"会被分词为"爱 敲 代码 的 小 游子", 全部有关"爱 敲 代码 的 小 游子", 那么全部包含这三个词中的一个或多个的文档就会被搜索出来。
而且根据lucene的评分机制(TF/IDF)来进行评分。

二、term查询

term是表明彻底匹配,即不进行分词器分析,文档中必须包含整个搜索的词汇

九、多个值精确查询

在这里插入图片描述

十、高亮查询

GET yky/user/_search
{
  "query": {
    "match": {
      "name": "小游子"
    }
  },
  "highlight": {
    "fields": {
      "name": {}
    }
  }
}

十一、自定义搜索高亮查询

GET yky/user/_search
{
  "query": {
     "match": {
      "name": "小游子"
    }
  },
  "highlight": {
    "pre_tags": "<p class='key'style='color:red'>", 
    "post_tags": "</p>", 
    "fields": {
      "name": {}
    }
  }
}

image.png