0
点赞
收藏
分享

微信扫一扫

Kibana操作Elasticsearch-检索


1.导入ES官方检索测试数据

本次使用kibana操作ES以这些数据为基础

​​ES在GitHub的地址​​

Kibana操作Elasticsearch-检索_elasticsearch


这段数据存在这个目录下

Kibana操作Elasticsearch-检索_elasticsearch_02


将这2000行json复制出来

2.使用Kibana将2000行数据导入到ES中

POST /bank/account/_bulk

Kibana操作Elasticsearch-检索_数据_03


3.根据ES官方文档对数据检索

​​ES官网​​

Kibana操作Elasticsearch-检索_字段_04


进入文档–>选择其他版本

Kibana操作Elasticsearch-检索_elasticsearch_05


进入对应版本

Kibana操作Elasticsearch-检索_字段_06


进入这个页面有点慢

Kibana操作Elasticsearch-检索_elasticsearch_07


脚本文件还没加载完,加载完了的界面是这样的

Kibana操作Elasticsearch-检索_数据_08


点击+好展开

Kibana操作Elasticsearch-检索_elasticsearch_09


进入检索文档

Kibana操作Elasticsearch-检索_字段_10


这里我的步骤做的这么详细是不是因为CSDN资源服不要我付费,而是防止这些链接改变,而找不到界面

4.开始检索

ES支持两种基本方式检索
1.通过使用REST request URL 发送搜索参数(url+检索参数)
2.使用REST request body来发送他们(url+请求体)

1.使用REST request URL检索

GET bank/_search?q=*&sort=account_number:asc
#查询bank这个索引下的数据,q=*查询所有,sort=account_number:asc 按照account_number进行asc升序排列

检索结果

Kibana操作Elasticsearch-检索_elasticsearch_11


这些检索结果前面的key代表什么意思官网上也有描述

Kibana操作Elasticsearch-检索_elasticsearch_12


至于写的什么自己翻译

Kibana操作Elasticsearch-检索_字段_13

Kibana操作Elasticsearch-检索_字段_14


这里检索到1000条数据,但是只给我们返回10条,这是因为ES默认值返回10条数据,做了分页处理

2.使用REST request body来发送他们(url+请求体)–Query DSL
官方推荐使用Query DSL模式检索数据

GET /bank/_search
{
"query": { "match_all": {} },
"sort": [
{ "account_number": "asc" },
{ "balance": "desc" }
]
}

#query查询查询条件,match_all这个代表查询所有
#sort排序条件,account_number asc按照账号升序排列,这里演示两个字段排序,先根据account_number升序排列,然后根据balance降序排列

其他一些写法官网上面也有描述

分页查询

Kibana操作Elasticsearch-检索_elasticsearch_15

Query DSL

Elasticsearch提供了一个可以执行查询的Json风格的DSL (domain-specific language领域特定语言) 。这个被称为Query DSL.该查询语言非常全面,并且刚开始的时候感觉有点复杂,真正学好它的方法是从一些基础的示例开始的。

1.语法结构
一个典型的检索机构是这样的

GET /索引/类型/_search
{
#这里是做什么的操作
"query": {
#查询详细操作
"match_all": {}
},
xxxxxx
xxx
xxx
}

Kibana操作Elasticsearch-检索_数据_16


下面就一个一个学咯

查询所有根据balance字段倒叙

GET /bank/_search
{
"query": { "match_all": {} },
"sort": [
{ "balance": "desc" }
]
}

查询所有并分页按照指定字段排序

Kibana操作Elasticsearch-检索_字段_17


这里取下一页和Mysql不一样哦,下一页from不是1,而是5,开始数据位置

GET /bank/_search
{
"query": { "match_all": {} },
"sort": [
{ "balance": "desc" }
],
"from": 5,
"size": 5
}

检索所有数据,返回部分字段

GET /bank/_search
{
"query": { "match_all": {} },
"sort": [
{ "balance": "desc" }
],
"from": 5,
"size": 5,
"_source": ["gender","age","employer"]
}

Kibana操作Elasticsearch-检索_数据_18


全文检索 match

这里不区分大小写,只要address中包含mill数据的,那么都会被查询出来,类似于Mysql中的模糊查询,这也是ES的倒排索引机制

GET /bank/_search
{
"query": {
"match": {
"address": "mill"
}
}
}

GET /bank/_search
{
"query": {
"match": {
"address": "Mill"
}
}
}

这里全文检索出来的数据会按照匹配得分进行排序展示

Kibana操作Elasticsearch-检索_elasticsearch_19

当查询的数据条件为数据类型,而不是字符串那么就是精确查询

GET /bank/_search
{
"query": {
"match": {
"account_number": "20"
}
}
}

短语匹配 match_phrase
这里使用match_phrase这个将mill lane组成一个短语

GET /bank/_search
{
"query": {
"match_phrase": {
"address": "mill lane"
}
}
}

Kibana操作Elasticsearch-检索_数据_20


对比match全文检索

GET /bank/_search
{
"query": {
"match": {
"address": "mill lane"
}
}
}

Kibana操作Elasticsearch-检索_字段_21


这里使用match就会检索address字段中包含mill lane这两项的都能匹配上

多字段匹配 multi_match
这里使用multi_match,条件数据为mill Blackgum,参与匹配的字段为[“city”,“address”],会进行分词,匹配度度高的分数大

GET /bank/_search
{
"query": {
"multi_match": {
"query": "mill Blackgum",
"fields": ["city","address"]
}
}
}

Kibana操作Elasticsearch-检索_elasticsearch_22


第一条数据两个字段都命中上了,分数较高

复合查询

GET /bank/_search
{
"query": {
"bool": {
"must": [
{ "match": {
"gender": "F"
}
},
{ "match": {
"address": "Mill"
}
}
]
}
}
}
#bool复合多个条件
#must是条件必须满足

Kibana操作Elasticsearch-检索_elasticsearch_23


必须满足gender=F和address=Mill还有一种必须不满足

先试用必须满足查出几条数据

Kibana操作Elasticsearch-检索_数据_24


然后在使用must_not不满足age=38

GET /bank/_search
{
"query": {
"bool": {
"must": [
{ "match": {
"gender": "M"
}
},
{ "match": {
"address": "Mill"
}
}
],
"must_not": [
{"match": {
"age": "38"
}}
]
}
}
}

Kibana操作Elasticsearch-检索_数据_25


should应该匹配

GET /bank/_search
{
"query": {
"bool": {
"must": [
{ "match": {
"gender": "M"
}
},
{ "match": {
"address": "Mill"
}
}
],
"must_not": [
{"match": {
"age": "18"
}}
],
"should": [
{"match": {
"lastname":"Wallace"
}
}
]
}
}
}
#bool复合多个条件
#must是条件必须满足
#must_not是条件必须不满足
#should是满足更好+分,不满足也能查,作为加分项

Kibana操作Elasticsearch-检索_数据_26


第一条结果和第二条结果gender、address都是一样的,且age不为18,后面的lastname只有第一条数据匹配到了,那么他的命中分数就高一些

结果过滤 filter
filter使用过滤检索不会影响档命中得分/单独使用没有文档命中得分
这个是有文档命中得分的

GET /bank/_search
{
"query": {
"bool": {
"must":[
{
"range": {
"age": {
"gte": 18,
"lte": 30
}
}
}
]
}
}
}

Kibana操作Elasticsearch-检索_elasticsearch_27


使用filter是没有的

GET /bank/_search
{
"query": {
"bool": {
"filter": {
"range": {
"age": {
"gte": 18,
"lte": 30
}
}
}
}
}
}

Kibana操作Elasticsearch-检索_数据_28


复合检索+filter过滤

这是将复合检索出来的数据在进行filter过滤的

先不过滤检索数据

{
"query": {
"bool": {
"must": [
{ "match": {
"gender": "M"
}
},
{ "match": {
"address": "Mill"
}
}
],
"must_not": [
{"match": {
"age": "18"
}}
],
"should": [
{"match": {
"lastname":"Wallace"
}
}
]
}
}
}

Kibana操作Elasticsearch-检索_字段_29


加入filter

GET /bank/_search
{
"query": {
"bool": {
"must": [
{ "match": {
"gender": "M"
}
},
{ "match": {
"address": "Mill"
}
}
],
"must_not": [
{"match": {
"age": "18"
}}
],
"should": [
{"match": {
"lastname":"Wallace"
}
}
],
"filter": {
"range": {
"age": {
"gte": 18,
"lte": 30
}
}
}
}
}
}

Kibana操作Elasticsearch-检索_elasticsearch_30

这里就可以对比没加filter的数据,这里filter确实没有影响文档命中得分

非文本字段使用term更加精确
默认情况下,Elasticsearch在分析时更改文本字段的值。这使得查找文本字段值的精确匹配变得困难。要搜索文本字段值,请使用匹配查询。

GET /bank/_search
{
"query": {
"term": {
"address":"694 Jefferson Street"
}
}
}
#查询非字符串类型数据使用term
#文本类型的就用match检索

Kibana操作Elasticsearch-检索_字段_31

如果使用term检索字符串

Kibana操作Elasticsearch-检索_数据_32


这里是匹配不到的

.keyword精确匹配

GET /bank/_search
{
"query": {
"match": {
"address.keyword":"694 Jefferson Street"
}
}
}
#查询任何字段是都可以.keyword,这个的作用就是将这个694 Jefferson Street值精确匹配==,只有当694 Jefferson Street完全等于是才能匹配

Kibana操作Elasticsearch-检索_数据_33


这个.keyword和match_phrase有点像,其实有一个很大的区别

match_phrase是包数据即可含即可,而.keyword是必须等于

演示代码

使用.keyword

GET /bank/_search
{
"query": {
"match": {
"address.keyword":"694 Jefferson"
}
}
}

Kibana操作Elasticsearch-检索_字段_34


无法匹配

使用match_phrase

GET /bank/_search
{
"query": {
"match_phrase": {
"address":"694 Jefferson"
}
}
}

Kibana操作Elasticsearch-检索_数据_35


包含即可

本篇文章主要演示Elasticsearch的检索操作,下一篇将演示数据分析操作


举报

相关推荐

0 条评论