概述
一、连接数据库和插件得使用
1.ES的使用是依据Chrome上的插件来进行执行的——clasticsearch5x-head-chrome
2.ES要用IP地址和端口号进行连接使用 xxx.xxx.xxx.xxx:xxxx
3.进行postman调用ES库,http://xxx.xxx.xxx.xxx:xxxxx/索引名/固定格式(-search)
然后使用DSL语句进行查询(JSON格式)
4.ES插件的使用 (1)概览——查询索引信息与一些基本操作
(2)索引——查看全部索引的一些基本信息
(3)数据浏览——查看某个索引下的Type、Documents、Fields等信息
(4)基本查询
a.must——必要查询,有多个并列查询,一个文档满足查询 条件才行
mastnot——与must相反
should——只要符合要求就可以返回
b.选择索引内的Type名
c.term——查询某个字段里含有某个关键词的文档
wildcard——通配符查询,类似模糊查询
prefix——前缀查询,通过一个关键字指定Fields前缀查询对应的文档
fuzzy——模糊查询
range——按照指定范围查找一批数据
query-string——字段查询
text——分词查询
missing——查询不存在的字段
4.ES中对mapping 的理解
mapping参数
字段中的type(es数据类型)
(1)text 字符串,分词,全文索引
(2)keyword 关键字,不分词,适合id,email等这种不分词的字段
(3)numeric 数字类型有integer、long、short、byte、double、float等类型
(4)date 时间类型
(5)boolean 布尔类型
(6)binary 接收base64编码的字符串
(7)rang 具体有integer_range,float_range,long_range,double_range,date_range,ip_range,可存储范围数据,
什么是mapping
ES的mapping非常类似于静态语言中的数据类型:声明一个变量为int类型的变量, 以后这个变量都只能存储int类型的数据。同样的, 一个number类型的mapping字段只能存储number类型的数据。
同语言的数据类型相比,mapping还有一些其他的含义,mapping不仅告诉ES一个field中是什么类型的值, 它还告诉ES如何索引数据以及数据是否能被搜索到。
当你的查询没有返回相应的数据, 你的mapping很有可能有问题。当你拿不准的时候, 直接检查你的mapping。
剖析mapping
一个mapping由一个或多个analyzer组成, 一个analyzer又由一个或多个filter组成的。当ES索引文档的时候,它把字段中的内容传递给相应的analyzer,analyzer再传递给各自的filters。
filter的功能很容易理解:一个filter就是一个转换数据的方法, 输入一个字符串,这个方法返回另一个字符串,比如一个将字符串转为小写的方法就是一个filter很好的例子。
一个analyzer由一组顺序排列的filter组成,执行分析的过程就是按顺序一个filter一个filter依次调用, ES存储和索引最后得到的结果。
总结来说, mapping的作用就是执行一系列的指令将输入的数据转成可搜索的索引项。
对于 String 字段,可以设置类型为 text 或者 keyword。text类型的数据会被分词处理,而 keyword 类型的数据不会被分词处理。因此想根据某个字段精确查询的话,可以将其设置为 keyword 类型(版本5.0之后)。
如果一个索引库已经存在索引文档,这时想要更改索引的mapping的话,最好删除当前索引库,重新建立索引库,设置 mapping 之后,将数据重新添加到索引库中。
默认analyzer
回到我们的例子, ES猜测description字段是string类型,于是默认创建一个string类型的mapping,它使用默认的全局analyzer, 默认的analyzer是标准analyzer, 这个标准analyzer有三个filter:token filter, lowercase filter和stop token filter。
我们可以在做查询的时候键入_analyze关键字查看分析的过程
(1)往es里面直接插入数据,es会自动建立索引,同时建立type以及对应的mapping
(2)mapping中就自动定义了每个field的数据类型
(3)不同的数据类型(比如说text和date),可能有的是exact value,有的是full text
(4)exact value,在建立倒排索引的时候,分词的时候,是将整个值一起作为一个关键词建立到倒排索引中去;full text,会经历各种各样的处理,分词,normaliztion(时态转换,同义词转换,大小写转换),才会建立到倒排索引中去。
(5)exact value和full text类型的field决定了,在一个搜索过来的时候,对exact value field或者是full text field进行搜索的行为不一样,会跟建立倒排索引的行为保持一致;比如说exact value搜索的时候,就是直接按照整个值进行匹配,full text query string,也会进行分词和normalization再去倒排索引中去搜索。
(6)可以用es的dynamic mapping,让其自动建立mapping,包括自动设置数据类型;也可以提前手动创建index和type的mapping,自己对各个field进行设置,包括数据类型,索引行为,分词器等等
mapping就是index的type的元数据,每个type都有一个自己的mapping,决定了数据类型,建立倒排索引的行为,还有进行搜索的行为
1、mapping核心的数据类型
string,byte,short,integer,long,float,double,boolean,date
2、dynamic mapping
true or false --> boolean
123 --> long
123.45 --> double
2017-01-01 --> date
"hello world" --> string/text
3、查看mapping
GET /index/_mapping/type
ES的工作状态:status 指示集群总体上是否正常,三种颜色含义
green
所有的主分片和副本分片都正常运行
yellow
所有的主分片都正常运行,但不是所有的副本分片都正常运行
red
有主分片没能正常运行
二、查询方式的使用.(RESTFUL API)
基本搜索 _search:
最基本的搜索API表单是空搜索(empty search),它没有指定任何的查询条件,只返回集群索引中的所有文档:
快速检查集群的健康状况:GET /_cat/health?v(?v是在Linux中使用的格式化符号)
快速查看集群中有哪些索引:GET /_cat/indices?v
创建索引:PUT /test_index?pretty
删除索引:DELETE /test_index?pretty
新增文档,建立索引PUT /index/type/id
检索文档GET /index/type/id
替换文档PUT /ecommerce/product/1
更新文档POST /ecommerce/product/1/_update
删除文档DELETE /ecommerce/product/1
query string search:GET /ecommerce/product/_search
三、基础DSL语句查询
1、简单查询:
1)查询所有结果:
GET /wtyy-test/user/_search
{
"query":{"match_all":{}}
}
2)条件查询:post_filter 和 query 的 区别 ,语法上没区别,唯一的在于 filter 不评分,所以 filter 比 query 快很多 ,filter 和query 可以共存。
GET /wtyy-test/user/_search
{
"query":{
"match":{
"name":"李四"
}
},
"sort":[
{
"age":"desc"
}
]
}
3)范围查询:
GET /wtyy-test/user/_search
{
"query":{
"range": {
"age": {
"gte": 18,
"lte": 20
}
}
}
}
4)指定查询结果的字段 _source
GET /wtyy-test/user/_search
{
"query":{"match_all":{}},
"_source":["name","age"]
}
5)多条件的复合查询bool : bool 里面的都是一些条件 ,must 必须瞒足,should 只要满足 minimum_should_match 个条件是ture ,filter只是过滤不计入评分。
GET /wtyy-test/user/_search
{
"query": {
"bool": {
"must": [{
"match": {
"name": "李四"
}
}],
"should": [{
"match": {
"age": 18
}
},
{
"match": {
"address": "重庆"
}
}
],
"minimum_should_match": 1
}
}
}
2、分页查询:对于查询得到的结果,数目过多的情况下,es 默认会进行分页。分页主要有两个参数进行控制: size 显示应该返回的结果数量,默认是 10 ;from 显示应该跳过的初始结果数量,默认是 0。
GET /wtyy-test/user/_search
{
"query":{
"match": {
"name": "李四"
}
},
"size": 10,
"from": 1
}
3、聚合函数:
1)求平均值:
GET wtyy-test/user/_search
{
"query": {
"match": {"name":"李四"}
},
"aggs": {
"total_count": {
"value_count": {
"field": "age"
}
},
"pjz":{
"avg": {
"field": "age"
}
}
}
}
4、分组:
GET wtyy-test/user/_search
{
"query": {
"match": {"name":"李四"}
},
"aggs": {
"fz": {
"terms": {
"field": "age"
}
}
}
}
5、 scoll 游标查询,指定 scroll=时间 ,指定保存的分钟数,第一次发起请求放回的不是数据,而是 _scroll_id ,后面通过 _scroll_id 去请求数据,非常适合大批量查询。
get /user/student/_search?scroll=1m
{
"query":{
"match_all": {}
},
"size":2
}
GET /_search/scroll
{
"scroll": "1m",
"scroll_id" : "DnF1ZXJ5VGhlbkZldGNoBQAAAAAAAAIuFkRMbVZ0WFdvU1ZHWEJuelFIQk4tdFEAAAAAAAACLBZETG1WdFhXb1NWR1hCbnpRSEJOLXRRAAAAAAAAAi0WRExtVnRYV29TVkdYQm56UUhCTi10UQAAAAAAAAO1FlQwSkJqVng5UVpPUTIwbWw0a0NKV3cAAAAAAAADthZUMEpCalZ4OVFaT1EyMG1sNGtDSld3"
}
游标 查询 是在 es 里面缓存了结果 ,然后一次 一次的去取 所以发起 第一次请求的时候只有 size ,没有from ,后面的 请求只有 scroll_id 和 scroll 时间
6、关键词高亮显示:
通常自己开发搜索引擎的时候,往往需要对搜索结果中的关键词高亮这种功能。请求体增加一个 highlight 属性,里面指明要高亮的字段。如下:
GET wtyy-test/user/_search
{
"query": {
"match": {
"address": "北京"
}
},
"highlight": {
"fields": {
"address": {}
}
}
}
在返回体中有一个 highlight 字段,里面对 message 字段进行高亮处理: 关键词使用了 <em></em> 标签包围了。可以使用 css 修改对 <em> 标签的样式,以实现关键词高亮效果。
7、多索引查询:在多个索引中同时搜索文档,把多个索引看做一个使用。其实这也意味着,我们在存储的时候,没必要把所有的文档都存在一个 Index 中。 很常见的一个操作是,我们可以将文档按天分索引存储。例如: es-test-2020-03-11,es-test-2020-03-12 等, 在查询的时候,指定 es-test-* 查询即可,这样对外看来,文档似乎还是存储在一起,同时也减轻了 Index 的存储压力。(一个 ES 分片最多能存储 Integer.MAX_VALUE - 128 个文档)
GET /es-test-1,es-test-2/_search
GET /es-test-*/_search
GET /a*, b*/_search
8、批查询 api mget:
#批量查询
GET /_mget
{
"docs":[
{
"_index":"user",
"_type":"student",
"_id":1
},
{
"_index":"user",
"_type":"student",
"_id":2
},
{
"_index":"user",
"_type":"student",
"_id":2
}
]
}
mget 如果请求url 里面有 index 和 type 后面 的 请求体里面就可以不写 index 和type
9、es的 并发处理 ,使用的乐观锁 在 后面加上 version:
POST /user/student/1?version=3
{
"name":"zyk",
"age":0
}
只有version = 当前记录的version的时候才能修改成功。es 可以自动控制 vserion 通过 ,version_type指定 ,version_type=external 要求 version 大于当前的version ,version_type=internal 这个是默认值 ,必须等于当前的值<br>version_type=external_gte 大于等于当前的version<br>version_type=force 已经废弃了不能用了,我也不知道以前什么意思,提升, Validation Failed: 1: version type [force] may no longer be used
POST /user/student/1?version_type=external&version=505
{
"name":"zyk",
"age":0
}
ID查询
GET /es_product/_search
{
"query": {
"match": {
"_id": "625f89ea206ee56da05e9939"
}
}
}
参数查询
GET /es_product/_search
{
"size": 1000,
"query": {
"match": {
"goodsName": "立白"
}
}
}
查询总数
GET /es_product/_count
{
}
分词查询
GET _analyze
{
"analyzer": "whitespace",
"text": "青年 大学习"
}
“cluster_name” : “elasticsearch”, #集群的名字
“status” : “yellow”, #集群的状态
“timed_out” : false, #本次请求是否超时。所有每次请求都会显示是否超时
“number_of_nodes” : 2, #节点数
“number_of_data_nodes” : 1, #数据节点数
“active_primary_shards” : 216, #主分片数,216个index库
“active_shards” : 216, #共有216个分片
“relocating_shards” : 0, #分片重新定位的个数
“initializing_shards” : 0, #主分片出故障的个数,
“unassigned_shards” : 216, #未指定节点,配置了副本,仅用一台机器部署会出现这种情 况,没有分配的复分片
“number_of_pending_tasks” : 0, #等待任务执行的个数
“number_of_in_flight_fetch” : 0} # 请求备份的个数
1.post请求/索引名/_search
{
"query": { "match_all": {} }
}
其中,"query"表示定义查询,“match_all”表示在指定的索引中,查询所有文档。
2.增加页大小参数
post请求/索引名/_search
{
"query": { "match_all": {} },
"size": 1
}
"size"表示在每页查询多少条数据
3.增加起始参数和页大小参数
post请求/索引名/_search
{
"query": { "match_all": {} },
"from": 10,
"size": 10
}
"from"表示从哪一页开始查询
4.排序
post请求/索引名/_search
{
"query": { "match_all": {} },
"sort": { "balance": { "order": "desc" } }
}
“sort”参数是排序的意思,"balance"是要排序的字段, "order": "desc"表示序列倒序。默认返回前10条。
响应体里还提供了有关搜索请求的相关信息:
took – 查询花费时长(毫秒)
timed_out – 请求是否超时
_shards – 搜索了多少分片,成功、失败或者跳过了多个分片(明细)
max_score – 最相关的文档分数
hits.total.value - 找到的文档总数
hits.sort - 文档排序方式 (如没有则按相关性分数排序)
hits._score - 文档的相关性算分 (match_all 没有算分)
四、ES权重控制
1、索引期间boost
创建索引
说明:
在创建索引的过程中,在mappings中给字段设置boost的值为3,提升company的相关性权重。
get /testboost/_search
{
"query":{
"bool": {
"must": [
{
"match_phrase": {
"address": "湖北省"
}
},
{
"bool": {
"should": [
{
"match_phrase": {
"deptName":{
"query": "技术部",
"boost":1
}
}
},
{
"match_phrase": {
"deptName":{
"query": "销售部",
"boost":5
}
}
}
]
}
}
]
}
}
}
最后
以上就是雪白水池为你收集整理的ES的学习心得的全部内容,希望文章能够帮你解决ES的学习心得所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复