ElasticSearch学习笔记1---基础语法

1、ElasticSearch概述

Elaticsearch,简称为es,es是一个开源的高扩展的分布式全文检索引擎,它可以近乎实时的存储、检索数据;本身扩展性很好,可以扩展到上百台服务器,处理PB级别(大数据时代)的数据。es也使用ava开发并使用Lucene作为其核心来实现所有索引和搜索的功能,但是它的目的是通过简单的RESTfulAPI来隐藏Lucene的复杂性,从而让全文搜索变得简单。

据国际权威的数据库产品评测机构DBEngines的统计,在2016年1月,ElasticSearch已超过Solr等,成为排名第一的搜索引擎类应用。

1、目录结构

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-a0cZh1ks-1608209605874)(images/image-20201207121022580.png)]

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

2、启动,访问9200

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

2、ES核心概念

  • 索引
  • 字段类型(mapping)
  • 文档(documents)

1、概述

在前面的学习中,我们已经掌握了es是什么,同时也把es的服务已经安装启动,那么es是如何去存储数据,数据结构是什么,又是如何实现搜索的呢?我们先来聊聊ElasticSearch的相关概念吧!

集群,节点,索引,类型,文档,分片,映射是什么?

2、elasticsearch是面向文档,关系行数据库和elasticsearch客观的对比!一切都是JSON ! |

Relational DB Elasticsearch
数据库(database) 索引(index)
表(table) types
行(row) document
字段(columns) field

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

物理设计:

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

逻辑设计:

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

3、文档

之前说elasticsearch是面向文档的,那么就意味着索引和搜索数据的最小单位是文档,elasticsearch中,文档有几个重要属性:

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

4、类型

类型是文档的逻辑容器,就像关系型数据库一样,表格是行的容器。类型中对于字段的定义称为映射,比如name映射为字符串类型。我们说文档是无模式的,它们不需要拥有映射中所定义的所有字段,比如新增一个字段,那么elasticsearch是怎么做的呢?elasticsearch会自动的将新字段加入映射,但是这个字段的不确定它是什么类型,elasticsearch就开始猜,如果这个值是18,那么elasticsearch会认为它是整形。但是elasticsearch也可能猜不对,所以最安全的方式就是提前定义好所需要的映射,这点跟关系型数据库殊途同归了,先定义好字段,然后再使用,别整什么幺蛾子。

5、索引

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

6、倒排索引

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

Study every day,good good up to forever#文档1包含的内容
To forever,study every day,good good up # 文档2包含的内容

为了创建倒排索引,我们首先要将每个文档拆分成独立的词(或称为词条或者tokens),然后创建一个包含所有不重复的词条的排序列表,然后列出每个词条出现在哪个文档:

term doc_1 doc_2
Study ×
To × ×
every
forever
day
study ×
to ×

现在,我们试图搜索to forever,只需要查看包含每个词条的文档

term doc_1 doc_2
to ×
forever
total 2 1

两个文档都匹配,但是第一个文档比第二个匹配程度更高。如果没有别的条件,现在,这两个包含关键字的文档都将返回。

elasticsearch的索引和Lucene的索引对比

在elasticsearch中,索引( 库)这个词被频繁使用,这就是术语的使用。在elasticsearch中,索引被分为多个分片,每份分片是一个Lucene的索引。所以一个elasticsearch索引是由多个Lucene索引组成的。别问为什么,谁让elasticsearch使用Lucene作为底层呢! 如无特指,说起索引都是指elasticsearch的索引。

MySQL是拿着文档去找词条,而Elasticsearch是拿着词条去找文档,其中词条是提前维护好的,用空间换取时间。

3、IK分词器插件

什么是IK分词器?

分词∶即把一段中文或者别的划分成一个个的关键字,我们在搜索时候会把自己的信息进行分词,会把数据库中或者索引库中的数据进行分词,然后进行一个匹配操作,默认的中文分词是将每个字看成一个词,比如“我爱中国”会被分为"我"“爱”“中”"国”,这显然是不符合要求的,所以我们需要安装中文分词器ik来解决这个问题。

IK提供了两个分词算法:ik_smart和ik_max_word,其中 ik_smart为最少切分,ik_max_word为最细粒度划分!一会我们测试!

4、Rest风格说明

一种软件架构风格,而不是标准,只是提供了一组设计原则和约束条件。它主要用于客户端和服务器交互类的软件。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。

基本Rest命令说明

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

使用Postman操作ES

PUT—创建

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nftoFhcC-1608209605880)(images/image-20201207152354277.png)]

GET—查询

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1BanBNqC-1608209605882)(images/image-20201207152527499.png)]

DELETE—删除

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-b5W2OgaN-1608209605883)(images/image-20201207152807945.png)]

再查询就没有了

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EyEJU0TD-1608209605884)(images/image-20201207152843059.png)]

将 HTTP 命令由 PUT 改为 GET 可以用来检索文档,同样的,可以使用 DELETE 命令来删除文档,以及使用 HEAD 指令来检查文档是否存在。如果想更新已存在的文档,只需再次 PUT

再次PUT已经存在的文档

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FS03UFgA-1608209605885)(images/image-20201207153204731.png)]

_search—查询所有数据

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-H6t3wvJE-1608209605886)(images/image-20201207153639484.png)]

条件查询

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ob1yHVxf-1608209605887)(images/image-20201207153909279.png)]

使用查询表达式搜索

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9jlLIwqK-1608209605888)(images/image-20201207154653065.png)]

Query-string 搜索通过命令非常方便地进行临时性的即席搜索 。Elasticsearch 提供一个丰富灵活的查询语言叫做 查询表达式 , 它支持构建更加复杂和健壮的查询。

领域特定语言(DSL), 使用 JSON 构造了一个请求。

更复杂的查询

{
    
    
    "query" : {
    
    
        "bool": {
    
    
            "must": {
    
    
                "match" : {
    
    
                    "last_name" : "smith" 
                }
            },
            "filter": {
    
    
                "range" : {
    
    
                    "age" : {
    
     "gt" : 30 } 
                }
            }
        }
    }
}

短语搜索

{
    
    
    "query" : {
    
    
        "match_phrase" : {
    
    
            "about" : "rock albums"
        }
    }
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tKk3S5Rz-1608209605889)(images/image-20201207155230933.png)]

高亮搜索

许多应用都倾向于在每个搜索结果中 高亮 部分文本片段,以便让用户知道为何该文档符合查询条件。在 Elasticsearch 中检索出高亮片段也很容易。

再次执行前面的查询,并增加一个新的 highlight 参数:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5YwLL9Ur-1608209605889)(images/image-20201207155503128.png)]

当执行该查询时,返回结果与之前一样,与此同时结果中还多了一个叫做 highlight 的部分。这个部分包含了 about 属性匹配的文本片段,并以 HTML 标签 <em></em> 封装:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Pye6SfCV-1608209605890)(images/image-20201207155538816.png)]

复杂查询关键字

{
    
    
    "query" : {
    
       // 查询
        "match_phrase" : {
    
    
            "about" : "rock albums"
        }
    },
    "_source": ["age"],  // 筛选字段
    "highlight": {
    
        // 高亮
        "fields" : {
    
    
            "about" : {
    
    }
        }
    },
    "sort" :[   // 排序
    	{
    
    
    		"age": {
    
    
    			"order": "asc"
    		}
    	}	
    ],
    "from": 0,  // 分页
    "size": 1
}
{
    
    
    "query" : {
    
    
        "match" : {
    
    
            "about" : "I build"  // 多个条件使用空格隔开,只要满足其中一个结果即可以被									查出,这个时候可以通过分值基本的判断
        }
    }
}

猜你喜欢

转载自blog.csdn.net/qq_42372017/article/details/111333228