史上最全的ElasticSearch系列之基础(一)(上)

简介: 前言文本已收录至我的GitHub仓库,欢迎Star:github.com/bin39232820…种一棵树最好的时间是十年前,其次是现在

前言


文本已收录至我的GitHub仓库,欢迎Star:github.com/bin39232820…

种一棵树最好的时间是十年前,其次是现在

絮叨


昨天把ES的介绍,安装完成了,接下来就得好好讲讲ES了,这个东西,我都不知道能写多少,反正我学一点我就写一点,这个系列,估计是一直会有迭代的,就是相当于一个产品一直是再更新了,只是更新时间不确定,哈哈,但是最基础的东西,还有一些应付面试的底层原理我这边,肯定会讲到了,至于说源码,我现在一行代码也没看过,但是万一哪天有机会,我还是会写的,下面是前面的系列文章


Elasticsearch的核心概念


近实时

近实时,两个意思,从写入数据到数据可以被搜索到有一个小延迟(大概1秒);基于es执行搜索和分析可以达到秒级。


Cluster(集群)

集群包含多个节点,每个节点属于哪个集群是通过一个配置(集群名称,默认是elasticsearch)来决定的,对于中小型应用来说,刚开始一个集群就一个节点很正常


Node(节点)

集群中的一个节点,节点也有一个名称(默认是随机分配的),节点名称很重要(在执行运维管理操作的时候),默认节点会去加入一个名称为“elasticsearch”的集群,如果直接启动一堆节点,那么它们会自动组成一个elasticsearch集群,当然一个节点也可以组成一个elasticsearch集群。


Index(索引-数据库)

索引包含一堆有相似结构的文档数据,比如可以有一个客户索引,商品分类索引,订单索引,索引有一个名称。一个index包含很多document,一个index就代表了一类类似的或者相同的document。比如说建立一个product     index,商品索引,里面可能就存放了所有的商品数据,所有的商品document。


索引(index)类似于关系型数据库里的“数据库”——它是我们存储和索引关联数据的地方。

提示:

事实上,我们的数据被存储和索引在分片(shards)中,索引只是一个把一个或多个分片分组在一起的逻辑空间。然而,这只是一些内部细节——我们的程序完全不用关心分片。对于我们的程序而言,文档存储在索引(index)中。剩下的细节由Elasticsearch关心既可。

我们唯一需要做的仅仅是选择一个索引名。这个名字必须是全部小写,不能以下划线开头,不能包含逗号


Type(类型-表)

每个索引里都可以有一个或多个type,type是index中的一个逻辑数据分类,一个type下的document,都有相同的field,比如博客系统,有一个索引,可以定义用户数据type,博客数据type,评论数据type。


商品index,里面存放了所有的商品数据,商品document

但是商品分很多种类,每个种类的document的field可能不太一样,比如说电器商品,可能还包含一些诸如售后时间范围这样的特殊field;生鲜商品,还包含一些诸如生鲜保质期之类的特殊field 例如

  • 日化商品type:product_id,product_name,product_desc,category_id,category_name
  • 电器商品type:product_id,product_name,product_desc,category_id,category_name,service_period
  • 生鲜商品type:product_id,product_name,product_desc,category_id,category_name,eat_period


Document(文档-行)

文档是es中的最小数据单元,一个document可以是一条客户数据,一条商品分类数据,一条订单数据,通常用JSON数据结构表示,每个index下的type中,都可以去存储多个document。


Field(字段-列)

Field是Elasticsearch的最小单位。一个document里面有多个field,每个field就是一个数据字段。


mapping(映射-约束)

数据如何存放到索引对象上,需要有一个映射配置,包括:数据类型、是否存储、是否分词等。


这样就创建了一个名为blog的Index。Type不用单独创建,在创建Mapping 时指定就可以。Mapping用来定义Document中每个字段的类型,即所使用的 analyzer、是否索引等属性,非常关键等。创建Mapping 的代码示例如下:


client.indices.putMapping({
    index : 'blog',
    type : 'article',
    body : {
        article: {
            properties: {
                id: {
                    type: 'string',
                    analyzer: 'ik',
                    store: 'yes',
                },
                title: {
                    type: 'string',
                    analyzer: 'ik',
                    store: 'no',
                },
                content: {
                    type: 'string',
                    analyzer: 'ik',
                    store: 'yes',
                }
            }
        }
    }
});
复制代码


上面就是es的基本要使用的概念,既然我们把它当作一个数据库,那么我就直接把它和mysql对比一下吧

elasticsearch与数据库的类比


关系型数据库(比如Mysql) 非关系型数据库(Elasticsearch)
数据库Database 索引Index
表Table 类型Type
数据行Row 文档Document
数据列Column 字段Field
约束 Schema 映射Mapping

ES存入数据和搜索数据机制


我用白话来说说这个意思吧,首先把数据分词存储,每个词都是一个索引,每个索引都可以找到这个数据,通过数据存储的时候形成一个倒排索引,用来方便查询。


基本使用


使用它很简单,大家做开发的肯定有很多测接口的工具,随便一个就行,今天我们稍微玩玩它的增删改查,不是Java 客户端的玩法,我们先用restApi的方式来操作操作它


首先当然是创建一个索引


语法

PUT /{index}/{type}/{id}
{
  "field": "value",
  ...
}
复制代码


例如我们的索引叫做“website”,类型叫做“blog”,我们选择的ID是“123”,那么这个索引请求就像这样:

PUT /website/blog/123
{
  "title": "My first blog entry",
  "text":  "Just trying this out...",
  "date":  "2014/01/01"
}
复制代码


然后是控制台的返回


上面的例子是自定义id,还可以id自增,只要不传第三个字段就好了

POST /website/blog/
{
  "title": "My second blog entry",
  "text":  "Still trying this out...",
  "date":  "2014/01/01"
}
复制代码



区别再与自增id的话 请求是POST。


检索文档

想要从Elasticsearch中获取文档,我们使用同样的_index、_type、_id,但是HTTP方法改为GET:

GET /website/blog/123
复制代码


响应包含了现在熟悉的元数据节点,增加了_source字段,它包含了在创建索引时我们发送给Elasticsearch的原始文档。

{
  "_index" :   "website",
  "_type" :    "blog",
  "_id" :      "123",
  "_version" : 1,
  "found" :    true,
  "_source" :  {
      "title": "My first blog entry",
      "text":  "Just trying this out...",
      "date":  "2014/01/01"
  }
}
复制代码


GET请求返回的响应内容包括{"found": true}。这意味着文档已经找到。如果我们请求一个不存在的文档,依旧会得到一个JSON,不过found值变成了false。


刚刚是获得全部文档,有的时候我们并不需要全部的字段,只需要一部分,该怎么操作呢?

通常,GET请求将返回文档的全部,存储在_source参数中。但是可能你感兴趣的字段只是title。请求个别字段可以使用_source参数。多个字段可以使用逗号分隔:

GET /website/blog/123?_source=title,text
复制代码


上面少了一个date字段,结果果然没错

相关实践学习
以电商场景为例搭建AI语义搜索应用
本实验旨在通过阿里云Elasticsearch结合阿里云搜索开发工作台AI模型服务,构建一个高效、精准的语义搜索系统,模拟电商场景,深入理解AI搜索技术原理并掌握其实现过程。
ElasticSearch 最新快速入门教程
本课程由千锋教育提供。全文搜索的需求非常大。而开源的解决办法Elasricsearch(Elastic)就是一个非常好的工具。目前是全文搜索引擎的首选。本系列教程由浅入深讲解了在CentOS7系统下如何搭建ElasticSearch,如何使用Kibana实现各种方式的搜索并详细分析了搜索的原理,最后讲解了在Java应用中如何集成ElasticSearch并实现搜索。  
相关文章
|
JSON Java API
史上最全的ElasticSearch系列之基础(一)(下)
前言 文本已收录至我的GitHub仓库,欢迎Star:github.com/bin39232820… 种一棵树最好的时间是十年前,其次是现在
245 0
|
存储 SQL JSON
白日梦的Elasticsearch系列笔记(一)基础篇-- 快手上手ES (一)
白日梦的Elasticsearch系列笔记(一)基础篇-- 快手上手ES (一)
494 0
|
数据采集 搜索推荐 Java
阿里云Elasticsearch集群的基础学习
阿里云Elasticsearch集群的基础学习
280 0
阿里云Elasticsearch集群的基础学习
|
存储 数据建模 关系型数据库
干货 | Elasticsearch基础但非常有用的功能之二:模板
1、 引言 业务场景1:数据量非常大,需要进行索引生命周期管理,按日期划分索引,要求多个索引的Mapping一致,每次手动创建或者脚本创建都很麻烦! 怎么破? 业务场景2:实际业务多个索引,想让多个索引中的相同名字的字段类型完全一致,以便实现跨索引检索。怎么破?
干货 | Elasticsearch基础但非常有用的功能之二:模板
|
存储 自然语言处理 关系型数据库
干货 | Elasticsearch基础但非常有用的功能之一:别名
本文是系列文章第一篇。介绍Elasticsearch的一些非常基础但实战开发确非常有用的技术点。了解这些技术点会帮助你设计更易于维护的数据索引,预先知道PB级大数据索引实战中的坑,提升工作效率。 本文从别名分类、索引别名实践、索引别名的好处、索引别名常见问题及坑解读、字段别名实践一把五个方面进行详细解读。
干货 | Elasticsearch基础但非常有用的功能之一:别名
|
SQL 缓存 自然语言处理
Elasticsearch检索分类深入详解—基础篇
题记 Elasticsearch中当我们设置Mapping(分词器、字段类型)完毕后,就可以按照设定的方式导入数据。
Elasticsearch检索分类深入详解—基础篇
|
SQL 运维 Java
史上最全的ElasticSearch系列之基础(二)(下)
前言 文本已收录至我的GitHub仓库,欢迎Star:github.com/bin39232820… 种一棵树最好的时间是十年前,其次是现在
207 0
|
SQL JSON 自然语言处理
史上最全的ElasticSearch系列之基础(二)(上)
前言 文本已收录至我的GitHub仓库,欢迎Star:github.com/bin39232820… 种一棵树最好的时间是十年前,其次是现在
378 0
|
JSON 缓存 监控
白日梦的Elasticsearch系列笔记(一)基础篇-- 快手上手ES (三)
白日梦的Elasticsearch系列笔记(一)基础篇-- 快手上手ES (三)
297 0
|
SQL JSON 关系型数据库
白日梦的Elasticsearch系列笔记(一)基础篇-- 快手上手ES (二)
白日梦的Elasticsearch系列笔记(一)基础篇-- 快手上手ES (二)
274 0

热门文章

最新文章