ElasticSearch基本api操作

ElasticSearch

本文章下列所用es本意都为Elaticsearch

ElasticSearch概述

Elaticsearch ,简称为es, es是一 个开源的高扩展的分布式全文检索引擎,它可以近乎实时的存储、检索数据;本身扩展性很好,
可以扩展到上百台服务器,处理PB级别(大数据时代)的数据。es也使用Java开发并使用Lucene作为其核心来实现所有索弓和搜
索的功能,但是它的目的是通过简单的RESTful API来隐藏Lucene的复杂性,从而让全文搜索变得简单。
据国际权威的数据库产品评测机构DB Engines的统计,在2016年1月, ElasticSearch已超过Solr等,成为排名第一-的搜索引擎类应
用。

安装ElasticSearch

官网地址

https://www.elastic.co/cn/downloads/elasticsearch

ElasticSearch基本api操作_第1张图片

目录结构

ElasticSearch基本api操作_第2张图片

bin 启动文件
config 配置文件
 log4j2日 志配置文件
 jvm. options java 虚拟机相关的配置
 elasticsearch. ym1 elasticsearch的配置文件!默认 9200端口!跨域!
1ib 相关jar包
1ogs 日志!
modules 功能模块
plugins插件! ik

进入bin文件夹启动elasticsearch.bat

访问http://localhost:9200

ElasticSearch基本api操作_第3张图片

安装elasticsearch-head插件

1.安装

GitHub地址https://github.com/mobz/elasticsearch-head

ElasticSearch基本api操作_第4张图片

2.启动

npm install
npm run start

3.连接测试发现,存在跨域问题:配置es

在这里插入图片描述

在config文件夹的elasticsearch.yml文件中添加

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

访问http://localhost:9100/

4.重启es再次连接

ElasticSearch基本api操作_第5张图片

安装Kibana

Kibana是一个针对Elasticsearch的开源分析及 可视化平台,用来搜索、查看交互存储在Elasticsearch索引中的数据。 使用Kibana ,
可以通过各种图表进行高级数据分析及展示。Kibana让海 量数据更容易理解。它操作简单,基于浏览器的用户界面可以快速创建仪
表板( dashboard )实时显示Elasticsearch查询动态。设置Kibana非常简单。无需编码或者额外的基础架构,几分钟内就可以完成
Kibana安装并启动Elasticsearch索弓|监测。
官网: https://www.elastic.co/cn/kibana

ElasticSearch基本api操作_第6张图片

1.启动kibana.bat

ElasticSearch基本api操作_第7张图片

2.访问5601端口

3.开发工具!( Post、 curl、head、谷歌浏览器插件测试! )

4.汉化

找到zh-cn.json,这里是汉化文件
ElasticSearch基本api操作_第8张图片

ElasticSearch基本api操作_第9张图片

在kibana.yml中添加

i18n.locale: "zh-CN"

ES核心概念

elasticsearch是面对文档,这里与关系型数据库进行对比

Relational Database elasticsearch
数据库(database) 索引(indices)
表(tables) types
行(rows) documents
字段(columns) fields

elasticsearch(集群)中可以包含多个索引(数据库) ,每个索引中可以包含多个类型(表) ,每个类型下又包含多个文档(行) ,每个文档中又包含多个字段(列)。.

物理设计

es在后台把每个索引划分为多个分片,每个分片可以在集群中的不同服务器间迁移

默认名称就是es

逻辑设计

一个索引类型中,包含多个文档,比如说文档1,文档2。当我们索引一 篇文档时,可以通过这样的一各顺序找到它:索引D类型
D文档ID,通过这个组合我们就能索引到某个具体的文档。 注意:ID不必是整数,实际上它是个字符串。

文档

elasticsearch是面向文档的,意味着索引和搜索数据的最小单位是文档, elasticsearch中,文档有几个重要属性:
自我包含,一篇文档同时包含字段和对应的值,也就是同时包含key:value !
可以是层次型的,一个文档中包含自文档,复杂的逻辑实体就是这么来的! {就是一个json对象 ! fastjson进行自动转换 ! }
灵活的结构,文档不依赖预先定义的模式,我们知道关系型数据库中,要提前定义字段才能使用,在elasticsearch中,对于字段是非常灵活的,有时候,我们可以忽略该字段,或者动态的添加一个新的字段。

尽管我们可以随意的新增或者忽略某个字段,但是,每个字段的类型非常重要,比如一个年龄字段类型,可以是字符串也可以是整
形。因为elasticsearch会保存字段和类型之间的映射及其他的设置。这种映射具体到每个映射的每种类型,这也是为什么在
elasticsearch中,类型有时候也称为映射类型。

类型

类型是文档的逻辑容器,就像关系型数据库一样,表格是行的容器。类型中对于字段的定义称为映射,比如name映射为字符串
类型。我们说文档是无模式的 ,它们不需要拥有映射中所定义的所有字段,比如新增一个字段,那么elasticsearch是怎么做的呢?

答:

elasticsearch会自动的将新字段加入映射,但是这个字段的不确定它是什么类型, elasticsearch就开始猜,如果这个值是18 ,那么
elasticsearch会认为它是整形。但是elasticsearch也可能猜不对 ,所以最安全的方式就是提前定义好所需要的映射,这点跟关系
型数据库殊途同归了,先定义好字段,然后再使用.

索引(可以理解为数据库)

索引是映射类型的容器, elasticsearch中的索引是一个非常大的文档集合。索引存储了映射类型的字段和其他设置。然后它们被存储到了各个分片上

物理设计

节点和分片,如何工作的

一个集群至少有一一个节点,而一个节点就是一个elasricsearch进程 ,节点可以有多个索引默认的,如果你创建索引,那么索弓|将会
有个5个分片( primary shard ,又称主分片)构成的,每一个主分片会有一 个副本 ( replica shard,又称复制分片)

ElasticSearch基本api操作_第10张图片

上图是一个有3个节点的集群 ,可以看到主分片和对应的复制分片都不会在同-个节点内,这样有利于某个节点挂掉了,数据也不
至于丢失。实际上, 一个分片是一个Lucene索引 , 一个包含倒排索引的文件目录,倒排索引的结构使得elasticsearch在不扫描全部文档的情况下,就能告诉你哪些文档包含特定的关键字。

倒排索引

elasticsearch使用的是一种称为倒排索引的结构 |采用Lucene倒排索作为底层这种结构适用于快速的全文搜索,一个索引由文档中所有不重复的列表构成,对于每一个词,都有一个包含它的文档列表。例如,现在有两个文档,每个文档包含如下内容:

Study every day, good good up to forever
To forever study every day,good good up

ElasticSearch基本api操作_第11张图片

搜索to forever 只需要查看包含每个词条的文档(很明显,doc_1中的内容权重更高)
ElasticSearch基本api操作_第12张图片

两个文档都匹配,但是第一一个文档比第二个匹配程度更高。如果没有别的条件,现在,这两个包含关键字的文档都将返回。
再来看一个示例,比如我们通过博客标签来搜索博客文章。那么倒排索弓列表就是这样的一个结构:
ElasticSearch基本api操作_第13张图片

如果要搜索含有python标签的文章,那相对于查找所有原始数据而言,查找倒排索引后的数据将会快的多。只需要查看标签这一栏,然后获取相关的文章ID即可。
elasticsearch的索引和Lucene的索引对比
在elasticsearch中,索引这个词被频繁使用,这就是术语的使用。在elasticsearch中 ,索引被分为多个分片,每份分片是一个Lucene的索引。所以一个elasticsearch索引是由多 个Lucene索引组成的。

IK分词器插件

下载

官网链接

https://github.com/medcl/elasticsearch-analysis-ik/releases

解压到es下plugins下
ElasticSearch基本api操作_第14张图片

2.新建ik文件夹把解压内容移到ik文件夹,然后重启es

ElasticSearch基本api操作_第15张图片

3.使用kibana测试(查看不同分词效果)

ik_smart

#会做最粗粒度的拆分 ik_smart
GET _analyze 
{
   "analyzer": "ik_smart",
   "text": "陈平安"
}

输出结果

{
  "tokens" : [
    {
      "token" : "陈",
      "start_offset" : 0,
      "end_offset" : 1,
      "type" : "CN_CHAR",
      "position" : 0
    },
    {
      "token" : "平安",
      "start_offset" : 1,
      "end_offset" : 3,
      "type" : "CN_WORD",
      "position" : 1
    }
  ]
}

ik_max_word

#会将文本做最细粒度的拆分 ik_max_word
GET _analyze 
{
   "analyzer": "ik_max_word",
   "text": "陈平安"
}

输出结果

{
  "tokens" : [
    {
      "token" : "陈平",
      "start_offset" : 0,
      "end_offset" : 2,
      "type" : "CN_WORD",
      "position" : 0
    },
    {
      "token" : "平安",
      "start_offset" : 1,
      "end_offset" : 3,
      "type" : "CN_WORD",
      "position" : 1
    }
  ]
}

自己想要的词组被拆开了怎么办呢

配置自定义字典

进入ik文件夹下config下的IKAnalyzer.cfg.xml
ElasticSearch基本api操作_第16张图片

ElasticSearch基本api操作_第17张图片

在config目录下新建一个文本,修改后缀为dic

ElasticSearch基本api操作_第18张图片

ElasticSearch基本api操作_第19张图片

添加你所需要的词组,然后进入IKAnalyzer.cfg.xml把你刚新建的文件写入,再重启es

ElasticSearch基本api操作_第20张图片

es启动的时候会加载我们的dic文件
在这里插入图片描述

再次查询

ElasticSearch基本api操作_第21张图片

Rest风格说明

基本Rest命令说明

ElasticSearch基本api操作_第22张图片

创建索引

PUT /text1/type1/1
{
  "name":"陈平安",
  "age":14
}

ElasticSearch基本api操作_第23张图片

使用ElasticSearch-head查看
ElasticSearch基本api操作_第24张图片

3、那么name这个字段用不用指定类型呢。毕竟我们关系型数据库是需要指定类型的

字符串类型
text、keyword
数值类型
long. integer, short, byte, double, float,. half float. scaled float
日期类型
date
布尔值类型
boolean
二进制类型
binary

指定具体规则

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

ElasticSearch基本api操作_第25张图片

通过get请求获得具体信息

get /

ElasticSearch基本api操作_第26张图片

通过post修改具体信息

POST /text3/_doc/1/_update
{
  "doc":{
    "name":"陈平安和宁姚"
  }
}

ElasticSearch基本api操作_第27张图片

修改会覆盖当前

版本号增加

状态改变

ElasticSearch基本api操作_第28张图片

使用delete删除具体信息

DELETE /text1/type1/1

ElasticSearch基本api操作_第29张图片

通过post查询所有

POST chenpingan/user/_search

ElasticSearch基本api操作_第30张图片

查看默认信息

PUT /text3/_doc/1
{
  "name":"陈平安",
  "age":14,
  "birth":"2003-05-26"
}

ElasticSearch基本api操作_第31张图片

如果文档字段未指定类型,es系统会默认配置字段类型

ElasticSearch基本api操作_第32张图片

其他命令

GET _cat/indices?v查看所有文档

关于文档的基本操作

新增put

PUT /chenpingan/user/1
{
  "name":"陈平安",
  "age":14,
  "desc":"家住泥瓶巷",
  "tags":["打拳","练符","去倒悬山"]
}

PUT /chenpingan/user/2
{
  "name":"宁姚",
  "age":14,
  "desc":"家住剑气长城",
  "tags":["练剑","杀妖","飞升"]
}

查询get

GET chenpingan/user/1

ElasticSearch基本api操作_第33张图片

修改put和post

ElasticSearch基本api操作_第34张图片

PUT /chenpingan/user/1
{
  "name":"陈平安",
  "age":14,
  "desc":"住泥瓶巷",
  "tags":["打拳","练符","去倒悬山"]
}



POST chenpingan/user/1/_update
{
  "doc":{
    "desc":"去往剑气长城"
  }
}
put如果不传递值就会被覆盖,也就是置空

查询

简单搜索

根据默认的映射规则,产生基本的查询

GET chenpingan/user/1

条件模糊查询

GET chenpingan/user/_search?q=name:陈平安
      查询什么库              q查询      查询条件

ElasticSearch基本api操作_第35张图片

复杂操作select(排序,分页,高亮,模糊,精确查询)

查询匹配

这是官方的例子
GET /_search
{
  "query": {
    "match": {
      "message": "this is a test"
    }
  }
}

这样可以更能理解 匹配索引中name中包括"陈平安"的文档
GET /_search
{
  "query": {
    "match": {
      "name": "陈平安"
    }
  }
}

ElasticSearch基本api操作_第36张图片

查询的参数体使用json构造

GET chenpingan/user/_search
{
  "query": {
    "match": {
      "name": "陈平安"
    }
  }
}

通过_score属性来判断谁更加符合结果

ElasticSearch基本api操作_第37张图片

通过_sourc只显示匹配的name和desc值(结果过滤)

GET chenpingan/user/_search
{
  "query": {
    "match": {
      "name": "陈平安"
    }
  },
   "_source": ["name","desc"]
}

ElasticSearch基本api操作_第38张图片

排序

通过sort

#通过age年龄进行升序排序
GET chenpingan/user/_search
{
  "query": {
    "match": {
      "name": "陈平安"
    }
  },
  "sort": [
    {
    
      "age": {
        "order": "desc"
      }
    }
  ]
 
}

ElasticSearch基本api操作_第39张图片

分页

from 从第几条开始

size 返回多少条数据(单页面)

GET chenpingan/user/_search
{
  "query": {
    "match": {
      "name": "陈平安"
    }
  },
 
  "from": 0,
  "size": 2
 
}

通过age升序排序后分页
GET chenpingan/user/_search
{
  "query": {
    "match": {
      "name": "陈平安"
    }
  },
  "sort": [
    {
      "age": {
        "order": "desc"
      }
    }
  ],
  
  "from": 0,
  "size": 2
 
}

ElasticSearch基本api操作_第40张图片

布尔值查询

"()"里面是等价于mysql中的操作

must(and) 所有条件都需要符合

多条件精确查询

GET chenpingan/user/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "name": "陈平安"
          }
        },
      {
        "match": {
          "desc": "去往剑气长城"
        }
      }
      ]
    }
  }
}

ElasticSearch基本api操作_第41张图片

should(or)两个条件满足其一
GET chenpingan/user/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "match": {
            "name": "陈平安"
          }
        },
      {
        "match": {
          "desc": "去往剑气长城"
        }
      }
      ]
    }
  }
}

ElasticSearch基本api操作_第42张图片

must_not(not) 禁止该数据

ElasticSearch基本api操作_第43张图片

filter过滤

gt 大于

gte 大于等于

lt 小于

lte 小于等于

查询name中有陈平安并且age大于等于3
GET chenpingan/user/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "name": "陈平安"
          }
        }
    
      ]
      , "filter": {
        "range": {
          "age": {
            "gte": 3
          
          }
        }
      }
    }
  }
}

ElasticSearch基本api操作_第44张图片

查询name中有陈平安并且过滤age大于等于3小于15

使用多个条件进行过滤
ElasticSearch基本api操作_第45张图片

多条件查询

查询tags中含有"去","练符"的文档

GET chenpingan/user/_search
{
  "query": {
    "match": {
      "tags": "去 练符"
    }
  }
}	

ElasticSearch基本api操作_第46张图片

只要满足其中一个结果即可被查出,这个时候可以通过分值进行基本的判断

精确查询

term查询是直接通过倒排索引指定的词条进程精确的查找的!|

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

两个类型 text keyword

_analyze默认分词器

analyzer 手动设置分词器

keyword 字段不会被分词器拆分来解析会作为一个整体

PUT testdb
{
  "mappings": {
    "properties": {
      "name":{
        "type": "text"
      },
      "desc":{
        "type": "keyword"
      }
    }
  }
}


PUT testdb/_doc/1
{
  "name":"陈平安 name",
  "desc":"陈平安 name"
}

PUT testdb/_doc/2
{
  "name":"陈平安 name",
  "desc":"陈平安 name2"
}


GET _analyze
{
  "analyzer": "keyword"
  , "text": "陈平安"
}


GET _analyze
{
  "analyzer": "standard"
  , "text": "陈平安"
}

ElasticSearch基本api操作_第47张图片

text 单字拆分

ElasticSearch基本api操作_第48张图片

使用term精确解析

keyword 字段不会被分词器拆分来解析会作为一个整体

GET testdb/_search
{
  "query": {
    "term": {
      "name": "陈"
    }
  }
}

GET testdb/_search
{
  "query": {
    "term": {
      "desc": "陈平安 name2"
    }
  }
}

通过name查询

ElasticSearch基本api操作_第49张图片

通过desc查询

ElasticSearch基本api操作_第50张图片

精确查询多个值

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

ElasticSearch基本api操作_第51张图片

高亮查询

默认高亮
GET chenpingan/user/_search
{
  "query": {
    "match": {
      "name": "陈平安"
    }
  },
  "highlight": {
    "fields": {
      "name":{}
    }
  }
}

ElasticSearch基本api操作_第52张图片

自定义搜索高亮条件
GET chenpingan/user/_search
{
  "query": {
    "match": {
      "name": "陈平安"
    }
  },
  "highlight": {
    "pre_tags": "

", "post_tags": "

", "fields": { "name":{} } } }

ElasticSearch基本api操作_第53张图片所学习ElasticSearch基本操作就这些,集成springboot的笔记下次更新
该文章基于"狂神说"学习

你可能感兴趣的:(elasticsearch,搜索引擎,大数据)