1,安装es

安装java环境

# java --version
java version "1.8.0_65" Java(TM) SE Runtime Environment (build 1.8.0_65-b17) Java HotSpot(TM) 64-Bit Server VM (build 25.65-b01, mixed mode)

安装es  官网:https://www.elastic.co/guide/en/elasticsearch/reference/current/rpm.html

 # rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch
[elasticsearch-6.x]
name=Elasticsearch repository for 6.x packages
baseurl=https://artifacts.elastic.co/packages/6.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md # sudo yum install elasticsearch

2,es配置文件

elasticsearch.yml    配置Elasticsearch

# cat /etc/elasticsearch/elasticsearch.yml  |grep -v ^#
cluster.name: escluster #集群名称
node.name: ${HOSTNAME} #节点名称
path.data: /data/es-data/ #数据存储路径
path.logs: /var/log/elasticsearch #日志文件路径
network.host: _eth0_ # 节点要绑定的地址 http.port: 9200 # 接受http请求的端口
transport.tcp.port: 9300 # 集群节点之间通信的端口
transport.tcp.compress: true
discovery.zen.ping.unicast.hosts: ["127.0.0.1:9300"] #要加入集群的节点,如果没指定端口默认为transport.tcp.port
discovery.zen.minimum_master_nodes: 1 #默认1,必须要合理设置。避免网络故障时脑裂将集群拆分成独立集群(master_eligible_nodes/2)+1.假如有3个节点符合则设置为2.
bootstrap.memory_lock: true # 锁定进程的内存空间,防止es内存被交换出去。
xpack.security.enabled: false
xpack.monitoring.enabled: true

除此之外还有一些重要的配置。es调优的时候经常用到。

文件描述符

  • .zip .tar包安装的。

    # ulimit -n 65536 或者
    # vim /etc/security/limits.conf
    elasticsearch - nofile 65536
  • rpm包的已经将文件描述符最大数量默认为65536无需更改。

  可以通过 GET _nodes/stats/process?filter_path=**.max_file_descriptors 来检查。

禁用交换分区

  • # sudo swapoff -a
  • #  /etc/sysctl.conf  添加vm.swappiness=1
  • # 在elasticsearch.yml配置 bootstrap.memory_lock: true 锁定进程地址空间,防止es内存被交换出去。

      可以用curl -X GET "localhost:9200/_nodes?filter_path=**.mlockall" 来查看。如果"mlockall": false说明请求失败。日志里面还会有警告信息:memory locking requested for elasticsearch process but memory is not locked。可能是因为运行es的用户没有锁定内存的权限。

    解决方法:

    • 如果es是用tar或者zip包安装的

      #ulimit -l unlimited,或者
      # /etc/security/limits.conf添加
      elasticsearch - nofile 65536
    • rpm包安装的

      在/usr/lib/systemd/system/elasticsearch.service文件中,或者添加一个/etc/systemd/system/elasticsearch.service.d/override.conf文件
      [Service]
      LimitMEMLOCK=infinity
      # sudo systemctl daemon-reload

虚拟内存

  • # sysctl -w vm.max_map_count = 262144
    或者是
    # vim /etc/sysctl.conf
    vm.max_map_count=262144
    # sysctl vm.max_map_count
    # rpm包已经自动配置,无需配置。

jvm.options  配置es的jvm

-Xms256m
-Xmx256m

3,架构

filebeat--> kafka --> logstash --> elasticsearch --> kibana

filebeat收集日志传给kafka-->logstash input作为消费者消费kafka的数据 -->logstash output将input的内容传给es --> kibana上添加新索引

4,Restful API

Elasticsearch支持使用RESTful API,可以使用RESTful API来进行增加文档,删除文档等操作,也可以用于查询。

可以直接使用 kibana的 DevTools来发送restful请求,进行增删改查操作。

es 查询语句 

URI Search

参数有q, analyzer,_source,sort,from,size等

  • q

    GET my_index/doc/_search?q=quick
    GET my_index*/_search?q=title:quick
    GET _search?q=user:ketty
    GET _all/_search?q=user:ketty

Request body search

  • query

    GET test_index/_search
    {
    "query": {
    "term": {
    "age": {
    "value": "22"
    }}}}
  • from/size
    GET test_index/_search
    {
    "from": 0, #第一个结果的偏移量,第0页 from默认为0
    "size": 1, # 最大命中个数 , 1条数据 size 默认为10
    "query": {
    "term": {
    "name": {
    "value": "ketty"
    }}}}
  • sort  
  • GET test_index/_search
    {
    "query": { #先过滤出含有ketty的name字段
    "term": {
    "name": {
    "value": "ketty"
    }
    }
    },
    "sort": [ #后对这些字段排序
    {
    "age": {
    "order": "desc" #desc 倒序 asc 顺序
    }}}}
  • source filtering

默认会返回_source 所有字段的内容。

  • # "_source": false   关闭
    # "_source": "fieldname"
    # "_source": "obj.*" 可接受通配符 GET test_index/_search
    {
    "_source": {
    "excludes": "content",
    "includes": "name"
    },
    "query": {
    "term": {
    "content": {
    "value": "hello"
    }}}}

query DSL

  • query and filter context

查询上下文:文档匹不匹配这个查询,相关度高吗。是在query进行查询是的执行环境

过滤器上下文:文档匹不匹配。 不考虑相关性算分,和返回的排序问题。使用filter参数时

  • GET /_search
    {
    "query": { #查询上下文
    "bool": {
    "must": [ #两个match在查询上下文中
    { "match": { "title": "Search" }},
    { "match": { "content": "Elasticsearch" }}
    ],
    "filter": [ # 过滤器上下文
    { "term": { "status": "published" }},
    { "range": { "publish_date": { "gte": "2015-01-01" }}}
    ] # term,range在过滤器上下文中,会过滤掉不匹配的,但不会影响算分
    }
    }
    }
  • match_all query
    GET test_index/_search
    {
    "query": {
    "match_all": {}
    }
    }
  • full-context queries
    • match   query
    1. GET test_index/_search

      {
      "query": {
      "match": {
      "content": {
      "query": "hello ketty",
      "operator": "and" # 默认是or) 匹配出content字段中同时含有hello和ketty单词的文档
      }}}}
      #模糊查询 fuzziness
      GET test_index/_search
      {
      "query": {
      "match": {
      "content": {
      "query": "test tontent",
      "fuzziness": 1 # "fuzziness":"auto" 自动根据字段值长度编辑距离
      }}}}
    • match_phrase 匹配短语
    1. GET test_index/_search
      {
      "query": {
      "match_phrase": {
      "content": {
      "query": "test content" # 如果使用match,会匹配带有test,content,test content的文档
      }}}}
        # "slop":"2"  "content test" 这个顺序 也可以匹配
      # "analyzer": "my_analyzer" 可以指定分词器
    • match_phrase_prefix   匹配短语前缀
    1. PUT test_index/doc/6
       { "name":"fox",
      "message":"quick brown fox." }
      GET test_index/doc/_search
      {
      "query": {
      "match_phrase_prefix": {
      "message": {
      "query": "quick brown f",
      "max_expansions": "" # max_expansions 控制将要扩展的后缀数量
      }
      }}}
    • multi_match   多字段    
    1. GET test_index/_search
      {
      "query": {
      "multi_match": {
      "query": "hello",
      "fields": ["message","conte*"] #可以使用通配符
      }
      }
      }
    • query_string   
    • #### deafult_field  指定字段,如果不指定默认字段会查询索引中的所有字段

      GET test_index/_search

      {

      "profile":true,    #查看执行过程 
        "query": {
          "query_string": {
            "default_field": "message",
            "query": "fox AND (white OR brown)" #匹配到 "slow white fox" 和 "quick brown fox"
            }}}

      ### fields 多字段查询 
      GET test_index/_search
      {
      "query": {
      "query_string": {
      "fields": ["message","content"],
      "query": "brown AND fox"
      }}}
      等同于 -->

      {
          "query": {
            "query_string": {
            "query": "(message:brown OR content:brown) AND (message:fox OR content:fox)" 
            }}}

      #返回结果

        "_source": {"message": "quick brown fox."  }}]
      也可以在字段名中使用通配符,例如:

      GET test_index/_search
          {
            "query": {
            "query_string": {
            "fields": ["messa*"],  #使用通配符匹配字段名
            "query": "brown AND fox"
            }}}}     等同于----》

      GET test_index/_search
          {
            "query": {
            "query_string": {
            "query": "messag\\*:(brown AND fox)"   #将字段名写在query string里面。转义* 
            }}}

      # 由于\是json字符串中的特殊字符,因此需要用\进行转义,因此上面的两个反斜杠。

      # 返回结果:

        "_source": {"message": "quick brown fox."  }}]
      
      # query string syntax

      字段名 例如:
          status:active
          title:(quick OR brown)等同于 title:(quick brown) titile字段中含有quick或者brown
          author:"John Smith" author字段中包含John Smith短语的
          book.\*:(quick brown) 字段名为book.title,book.cotent之类的字段名包含quick或者brown
          _exists_:title title字段中有非null值

      通配符 ? *
          qu?ck bro* 能匹配quick或者bro*

      GET test_index/_search
             {
               "query": {
               "query_string": {
               "query": "name:ket*"   #匹配到ketty kety
                }}}

      正则表达式  可以通过包装在/中嵌入query string中
          GET test_index/_search
            {
              "query": {
              "query_string": {
              "query": "name:/k.*y/" #可以匹配name中包含ketty,kety等文档
               }}}
        模糊查询 ~1 ~2  默认编辑距离为2
          GET test_index/_search
            {
              "query": {
              "query_string": {
              "query": "mess\\*:(quikc~1)"   #可以匹配quick 
              }}}

      接近查询  指定短语中最大编辑距离   "fox quick"~5  可以匹配"quick brown fox"

      范围查询 [] 包含范围  {} 排他范围  [} {]

      date:[2018-01-01 TO 2018-07-03] 
         count: [10 TO *] 大于等于10
         age:[1 TO 5} 大于等于1 小于5
         age: >10
         age: <=5
          GET test_index/_search
          {
            "query": {
            "query_string": {
            "query": "age:[18 TO 24}" #大于等于18  小于24
            }}}

       Boosting ^ 使一个术语比另一个术语更相关 默认值是1   quick^2 fox

      布尔运算符
         + 必须存在
         - 必须不存在
         && AND
         || OR
         !  NOT

      GET test_index/_search

      {
             "query": {
             "query_string": {
             "query": "name:(!ketty)"
              }}}

      分组  (quick OR brown) AND fox

      保留字符  某些特殊字符需要用反斜杠转义: + - = && || > < ! ( ) { } [ ] ^ " ~ * ? : \ /

      <>  无法转义

      例如:要查询(1+1)=2  写成 \(1\+1\)\=2

      • lucene query syntax

        lucene查询语法
        自由文本搜索 safari 表示搜索所有字段的safari
        特定字段中搜索值 status:200
        搜索多个值 status:[400 TO 499]
        布尔 AND,OR,NOT。要查找4XX状态码并且扩展名php或html status:[400 TO 499] AND (extension:php OR extension:html)
        Lucene 支持转义特殊字符 + - && || ! ( ) { } [ ] ^ " ~ * ? : \
        这些需要在字符前使用\转义。 例如搜索(1+1):2 需要写成\(1\+1\)\:2 terms
        单个term: 搜索单个单词例如"test"或者"hello"
        短语查询:用双引号括起来一组单词 "hello world"
        多个术语可以和布尔运算符组合起来
        fields 可以指定字段 也可以使用默认字段
        字段名:术语 例如 title:Do it right 在title中搜索Do,在默认字段中搜索it和right
        通配符
        支持?和*通配符 (不能用在短语查询中)
        ? 单个字符 te?t 匹配 test text等
        * 多字符 test* 匹配 test,tests,tester等
        注意:不能用?或*作为搜索的第一个字符
        模糊匹配 roam~1
        range范围查询 []包含首尾 {}不包含首尾
        mod_date:[20170101 TO 20180606] 字段值在>=20170101 <=20180606的文档
        title:{Aida TO Carmen} 文件标题介于Aida Carmen之间但不包含Aida,Carmen
        布尔运算符 AND OR NOT 必须大写否则查不出来哦
        AND &&可替代AND
        OR || 可以替代OR 要搜索包含 apache或者nginx的文档,可用查询 apache nginx 或者是 apache OR nginx
        + 必须包含该字段值 例如 +jakarta lucene 表示必须包含jakarta可能包含lucene的文档
        NOT - 可代替NOT 必须不包含
        分组 用括号将子句分组为子查询。
        (jakarta OR apache) AND website 有website 可能有jakarta或apache
        Field 分组 使用括号将多个字句分组到单个字段
        title:(+return +"pink panther") 搜索title字段包含单词return和短语"pink panther"的
        转义 特殊字符需要转义
        + - && || ! ( ) { } [ ] ^ " ~ * ? : \
        搜索(1+1):2 应该使用 \(1\+1\)\:2
      • kuery 
        加引号是短语搜索。 message:"Quick brown fox"  将搜索短语 ,不加引号将字段先分词再查询,可以匹配到brown quick fox
        多个搜索项必须由布尔运算符分割。布尔运算符不区分大小写 and or not
        response:200 extension:php 将写成 response:200 and extension:php
        默认情况下 and优先级高于or 可以用括号( )分组覆盖优先级
        单个字段搜索多个值 response:(200 or 400)
        范围。 变为:bytes>1000。在 lucene里面是 bytes:>100
        >,>=,<,<=
        存在的查询。response:* 表示存在字段
        通配符。machine: win* 通配符 可以匹配win7 win10等
        machine.os*: win* 。使用的是es里面的复合查询
        在kibana搜索条里面使用kuery source : /ubox/logs/test*
        使用lucene source : \/ubox\/logs\/test*
    • simple_query_string   

        与常规的query_string不同,simple_query_string永远不会抛异常,并丢弃查询的无效部分

simple_query_string支持的特殊字符有:+   |   -   "   *   (AND)  ~N在单词后  ~N在短语后  搜索这些特殊字符需转义

    1. GET test_index/_search
      {
      "query": {
      "simple_query_string": {
      "query": "(test content) | fox + white", # 匹配到一条 "message": "slow white fox."
      "fields": ["content","mess*"],
      "default_operator": "AND"
      }}}
      # +AND |OR -否定 *在末尾表示前缀查询
  •  Term level queries

    • term

      #区别于match。 term不会对查询语句做分词,而是将查询语句作为整个单词
      GET test_index/_search
      {
      "query": {
      "term": {
      "message": {
      "value": "test message" #无法匹配到"this is a test message"
      }}}} GET test_index/_search
      {
      "query": {
      "match": {
      "message": "test alkdfj" #可以匹配"this is a test message"
      }}}
    • terms  查询多个单词
      GET test_index/_search
      {
      "query": {
      "terms": {
      "message": [
      "test",
      "message"
      ]}}}
    • range   范围查询 
      GET test_index/_search
      {
      "query": {
      "range": {
      "age": {
      "gte": 10, # gte 大于等于 ,gt 大于
      "lte": 20 # lte 小于等于, lt 小于
      }}}}
      #按时间的range
      GET /_search
      {
      "query": {
      "range": {
      "@timestamp": {
      "gte": "now-1h/d", # -1h:减去1小时, /d:向下舍入到UTC 00:00
      "lte": "now"
      }}}}
    • exists 字段存在

      GET test_index/_search
      {
      "query": {
      "exists":{
      "field":"name"
      }}}
    • prefix   前缀查询

      GET test_index/_search
      {
      "query": {
      "prefix": {
      "name": {
      "value": "ket"
      }}}}
    • wildcard   通配符查询

      GET test_index/_search
      {
      "query": {
      "wildcard": {
      "name": {
      "value": "ke*y"
      }}}}
    • regexp   正则表达式查询

      GET test_index/_search
      {
      "query": {
      "regexp":{
      "name":"k.*y"
      }}}
    • fuzzy   模糊查询

      GET test_index/_search
      {
      "query": {
      "fuzzy": {
      "name":{
      "value": "ket",
      "fuzziness": 2 #fuzziness 最大编辑距离
      }}}}
    • type
    • GET _search
      {
      "query": {
      "type":{
      "value":"my_type"
      }}}
    • ids 
      GET _search
      {
      "query": {
      "ids": {
      "type": "my_type",
      "values": ["",""]
      }}}
  •   compoud queries 复合查询
    • constant_score 

      GET _search
      {
      "query": {
      "constant_score": {
      "filter": { # filter语句在过滤器上下文中 得分被忽略
      "term": {
      "name": "ketty"
      }
      },
      "boost": 1.2 #设定boost的值
      }}}
    • bool 

       bool查询由一个或多个子句构建,每个子句都有一个类型. 类型有:must,must not,should,filter

    • GET nginx-access-log-2018.06.03/_search
      {
      "query": {
      "bool": {
      "must": [
      {"match":{
      "source":"/ubox/logs/budd/access.log"
      }},
      {"range":{
      "@timestamp":{
      "gte":"2018-06-03T00:00:00.000",
      "lte":"2018-06-03T02:00:00.000"
      }
      }},
      {"regexp":{
      "url_path":"/sync/vmSkin.*"
      }}
      ]
      }}}
  •  joining queries

    • nested  嵌套类型的查询

      PUT test_index
      {
      "mappings": {
      "doc": {
      "properties": {
      "man":{ #设置man字段为嵌套类型
      "type": "nested",
      "properties": {
      "age":{
      "type":"integer"
      },
      "name":{
      "type":"text"
      }}}}}}}} PUT test_index/doc/1
      {
      "man":[
      {
      "name":"alice white",
      "age":34
      },
      {
      "name":"peter brown",
      "age":26
      }
      ]
      }
      GET test_index/_search #查询语句
      {
      "query": {
      "nested": { #关键字
      "path": "man", #嵌套字段
      "query": {
      "match": {
      "man.name": "peter" #子字段
      }
      }
      }
      }
      }
    • has_child
    • has_parent
												

elasticsearch查询语句的更多相关文章

  1. Func<T,T>应用之Elasticsearch查询语句构造器的开发

    前言 之前项目中做Elasticsearch相关开发的时候,虽然借助了第三方的组件PlainElastic.Net,但是由于当时不熟悉用法,而选择了自己拼接查询语句.例如: string queryG ...

  2. elasticsearch查询语句总结

    query 和  filter 的区别请看:https://www.cnblogs.com/bainianminguo/articles/10396956.html Filter DSL term 过 ...

  3. SpringBoot使用注解的方式构建Elasticsearch查询语句,实现多条件的复杂查询

    背景&痛点 通过ES进行查询,如果需要新增查询条件,则每次都需要进行硬编码,然后实现对应的查询功能.这样不仅开发工作量大,而且如果有多个不同的索引对象需要进行同样的查询,则需要开发多次,代码复 ...

  4. 常用ElasticSearch 查询语句

    为了演示不同类型的 ElasticSearch 的查询,我们将使用书文档信息的集合(有以下字段:title(标题), authors(作者), summary(摘要), publish_date(发布 ...

  5. ElasticSearch 论坛搜索查询语句

    概述 研究论坛搜索如何综合时间和TF/IDF权重. 自定义权重计算的效率问题 数据结构 假设有一个论坛的搜索 字段包括: subject:标题 message:内容 dateline:发布时间 tag ...

  6. ElasticSearch 7.X版本19个常用的查询语句

    整理一篇常用的CRUD查询语句,之前这篇文件是在17年左右发表的,从英文翻译过来,现在采用7.x 版本进行实验,弃用的功能或者参数,我这边会进行更新,一起来学习吧. 为了演示不同类型的 Elastic ...

  7. elasticsearch 查询(match和term)

    elasticsearch 查询(match和term) es中的查询请求有两种方式,一种是简易版的查询,另外一种是使用JSON完整的请求体,叫做结构化查询(DSL). 由于DSL查询更为直观也更为简 ...

  8. Elasticsearch 查询与过滤

    今天在给上级汇报工作的时候,被问到了这个问题,一时也没回到上来. 英文原文: https://www.elastic.co/guide/en/elasticsearch/guide/current/_ ...

  9. ElasticSearch查询 第五篇:布尔查询

    布尔查询是最常用的组合查询,不仅将多个查询条件组合在一起,并且将查询的结果和结果的评分组合在一起.当查询条件是多个表达式的组合时,布尔查询非常有用,实际上,布尔查询把多个子查询组合(combine)成 ...

随机推荐

  1. Flask学习【第3篇】:蓝图、基于DBUtils实现数据库连接池、上下文管理等

    小知识 子类继承父类的三种方式 class Dog(Animal): #子类 派生类 def __init__(self,name,breed, life_value,aggr): # Animal. ...

  2. 取球游戏|2012年蓝桥杯B组题解析第十题-fishers

    (25')取球游戏 今盒子里有n个小球,A.B两人轮流从盒中取球,每个人都可以看到另一个人取了多少个,也可以看到盒中还剩下多少个,并且两人都很聪明,不会做出错误的判断. 我们约定: 每个人从盒子中取出 ...

  3. 【做题】cf603E——线段树分治

    首先感谢题解小哥,他在标算外又总结了三种做法. 此处仅提及最后一种做法. 首先考虑题目中要求的所有结点度数为奇数的限制. 对于每一个联通块,因为所有结点总度数是偶数,所以总结点数也必须是偶数的.即所有 ...

  4. P3412 仓鼠找sugar II

    思路 挺神的概率期望.. 好吧是我太弱了,完全没有往那里想 注意期望是具有线性性的,一条路径的期望可以变成每条边的期望求和 概率是某件事发生的可能性,期望是某件事确定发生的代价 首先没有终点的条件并不 ...

  5. CF600E Lomsat gelral(dsu on tree)

    dsu on tree跟冰茶祭有什么关系啊喂 dsu on tree的模板题 思想与解题过程 类似树链剖分的思路 先统计轻儿子的贡献,再统计重儿子的贡献,得出当前节点的答案后再减去轻儿子对答案的贡献 ...

  6. Vim的一些使用

    Vim的三种模式 normal(普通模式) insert(插入模式) command(命令模式) Vim的工作方式不同于常规的编辑器,在常规编辑器下对应到Vim中就是一直使用insert模式进行操作, ...

  7. Microsoft.EntityFrameworkCore.Sqlite的学习

    SQLite in ASP.NET Core with EntityFrameworkCore ASP.NET Core 2: Using SQLite as a light weight datab ...

  8. 性能跃升50%!解密自主研发的金融级分布式关系数据库OceanBase 2.0

    小蚂蚁说: 相信大家对蚂蚁金服自主研发的金融级分布式关系数据库OceanBase的故事不再陌生了.在刚刚过去的2018年天猫双11中,成交额2135亿再次创造了新纪录,而支撑今年双11的支付宝核心链路 ...

  9. Tarjan模板题——牛的舞会

    题目描述 约翰的N (2 <= N <= 10,000)只奶牛非常兴奋,因为这是舞会之夜!她们穿上礼服和新鞋子,别 上鲜花,她们要表演圆舞. 只有奶牛才能表演这种圆舞.圆舞需要一些绳索和一 ...

  10. python 获取进程数据

    from multiprocessing import Process, Manager def func(dt, lt): ): key = 'arg' + str(i) dt[key] = i * ...