ELK-ElasticSearch权威指南笔记

ELK-ElasticSearch笔记

文章目录

    • ELK-ElasticSearch笔记
  • 前言
    • 测试工具
  • 语法
    • 索引,文档和类型
    • 文档元数据
    • 检索索引里文档数据
      • 查看当前节点的所有 Index
      • 查看所有index的mapping(映射)
      • 查看特定index的mapping
      • 搜索全部文档
      • 查询指定id文档
      • 检索文档的一部分
      • 查询字符串搜索
        • 下面搜索city是city:Yardville的文档
        • 多条件搜索,条件之间用+连接。
        • 必选项多条件搜索
        • _all字段
      • 使用DSL(特定领域语言)模拟查询字符串搜索.
    • 删除索引
      • 删除指定索引
      • 模糊匹配删除
      • 删除所有的索引
      • 删除7天前那天的索引
        • 删除10天前的所有索引
    • 更新文档里数据
    • 查询语句和过滤语句关系
    • 分析器
      • 功能
      • 分析器被使用时搜索过程
      • 设置使用的分析器
      • 测试分词器
        • 标准版本分词器
        • IK中文分词器
          • 最大分词器ik_max_word
          • 最小分词器

前言

记录学习ElasticSearch的关键语法知识,有助于我理解Elastic stach整个框架。
其中有些知识只是需要知道可了解,比如查询语法,因为我们会介绍Kibana或elasticSearch-head来管理ElasticSearch里的索引,没必需自己一点点写url查询,但这些知识我们还是要知道,因为网上很多文章用到。
学习资料

  1. ElasticSearch权威指南或者ElasticSearch权威指南

  2. Elasticsearch 基础入门

  3. 全文搜索引擎 Elasticsearch 入门教程

测试工具

关于网络请求,这里使用curl工具,当然也可以使用postman或小幺鸡。
关于curl,-d 用于指定发送的数据,-X 用于指定发送数据的方式,-H 指定发送的数据类型(比如json格式为-H “Content-Type: application/json”)

  1. get请求:curl -X GET www.baidu.com或者curl www.baidu.com
  2. put请求(下面内容可执行复制到linux上执行):
curl -H "Content-Type: application/json" -X PUT 'localhost:9200/accounts/person/1' -d '
{
  "user": "张三",
  "title": "工程师",
  "desc": "数据库管理"
}'

语法

假如elaseticsearch里有个索引为bank,类型为account。

索引,文档和类型

索引:Elastic 数据管理的顶层单位就叫做 Index(索引)
文档:Index 里面单条的记录称为 Document(文档)。许多条 Document 构成了一个 Index。
类型:比如上面的account就是类型,是文档是分组。
再比如

{
  "accounts" : {
    "mappings" : {
      "person" : {
        "properties" : {
          "desc" : {
            "type" : "text",
            "analyzer" : "ik_max_word"
          },
          "title" : {
            "type" : "text",
            "analyzer" : "ik_max_word"
          },
          "user" : {
            "type" : "text",
            "analyzer" : "ik_max_word"
          }
        }
      }
    }
  }
}

索引是accounts,类型是person,文档是具体的每条数据

文档元数据

参考资料

  1. _index:文档存储的地方
  2. _type:文档代表的对象的类
  3. _id:文档的唯一标识
  4. _score:每个节点都有一个_score字段,这是相关性得分(relevance score),它衡量了文档与查询的匹配程度。
    请记住_index、_type、_id三者唯一确定一个文档

检索索引里文档数据

search API有两种表单:一种是“简易版”的查询字符串(query string)将所有参数通过查询字符串定义,另一种版本使用JSON完整的表示请求体(request body),这种富搜索语言叫做结构化查询语句(DSL)+

查看当前节点的所有 Index

curl -X GET 'http://localhost:9200/_cat/indices?v'

查看所有index的mapping(映射)

 curl -X GET localhost:9200/_mapping?pretty

查看特定index的mapping

 curl -X GET localhost:9200/bank/account/_mapping?pretty

搜索全部文档

curl -X GET localhost:9200/bank/account/_search

或者

curl -X GET localhost:9200/bank/account/_search?pretty

在任意的查询字符串中增加pretty参数,会让Elasticsearch美化输出(pretty-print)JSON响应以便更加容易阅读。_source字段不会被美化,它的样子与我们输入的一致。
后面不再强调。

查询指定id文档

curl -X GET localhost:9200/bank/account/222?pretty 

返回:

[root@localhost home]# curl -X GET localhost:9200/bank/account/222?pretty    
{
  "_index" : "bank",
  "_type" : "account",
  "_id" : "222",
  "_version" : 1,
  "found" : true,
  "_source" : {
    "account_number" : 222,
    "balance" : 14764,
    "firstname" : "Rachelle",
    "lastname" : "Rice",
    "age" : 36,
    "gender" : "M",
    "address" : "333 Narrows Avenue",
    "employer" : "Enaut",
    "email" : "[email protected]",
    "city" : "Wright",
    "state" : "AZ"
  }
}

响应里有_source字段,它包含了在创建索引时我们发送给Elasticsearch的原始文档。

检索文档的一部分

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

curl -X GET localhost:9200/bank/account/222?_source=city&pretty=true   

查询字符串搜索

参考检索文档
我们在请求中依旧使用_search关键字,然后将查询语句传递给参数q=

下面搜索city是city:Yardville的文档

 curl -X GET localhost:9200/bank/account/_search?q=city:Yardville

多条件搜索,条件之间用+连接。

 curl -X GET localhost:9200/bank/account/_search?q=city:Yardville+employer:Asimiline

必选项多条件搜索

上面是两个条件是可选的。单独某项的city或employer都会被匹配,必选条件就是条件前加上+号。"+“前缀表示语句匹配条件必须被满足。类似的”-"前缀表示条件必须不被满足。所有条件如果没有+或-表示是可选的——匹配越多,相关的文档就越多。

 curl -X GET localhost:9200/bank/account/_search?q=%2bcity:Yardville+%2bemployer:Asimiline

%2b是+号的url编辑,必需使用%2b代替+前缀

_all字段

这个字段很牛叉。学习路径
当你索引一个文档,Elasticsearch把所有字符串字段值连接起来放在一个大字符串中,它被索引为一个特殊的字段_all,若没有指定字段,查询字符串搜索(即q=xxx)使用_all字段搜索。

使用DSL(特定领域语言)模拟查询字符串搜索.

下面语句可直接复制到linux命令行执行。

curl -H "Content-Type: application/json" -X GET localhost:9200/bank/account/_search -d ' {
    "query":
        {"match":
           {
             "city":"Yardville"
             }
         }
   }'

全文搜索,短语搜索,高亮我们的搜索可参考检索文档

删除索引

以索引dongli-2019-03-01到dongli-2019-03-15为例

删除指定索引

 curl -XDELETE -u elastic:changeme http://localhost:9200/dongli-2019-03-02

删除多个指定索引,中间用逗号隔开

 curl -XDELETE -u elastic:changeme http://localhost:9200/dongli-2019-03-02,dongli-2019-03-04

模糊匹配删除

curl -XDELETE -u elastic:changeme http://localhost:9200/dongli-*

删除所有的索引

curl -XDELETE http://localhost:9200/_all
     或 
 curl -XDELETE http://localhost:9200/*

_all ,* 通配所有的索引
通常不建议使用通配符,误删了后果就很严重了,所有的index都被删除了
禁止通配符为了安全起见,可以在elasticsearch.yml配置文件中设置禁用_all和通配符
action.destructive_requires_name = true
这样就不能使用_all和

删除7天前那天的索引

根据索引名称后面的日期,删除指定日期的索引

#!/bin/bash
time=$(date -d '-7 days' +'%Y.%m.%d')
curl -XDELETE -u elastic:changeme http://localhost:9200/*-${time}

删除10天前的所有索引

根据索引名称后面的日期,删除7天前的所有索引。
它和上面算法类型都是根据索引名称计算日期的,如果索引没日期,那么只有手动删除

#!/bin/bash

###################################
#删除早于十天的ES集群的索引
###################################
function delete_indices() {
    comp_date=`date -d "10 day ago" +"%Y-%m-%d"`
    date1="$1 00:00:00"
    date2="$comp_date 00:00:00"

    t1=`date -d "$date1" +%s` 
    t2=`date -d "$date2" +%s` 

    if [ $t1 -le $t2 ]; then
        echo "$1时间早于$comp_date,进行索引删除"
        #转换一下格式,将类似2017-10-01格式转化为2017.10.01
        format_date=`echo $1| sed 's/-/\./g'`
        curl -XDELETE http://localhost:9200/*$format_date
    fi
}

curl -XGET http://localhost:9200/_cat/indices | awk -F" " '{print $3}' | awk -F"-" '{print $NF}' | egrep "[0-9]*\.[0-9]*\.[0-9]*" | sort | uniq  | sed 's/\./-/g' | while read LINE
do
    #调用索引删除函数
    delete_indices $LINE
done

更新文档里数据

文档在Elasticsearch中是不可变的——我们不能修改他们。
在内部,Elasticsearch已经标记旧文档为删除并添加了一个完整的新文档。旧版本文档不会立即消失,但你也不能去访问它。Elasticsearch会在你继续索引更多数据时清理被删除的文档
通过api能更新是完成如下过程

  1. 从旧文档中检索JSON
  2. 修改它
  3. 删除旧文档
  4. 索引新文档

比如

curl -H "Content-Type: application/json" -X PUT 'localhost:9200/bank/account/25' -d '
{
    "city" : "666"
}'

查询语句和过滤语句关系

查询与过滤
我们可以使用两种结构化语句: 结构化查询(Query DSL)和结构化过滤(Filter DSL)
过滤:一条过滤语句会询问每个文档的字段值是否包含着特定值
查询:查询语句会询问每个文档的字段值与特定值的匹配程度如何
原则上来说,使用查询语句做全文本搜索或其他需要进行相关性评分的时候,剩下的全部用过滤语句

对于准确值,你需要使用过滤器。过滤器的重要性在于它们非常的快。
理解查询和过滤,有助于我们使用Kibana。

分析器

功能

分析器主要是对数据处理,将之分词后,再标记。
分析(analysis)是这样一个过程:

  1. 首先,标记化一个文本块为适用于倒排索引单独的词(term)
  2. 然后标准化这些词为标准形式,提高它们的“可搜索性”或“查全率”

它包含3个功能,分别是字符过滤器,分词器,标记过滤,具体参考分析和分析器

分析器被使用时搜索过程

  1. 当你查询全文(full text)字段,查询将使用相同的分析器来分析查询字符串,以产生正确的词列表。
  2. 当你查询一个确切值(exact value)字段,查询将不分析查询字符串,但是你可以自己指定。

设置使用的分析器

映射,配置分析器
string类型的字段,默认的,考虑到包含全文本,它们的值在索引前要经过分析器分析,并且在全文搜索此字段前要把查询语句做分析处理。
对于string字段,两个最重要的映射参数是index和analyer。

测试分词器

在查询字符串参数中指定要使用的分析器,被分析的文本做为请求体

标准版本分词器

curl -H 'Content-Type: application/json' -X GET "localhost:9200/_analyze?pretty"  -d'
{
  "analyzer" : "standard",
  "text" : "List is empty" 
}'

结果如下

[root@localhost home]# curl -H 'Content-Type: application/json' -X GET "localhost:9200/_analyze?pretty"  -d'
{
  "analyzer" : "standard",
  "text" : "List is empty" 
}'
{
  "tokens" : [
    {
      "token" : "list",
      "start_offset" : 0,
      "end_offset" : 4,
      "type" : "",
      "position" : 0
    },
    {
      "token" : "is",
      "start_offset" : 5,
      "end_offset" : 7,
      "type" : "",
      "position" : 1
    },
    {
      "token" : "empty",
      "start_offset" : 8,
      "end_offset" : 13,
      "type" : "",
      "position" : 2
    }
  ]
}

IK中文分词器

最大分词器ik_max_word
curl -H 'Content-Type: application/json' -X GET "localhost:9200/_analyze?pretty"  -d'
{
  "analyzer" : "ik_max_word",
  "text" : "我是中国人" 
}'

结果如下

[root@localhost home]# curl -H 'Content-Type: application/json' -X GET "localhost:9200/_analyze?pretty"  -d'
> {
>   "analyzer" : "ik_max_word",
>   "text" : "我是中国人" 
> }'
{
  "tokens" : [
    {
      "token" : "我",
      "start_offset" : 0,
      "end_offset" : 1,
      "type" : "CN_CHAR",
      "position" : 0
    },
    {
      "token" : "是",
      "start_offset" : 1,
      "end_offset" : 2,
      "type" : "CN_CHAR",
      "position" : 1
    },
    {
      "token" : "中国人",
      "start_offset" : 2,
      "end_offset" : 5,
      "type" : "CN_WORD",
      "position" : 2
    },
    {
      "token" : "中国",
      "start_offset" : 2,
      "end_offset" : 4,
      "type" : "CN_WORD",
      "position" : 3
    },
    {
      "token" : "国人",
      "start_offset" : 3,
      "end_offset" : 5,
      "type" : "CN_WORD",
      "position" : 4
    }
  ]
}
最小分词器
curl -H 'Content-Type: application/json' -X GET "localhost:9200/_analyze?pretty"  -d'
{
  "analyzer" : "ik_smart",
  "text" : "我是中国人" 
}'

结果如下ik_smart

[root@localhost home]# curl -H 'Content-Type: application/json' -X GET "localhost:9200/_analyze?pretty"  -d'
> {
>   "analyzer" : "ik_smart",
>   "text" : "我是中国人" 
> }'
{
  "tokens" : [
    {
      "token" : "我",
      "start_offset" : 0,
      "end_offset" : 1,
      "type" : "CN_CHAR",
      "position" : 0
    },
    {
      "token" : "是",
      "start_offset" : 1,
      "end_offset" : 2,
      "type" : "CN_CHAR",
      "position" : 1
    },
    {
      "token" : "中国人",
      "start_offset" : 2,
      "end_offset" : 5,
      "type" : "CN_WORD",
      "position" : 2
    }
  ]
}

你可能感兴趣的:(ELK)