Elasticsearch+Kibana·入门·贰·DSL专题

Posted 欧尼焦

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Elasticsearch+Kibana·入门·贰·DSL专题相关的知识,希望对你有一定的参考价值。

文章目录

1 DSL查询文档

1.1 DSL查询分类

查询类型解释关键字相当于mysql
查询所有查询出所有数据,一般测试用。① match_allselect *
全文检索(full text)查询利用分词器对用户输入内容分词,然后去倒排索引库中匹配。①match_query;② multi_match_query模糊查询
精确查询根据精确词条值查找数据,一般查找keyword、数值、日期、boolean等类型字段① ids;② range;③ term
地理(geo)查询根据经纬度查询① geo_distance;② geo_bounding_box
复合(compound)查询将上述各种查询条件组合起来,合并查询条件。① bool;② function_score

DSL语法:

GET /indexName/_search

  "query": 
    "查询类型": 
      "查询条件": "条件值"
    
  

// 查询所有
GET /indexName/_search

  "query": 
    "match_all": 
    
  

1.2.全文检索查询

1.2.1 使用场景

商城输入框

1.2.2.基本语法:match与multi_match

属性解释备注
match单字段查询根据一个字段查询
multi_match多字段查询,任意一个字段符合条件,只要查到就给你返回根据多个字段查询,参与查询字段越多,查询性能越差,建议使用all字段,copy_to方法优化

match查询语法:

GET /indexName/_search

  "query": 
    "match": 
      "FIELD": "TEXT"
    
  

mulit_match语法:

GET /indexName/_search

  "query": 
    "multi_match": 
      "query": "TEXT",
      "fields": ["FIELD1", " FIELD12"]
    
  

1.2.3 示例:match与multi_match

multi_match 示例:

match 示例:

注意:我们发现上述match、multi_match查询到的结果相同,因为:在Elasticsearch+Kibana·入门·壹中创建索引库时,我们使用到组合字段all,已经将brand、name、business值利用copy_to复制到all字段中,因此会出现查询结果相同。

  • 在实际开发者,当查询多个字段时使用copy_to方法,可以减少搜索字段,相较可以提高查询性能。

1.3.精准查询

精准查询一般查找keyword、数值、日期类型字段,所以不会对搜索条件分词

属性解释
term根据词条精确值查询
range根据值的范围查询

1.3.1 term查询

语法:

// term查询
GET /indexName/_search

  "query": 
    "term": 
      "FIELD": 
        "value": "VALUE"
      
    
  

term查询:

1.3.2 range查询

语法:

// range查询
GET /indexName/_search

  "query": 
    "range": 
      "FIELD": 
        "gte": 10, // 这里的gte代表大于等于,gt则代表大于
        "lte": 20 // lte代表小于等于,lt则代表小于
      
    
  

range查询示例:

1.4 地理坐标查询

官方参阅文档:https://www.elastic.co/guide/en/elasticsearch/reference/current/geo-queries.html

应用场景:例如查找附近的酒店等。

1.4.1 矩形范围查询

语法:

// geo_bounding_box查询
GET /indexName/_search

  "query": 
    "geo_bounding_box": 
      "FIELD": 
        "top_left":  // 左上点
          "lat": 31.1,
          "lon": 121.5
        ,
        "bottom_right":  // 右下点
          "lat": 30.9,
          "lon": 121.7
        
      
    
  

1.4.2 附近查询

附近查询(距离查询)geo_distance:以指定点为中心,指定距离为半径的圆形区域内所需信息。

语法:

// geo_distance 查询
GET /indexName/_search

  "query": 
    "geo_distance": 
      "distance": "15km", // 半径
      "FIELD": "31.21,121.5" // 圆心
    
  

附近查询示例:

1.5.复合查询

复合(compound)查询:将简单查询组合起来,实现复杂的搜索逻辑。

属性解释
fuction score算分函数查询,通过控制文档相关性算分(权重),控制文档排名
bool query布尔查询,利用逻辑关系组合多个查询其他查询,实现复杂搜索

1.5.1 相关性算分

在elasticsearch中,早期使用的打分算法是TF-IDF算法,公式如下:

注意:TF-IDF算法的缺陷,词条频率越高,文档得分(score)越高,词条出现次数对文档影响较大。而BM25则会使单个词条的算分出现上限,分子(词条出现次数过多)趋向于文档中词条总数时,曲线会变平滑,此时相关性算分幅度基本保持不变,使得控制文档排名业务复杂。

5.1版本后,elasticsearch将算法改进为BM25算法,公式如下

1.5.1.2 算分函数查询

算分函数内容解释
原始查询查询方式可根据需求改变,如:查询品牌中出现万怡字眼的,并中根据下方过滤,得到最终负荷调节的将要设置算分的文档,并得到默认原始算分文档
过滤条件查询方式可根据需求改变,得到最终符合条件的将要设置算分文档
算分函数与下方boost_mode相结合,再依据原始算分,得到最终算分结果
运算模式也就是加权模式,multiply与weight相乘(默认方式)

1.5.1.3 算分函数运行流程

① 根据原始条件查询文档,得到原始算分
② 根据过滤条件,过滤文档
③ 得到符合过滤条件的文档,设置权重,得到函数算分
④ 将此处的加权模式上方函数算分做出计算,得到最终相关性算分

1.5.1.4 算分函数示例

#将上海地区的如家品牌酒店排名靠前
GET /hotel/_search

  "query": 
    "function_score":
      "query": 
        "match": 
          "all": "上海"
        
      ,
      "functions": [
        
          "filter": 
            "term": 
              "brand": "如家"
            
          ,
          "weight": 100
        
      ],
      "boost_mode": "multiply"
    
  

1.5.2 布尔查询

布尔查询(bool):查询时,在bool方法体内,使用一个或多个支持下的组合,每一个字句就是一个子查询,子查询的组合方式:

条件解释
must必须匹配每个子查询,类似“与”
should选择性匹配子查询,类似“或”
must_not必须不匹配,不参与算分,类似“非”
filter必须匹配,不参与算分

注意:打分的字段越多,查询的性能也越差。优化方法:

  • ①当全文检索时,使用must查询,参与算分
  • ②其他过滤条件,采用filter查询,不参与算分

1.5.2.1 语法示例

GET /hotel/_search

  "query": 
    "bool": 
      "must": [
        "term": "city": "上海" 
      ],
      "should": [
        "term": "brand": "皇冠假日" ,
        "term": "brand": "华美达" 
      ],
      "must_not": [
         "range":  "price":  "lte": 500  
      ],
      "filter": [
         "range": "score":  "gte": 45  
      ]
    
  

1.5.2.2 示例

需求:搜索名字包含“如家”,价格不高于400,在坐标31.21,121.5周围10km范围内的酒店。

#搜索名字包含“如家”,价格不高于400,在坐标31.21,121.5周围10km范围内的酒店

GET /hotel/_search

  "query": 
    "bool": 
      "must": [
        
          "match": //模糊查询,匹配名字中含有如家关键字的酒店吗
            "name": "如家"
          
        
      ],
      "must_not": [
        
          "range": //子查询
             "price": 
              "gt": 400 //非大于400,即小于400的价格
            
          
        
      ],
      "filter": [ //过滤子查询,得到位置信息内的相关酒店
        
          "geo_distance": 
            "distance": "10km",
            "location": 
              "lat": 31.21,
              "lon": 121.5
            
          
        
      ]
    
  

Elastic Stack之kibana入门

 为了解决公司的项目在集群环境下查找日志不便的问题,我在做过简单调研后,选用Elastic公司的Elastic Stack产品作为我们的日志收集,存储,分析工具。

Elastic Stack是ELK(Elasticsearch,Logstash,Kibana)从5版本开始的新名称,那么的他们都能干什么?参见下图:

技术分享图片

 

我们使用logstash来收集日志,Elasticsearch存储日志,Kibana用来搜索并展示可视化的页面给用户。

ok,本章重点讲Kibana在linux下的安装,假设你已经安装了Elasticsearch,logstash。

使用cat /etc/centos-release查看系统版本:

  CentOS Linux release 7.2.1511 (Core) 

使用cat /proc/version 查看系统内核

  Linux version 3.10.0-327.el7.x86_64 ([email protected]) (gcc version 4.8.3 20140911 (Red Hat 4.8.3-9) (GCC) ) #1 SMP Thu Nov 19 22:10:57 UTC 2015

由于我的服务器环境无法连接外网,这里采用rpm的方式安装,那么首先我们需要先准备好rpm,从官网下载kibana-6.1.2-x86_64.rpm文件。官网下载页传送门:

  https://www.elastic.co/downloads/kibana

 

下载完成后,使用rpm命令安装

   rpm -ivh /elk/kibana-6.1.2-x86_64.rpm

安装完毕,使用systemd来将kibana设置为开机启动

  sudo /bin/systemctl daemon-reload

  sudo /bin/systemctl enable kibana.service

如果需要外网访问,将kibaba.yml中的server.host设置为0.0.0.0,接下来我们启动服务

  sudo systemctl start kibana.service

使用IP:5601访问kibana,界面如下:

技术分享图片

 

 默认打开discover面板。但我们首先需要到management中创建Index Pattern。符合规则的Index Pattern将被用来匹配elasticsearch数据库中的index。例如,我创建了一个logstash-*的Index Pattern,能匹配到logstash-2018.01.18

技术分享图片

 

简单配置后,接下来我们就可以去discover菜单查询数据了。

技术分享图片

 

 在右上角有时间选项点击可以展开更多选择,默认展示最近15分钟,根据需要选择。

技术分享图片

 

 kibana支持Lucene query sysntax,此外Kuery为kibana指定的查询语言。

在搜索栏输入任意字符,Kibana将使用message作为默认字段,将输入字符进行分词检索。注意:如需要使用中文分词,需要使用插件进行相关配置。

指定字段检索

  message:injected

将输入字符使用双引号包起来,则输入字符会作为一个短语搜索

  path:"/logs/xxxx/springframework.log"

如下字符需要使用\\进行转义:

  + - && || ! () {} [] ^" ~ * ? : \\

通配符:

  ? 匹配单个字符

  * 匹配0到多个字符

近似搜索:

  "charA charB"~10 表示charA前后10个词内出现charB

范围搜索:

  [ ] 表示端点数值包含在范围内,{ } 表示端点数值不包含在范围内

  数值类型示例,100到200:length:[100 TO 200]

  日期类型示例,6小时之内:date:{"now-6h" TO "now"}

      y years
      M months
      w weeks
      d days
      h hours
      H hours
      m minutes
      s seconds

  相关函数和示例:

      and path:"springframework*" AND @timestamp:["now-1h" TO "now"]

      orpath:"springframework*" OR @timestamp:["now-1h" TO "now"]

      notNOT path:"springframework*"  或者   !path:"springframework*" 

      is path:"springframework*" 

      range : @timestamp:["now-1h" TO "now"]

      exists: _exists_:path  ##必须存在path字段

      

  

      

  

 

 

以上是关于Elasticsearch+Kibana·入门·贰·DSL专题的主要内容,如果未能解决你的问题,请参考以下文章

ELK:elasticsearch快速入门之Kibana+Logstash安装

elasticsearch入门使用 kibana安装使用

Elasticsearch+Kibana·入门·壹

elk快速入门-在kibana中如何使用devtools操作elasticsearch

Elasticsearch入门——Elasticsearch7.8.0版本和Kibana7.8.0版本的下载安装(win10环境)

Elasticsearch入门——Elasticsearch7.8.0版本和Kibana7.8.0版本的下载安装(win10环境)