代码编织梦想

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

在这里插入图片描述

目录结构

在这里插入图片描述

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

进入bin文件夹启动elasticsearch.bat

访问http://localhost:9200

在这里插入图片描述

安装elasticsearch-head插件

1.安装

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

在这里插入图片描述

2.启动

npm install
npm run start

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

在这里插入图片描述

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

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

访问http://localhost:9100/

4.重启es再次连接

在这里插入图片描述

安装Kibana

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

在这里插入图片描述

1.启动kibana.bat

在这里插入图片描述

2.访问5601端口

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

4.汉化

找到zh-cn.json,这里是汉化文件
在这里插入图片描述

在这里插入图片描述

在kibana.yml中添加

i18n.locale: "zh-CN"

ES核心概念

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

Relational Databaseelasticsearch
数据库(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,又称复制分片)

在这里插入图片描述

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

倒排索引

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

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

在这里插入图片描述

搜索to forever 只需要查看包含每个词条的文档(很明显,doc_1中的内容权重更高)
在这里插入图片描述

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

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

IK分词器插件

下载

官网链接

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

解压到es下plugins下
在这里插入图片描述

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

在这里插入图片描述

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
在这里插入图片描述

在这里插入图片描述

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

在这里插入图片描述

在这里插入图片描述

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

在这里插入图片描述

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

再次查询

在这里插入图片描述

Rest风格说明

基本Rest命令说明

在这里插入图片描述

创建索引

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

在这里插入图片描述

使用ElasticSearch-head查看
在这里插入图片描述

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"
      }
    }
  }
}

在这里插入图片描述

通过get请求获得具体信息

get /

在这里插入图片描述

通过post修改具体信息

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

在这里插入图片描述

修改会覆盖当前

版本号增加

状态改变

在这里插入图片描述

使用delete删除具体信息

DELETE /text1/type1/1

在这里插入图片描述

通过post查询所有

POST chenpingan/user/_search

在这里插入图片描述

查看默认信息

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

在这里插入图片描述

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

在这里插入图片描述

其他命令

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

在这里插入图片描述

修改put和post

在这里插入图片描述

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查询      查询条件

在这里插入图片描述

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

查询匹配

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

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

在这里插入图片描述

查询的参数体使用json构造

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

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

在这里插入图片描述

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

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

在这里插入图片描述

排序

通过sort

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

在这里插入图片描述

分页

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
 
}

在这里插入图片描述

布尔值查询

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

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

多条件精确查询

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

在这里插入图片描述

should(or)两个条件满足其一

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

在这里插入图片描述

must_not(not) 禁止该数据

在这里插入图片描述

filter过滤

gt 大于

gte 大于等于

lt 小于

lte 小于等于

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

在这里插入图片描述

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

使用多个条件进行过滤
在这里插入图片描述

多条件查询

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

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

在这里插入图片描述

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

精确查询

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": "陈平安"
}

在这里插入图片描述

text 单字拆分

在这里插入图片描述

使用term精确解析

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

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

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

通过name查询

在这里插入图片描述

通过desc查询

在这里插入图片描述

精确查询多个值


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

在这里插入图片描述

高亮查询

默认高亮

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

在这里插入图片描述

自定义搜索高亮条件

GET chenpingan/user/_search
{
  "query": {
    "match": {
      "name": "陈平安"
    }
  },
  "highlight": {
    "pre_tags": "<p class='key  style='color:red'>", 
    "post_tags": "</p>", 
    "fields": {
      "name":{}
    }
  }
}

在这里插入图片描述所学习ElasticSearch基本操作就这些,集成springboot的笔记下次更新
该文章基于"狂神说"学习

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_51627264/article/details/127913790

elasticsearch api简单操作_张行之的博客-爱代码爱编程_elasticsearch api

Elasticsearch API简单操作 在操作Elasticsearch之前,需要先安装Elasticsearch集群,安装博客如:Elasticsearch集群安装 下面介绍简单介绍Elasticsearch的3中

es 基本api操作使用_小码农叔叔的博客-爱代码爱编程_esapi用法详解

es的操作其实并不难,但是要彻底全面的掌握es,还需要深入的研究其强大的restful查询语法,也称作DSL语法,属于es语言独有,下面我们用一个简单的案例模拟es的增删改查基本操作,体会一下其中的用法, 我们这里有这样一

elasticsearch api 基本操作_天空为伊晴的博客-爱代码爱编程

Elasticsearch API 基本操作 文章目录 Elasticsearch API 基本操作1、与关系型数据库的对应关系2、索引**创建索引****删除索引** 3、mapping创建索引index和

es 文档基本API操作-爱代码爱编程

ES API地址 /** * 所有的请求都是Request */ 1.创建索引 // 索引创建 @Test void createIndex() throws IOException { // 创建索引请求 CreateIndexRequest request = new CreateI

Elasticsearch基本API使用-爱代码爱编程

前面文章介绍了Elasticsearch的搭建,使用Kibana发送指令,使用Elasticsearch-Head监控。本文主要介绍Elasticsearch基本API使用,以及怎么在Elasticsearch-Head监控页面查看Elasticsearch相关的信息。 我们可以通过后台静默启动Elasticsearch,Elasticsearch-He

ES的基本API操作-爱代码爱编程

ElasticSearch ES在使用时,会涉及到五个核心概念:索引(Index)、映射(Mapping)、域(Field)、文档(Document)、倒排索引。 一、索引 1.1 添加索引 (PUT 索引名称) PUT person PUT person1 1.2 查询单个索引 GET person 1.3 查询多个索引 GET p

Postman操作Elasticsearch 7.6 API-爱代码爱编程

1.创建索引 { "settings":{ "index":{ "number_of_shards":5, "number_of_replicas":1 }, "analysis":{ "filter":{ "my_filter":{

ElasticSearch Python API 入门操作-爱代码爱编程

写在前面 最近新接触使用 ElasticSearch 作为基础工具,用途主要是做匹配查询,这也是 ES 的看家本领。本篇不涉及 ES 服务的安装配置等,仅仅是一些入门的记录。 有关 ElasticSearch Python API 的资料主要来自于官网,想要达到入门级别的调用需要: 学习 ES 基本原理,最关键的就是 ES 如何实现搜索,涉及到集群、

JAVA API & Elasticsearch 7.10 基本查询操作(一)-爱代码爱编程

 总结一下最近参与项目学到的知识,不知道自己会不会坚持写Blog(;´д`) 总之先从ES基本操作开始了! 目录 AND查询 OR查询 范围查询 AND查询 List<StudentVO> searchMustStudent(StudentQO studentQO) throws IOException; public

Elasticsearch8.0版本中Elasticsearch Java API Client客户端的基本使用方法-爱代码爱编程

关于Elasticsearch Java API Client客户端如何连接以及如何对索引和文档进行基本的增删改查操作请查看我的上一篇博文:Elasticsearch RestHighLevelClient 已标记为被弃用 它的替代方案 Elasticsearch Java API Client 的基础教程及迁移方案_无枫的博客,分享Java及Vue

esApi基本概念和操作-爱代码爱编程

public static void main(String[] args) { String keyword = ""; //构建一个查询器 BoolQueryBuilder mainQuery = QueryBuilders.boolQuery(); //filter类似于MySql里的a

ElasticSearch Java API之文档操作-爱代码爱编程

文档Document简单介绍 被索引的一条数据,索引的基本信息单元,以JSON格式来表示。 比如:你可以拥有某一个客户的文档,某一个产品的一个文档,当然,也可以拥有某个订单的一个文档。文档以 JSON(Javascript Object Notation)格式来表示, JSON数据适合互联网数据交互。 在一个 index/type 里面,你可以存储任

Elasticsearch专栏-3.es基本用法-基础api-爱代码爱编程

索引index增删改查 在es7以后,已经不存在type,所以直接创建索引即可。以es_index_test举例。演示用kibana,左侧为api,右侧为结果。 增 PUT /es_index_test { "mappings": { "properties": { "name": { "type": "text" },

elasticsearch python api教程_小猫不会去楼兰捉虫的博客-爱代码爱编程

目录 一、安装es python包 二、python API 基本使用 1. 创建es客户端连接 2. 创建索引 3. 插入数据 4. 删除索引 5. 查询 5.1 条件查询: match、match_all 5.2 条件查询: term、terms 5.3 条件查询: 指定页码和大小 5.4 range查询  5.5 bo

elasticsearch7.6.2基本的api使用记录_elasticsearch 7.6.2api文档-爱代码爱编程

package com.jacob.es_api; import com.alibaba.fastjson.JSON; import com.jacob.es_api.pojo.User; import org.apach