ELK 学习(查询)

这篇博客详细介绍了 Elasticsearch 中的映射与分析过程,包括测试分词器、自定义域、索引和分析器的设置。同时,文章深入探讨了各种查询方式,如 match 查询、match_phrase、multi_match、bool 查询以及聚合查询,提供了丰富的查询示例,帮助读者理解 Elasticsearch 的查询语法和过滤数据的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

顾客银行账户信息的虚构的 JSON 文档样本

{
"account_number": 0,
"balance": 16623,
"firstname": "Bradshaw",
"lastname": "Mckenzie",
"age": 29,
"gender": "F",
"address": "244 Columbus Place",
"employer": "Euron",
"email": "bradshawmckenzie@euron.com",
"city": "Hobucken",
"state": "CO"
}

响应结果解释:

took - Elasticsearch 执行搜索的时间(毫秒)
time_out - 告诉我们搜索是否超时
_shards - 告诉我们多少个分片被搜索了,以及统计了成功 / 失败的搜索分片
hits - 搜索结果
hits.total - 搜索结果
hits.hits - 实际的搜索结果数组(默认为前 10 的文档)
sort - 结果的排序 key (键)(没有则按 score 排序)
score max_score – 相关性得分和最高得分(全文检索用)

映射与分析

分析 包含下面的过程:

  • 首先,将一块文本分成适合于倒排索引的独立的 词条 ,
  • 之后,将这些词条统一化为标准格式以提高它们的“可搜索性”,或者 recall
举例:
  • date 域包含一个精确值:单独的词条 2014-09-15
  • _all 域是一个全文域,所以分词进程将日期转化为三个词条: 2014, 09, 和 15
GET /_search?q=2014-09-15        # 12 results ! all域
GET /_search?q=date:2014-09-15   # 1  result  date域
GET /_search?q=date:2014         # 0  results !   date域

测试分词器

GET /_analyze
{
  "analyzer": "standard",
  "text": "Text to analyze"
}

映射

Elasticsearch 支持如下简单域类型:

  • 字符串: string
  • 整数 : byteshortintegerlong
  • 浮点数: floatdouble
  • 布尔型: boolean
  • 日期: date

一般我们使用Json,ES会动态映射,猜测出数据类型。

JSON type

域 type

布尔型: true 或者 false

boolean

整数: 123

long

浮点数: 123.45

double

字符串,有效日期: 2014-09-15

date

字符串: foo bar

string

味着如果你通过引号( "123" )索引一个数字,它会被映射为 string 类型,而不是 long 。但是,如果这个域已经映射为 long ,那么 Elasticsearch 会尝试将这个字符串转化为 long ,如果无法转化,则抛出一个异常。

查询映射


GET bank/_mapping

自定义域

域最重要的属性是 type 。对于不是 string 的域,你一般只需要设置 type 

index

index 属性控制怎样索引字符串。它可以是下面三个值:

analyzed

首先分析字符串,然后索引它。换句话说,以全文索引这个域。

not_analyzed

  索引这个域,所以它能够被搜索,但索引的是精确值。不会对它进行分析。

no

不索引这个域。这个域不会被搜索到。

string 域 index 属性默认是 analyzed 。如果我们想映射这个字段为一个精确值,我们需要设置它为 not_analyzed :

{
    "tag": {
        "type":     "string",
        "index":    "not_analyzed"
    }
}

其他简单类型(例如 long , double , date 等)也接受 index 参数,但有意义的值只有 no 和 not_analyzed , 因为它们永远不会被分析。

analyzer

对于 analyzed 字符串域,用 analyzer 属性指定在搜索和索引时使用的分析器。默认, Elasticsearch 使用 standard 分析器, 但你可以指定一个内置的分析器替代它,例如 whitespace 、 simple 和 english

{
    "tweet": {
        "type":     "string",
        "analyzer": "english"
    }
}

查询

请求体查询 | Elasticsearch: 权威指南 | Elastic

一个查询语句的典型结构
    QUERY_NAME:{
       ARGUMENT:VALUE,
       ARGUMENT:VALUE,...
    }

如果针对于某个字段,那么它的结构如下
    {
      QUERY_NAME:{
         FIELD_NAME:{
           ARGUMENT:VALUE,
           ARGUMENT:VALUE,...
          }   
       }
    }

验证查询

GET bank/_validate/query?explain
{
   "query": {
      "address" : {
         "match" : "really powerful"
      }
   }
}
# 使用 explain 参数将返回可读的描述,这对准确理解 Elasticsearch 是如何解析你的 query 
GET bank/_validate/query?explain
{
   "query": {
      "match" : {
         "address" : "really powerful"
      }
   }
}


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

#返回部分字段
GET bank/_search 
{
    "query":{
        "match_all":{

        }
    },
    "from":0,
    "size":5,
    "_source":[
        "age",
        "balance"
    ]
}

#match【匹配查询】
#基本类型(非字符串),精确匹配
GET bank/_search
{
    "query":{
        "match":{
            "account_number":"20"
        }
    }
}

#字符串,全文检索
GET bank/_search
{
    "query":{
        "match":{
            "address":"mill address"
        }
    }
}

#match_phrase【短语匹配】
GET bank/_search
{
  "query": {
    "match_phrase": {
      "address": "Hutchinson Court"
    }
  }
}


#multi_match【多字段匹配】
GET bank/_search
{
  "query": {
    "multi_match": {
      "query": "Street Hutchinson",
      "fields": ["address","lastname"]
    }
  }
}

#address 包含 mill,并且 gender 是 M,如果 address 里面有 lane 最好不过,但是 email 必 #须不包含 baluba.com
GET bank/_search
{
    "query":{
        "bool":{
            "must":[
                {
                    "match":{
                        "address":"mill"
                    }
                },
                {
                    "match":{
                        "gender":"M"
                    }
                }
            ],
            "should":[
                {
                    "match":{
                        "address":"lane"
                    }
                }
            ],
            "must_not":[
                {
                    "match":{
                        "email":"baluba.com"
                    }
                }
            ]
        }
    }
}

#term 和march 一样。非字符使用term精确查询,字符使用match
GET bank/_search
{
    "query":{
        "bool":{
            "must":[
                {
                    "term":{
                        "age":{
                            "value":"28"
                        }
                    }
                },
                {
                    "match":{
                        "address":"990 Mill Road"
                    }
                }
            ]
        }
    }
}

#filter【结果过滤】不进行算分
GET bank/_search
{
    "query":{
        "bool":{
            "must":[
                {
                    "match":{
                        "address":"Holmes"
                    }
                }
            ],
            "filter":{
                "range":{
                    "balance":{
                        "gte":39224,
                        "lte":39226
                    }
                }
            }
        }
    }
}

   

aggs :执行聚合。聚合语法如下
"aggs": {
"aggs_name 这次聚合的名字,方便展示在结果集中 ": {
"AGG_TYPE 聚合的类型(
avg,term,terms ": {}
}
}


#复杂:查出所有年龄分布,并且这些年龄段中 M 的平均薪资和 F 的平均薪资以及这个年龄 段的总体平均薪资
GET bank/_search
{
    "query":{
        "match_all":{

        }
    },
    "aggs":{
        "age_agg":{
            "terms":{
                "field":"age",
                "size":100
            },
            "aggs":{
                "gender_agg":{
                    "terms":{
                        "field":"gender.keyword",
                        "size":100
                    },
                    "aggs":{
                        "balance_avg":{
                            "avg":{
                                "field":"balance"
                            }
                        }
                    }
                },
                "balance_avg":{
                    "avg":{
                        "field":"balance"
                    }
                }
            }
        }
    },
    "size":1000
}

添加

         添加数据

更新

删除

迁移

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值