elasticsearch安裝配置


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等

  • 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在過濾器上下文中,會過濾掉不匹配的,但不會影響算分
        }
      }
    }
    View Code
  • 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": "2"  # 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
        
         
        View Code
      • 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": ["1","2"]
          }}}

       

  •   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"    #子字段
              }
            }
          }
        }
      }
      View Code 
    • has_child
    • has_parent

 

 
        

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM