ElasticSearch安裝使用及知識點總結

 一、es的應用
1、對於海量數據具有優於傳統關係型數據庫的查詢速度,對文本具有多樣化的搜索功能。
2、可以做Json文檔數據庫,有優秀的讀寫性能,同時也支持地理位置查詢,還方便地理位置和文本混合查詢。
3、監控:統計、日誌類時間序的數據存儲和分析、可視化,這方面ELK是引領者。
 二、es的核心概念
內部基本概念:
index、type、document、field含義分別類似於mysql的庫、表、行、列。
shard:分片。
replica:副本。
分片副本機制可以理解爲類似hdfs的分片副本機制,每個分片有完整的建立索引和處理請求的能力,有利於集羣擴展和高可用。
es是基於Lucene的搜索服務器。
採用restful風格curl方式訪問。
es中是使用的是json格式的查詢語句:QueryDSL。
 三、對於索引的理解
es中存在倒排索引、正排索引,搜索使用倒排索引比關係型數據庫的B-Tree索引要快,倒排索引包括:
文檔的列表,文檔的數量,詞條在每個文檔中出現的次數,出現的位置,每個文檔的長度,所有文檔的平均長度
正排索引是有序的,爲document => field value的映射列表
索引建立分預處理,分詞,標準化三步,對於英文,索引的建立不區分大小寫、不區分單複數、含義相同歸爲同義詞
所有搜索都依賴索引,若索引不存在,即使數據存在也不會搜索到,所有索引的建立與否可由相應的字段屬性進行控制。
 四、es、kibana的安裝(非常詳細)
詳見附錄1:
 五、數據類型和所有字段屬性(很全)
詳見附錄2:
 六、分詞器
 1、es內置4種分詞器:
standard 分詞器:(默認的)他會將詞彙單元轉換成小寫形式,並去除停用詞和標點符號,支持中文采用的方法爲單字切分
simple 分詞器:首先會通過非字母字符來分割文本信息,然後將詞彙單元統一爲小寫形式。該分析器會去掉數字類型的字符。
Whitespace 分詞器:僅僅是去除空格,對字符沒有大小寫轉換,不支持中文;
並且不對生成的詞彙單元進行其他的標準化處理。
language 分詞器:特定語言的分詞器,不支持中文
 2、因爲涉及中文的場景比較多,所以需要單獨安裝的中文分詞器(ik分詞器)
使用ik分詞器需要在手動建立索引時爲字段單獨聲明兩個屬性:
"analyzer": "ik_max_word",
"search_analyzer": "ik_max_word"
其中:analyzer是字段文本的分詞器,search_analyzer是搜索詞的分詞器。ik_max_word分詞器是插件ik提供的,可以對文本進行最大數量的分詞(常用),對應的還有ik_smart_word,可以對文本進行最粗的分詞。
ik分詞器的安裝詳見附錄3:
 七、案例解析:
 1、put方式手動建立索引:
shell
PUT /lib                          //index名稱
{
    "settings":{                   //索引屬性
    "number_of_shards" : 5,        //分片數
    "number_of_replicas" : 1       //副本數
    },
   "mappings": {                  //包含字段和類型
      "article": {                //type名
        "properties": {           //正文
          "author_id": {          //字段名
            "type": "long"        //數據類型爲long
          },
          "content": {            //字段名
            "type": "text",       //定義第一數據類型爲text(做分詞)
            "fields": {           //定義第二數據類型爲keyword(不做分詞)
              "keyword": {
                "type": "keyword",
                "ignore_above": 256       //忽略256字符後的詞
              }
            }
          },
          "title": {
             "type": "text",
              "analyzer": "ik_max_word",           //指定字段文本的分詞器
              "search_analyzer": "ik_max_word"     //指定搜索詞的分詞器
              }
            }
          }
        }
      }
    }
}

 2、查詢結果分析
shell
{
    "took": 419,                 //查詢花費時間
    "timed_out": false,          //是否查詢超時(可設置超時時間)
    "_shards": {                 //分片信息
    "total": 3,                  //分片總數
    "successful": 3,             //成功數
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 3,                //命中總數
    "max_score": 0.6931472,    //最高分
    "hits": [                  //全部結果
      {
        "_index": "lib3",
        "_type": "user",
        "_id": "3",
        "_score": 0.6931472,
        "_source": {           //正文內容
          "address": "bei jing hai dian qu qing he zhen",
          "name": "lisi"
        }
      }
    }

 八、部分查詢語句介(kibana中):
PUT新增數據(全字段覆蓋,相當於先刪在增)
POST是修改(update)
Multi Get API(批量查詢)
Bulk API(批量增刪改)
bulk在內存中處理數據,一次的處理量默認不超過100M,可在elasticsearch.yml中修改
查詢並排序:
GET /lib3/user/_search?q=name:zhaoliu&sort=age:desc
term查詢(精確查詢):
terms查詢(多個精確查詢,or的關係):
query查詢(控制查詢返回量):
match查詢(先分詞,再查詢):
結果根據相似度高低排序
multi_match查詢(多字段):
match_phrase查詢(短語匹配):
匹配含有完全一致的短語的字段,無視標點
可只返回想要的字段(寫在source裏):
通過includes、excludes控制加載字段(可優化速度):
shell
GET /lib3/user/_search
{
    "query": {
        "match_all": {}
    },
    "_source": {
          "includes": ["name","address"],
          "excludes": ["age","birthday"]
      }
}

使用sort實現排序:
wildcard查詢(通配符查詢):
允許使用通配符* 和 ?來進行查詢
*代表0個或多個字符
?代表任意一個字符
模糊查詢(要搜索的數據不清楚時):
Filter查詢:
filter是不計算相關性的,同時可以cache(緩存)。因此,filter速度要快於query。
bool過濾查詢:
嵌套使用bool:
過濾非空查詢:
過濾器緩存:
ElasticSearch提供了一種特殊的緩存,即過濾器緩存(filter cache),用來存儲過濾器的結果,被緩存的過濾器並不需要消耗過多的內存(因爲它們只存儲了哪些文檔能與過濾器相匹配的相關信息),而且可供後續所有與之相關的查詢重複使用,從而極大地提高了查詢性能。
開啓方式:在filter查詢語句後邊加上
"_catch":true
聚合查詢:
複合查詢(將多個基本查詢組合成單一查詢的查詢):
使用bool查詢
接收以下參數:
must:
    文檔 必須匹配這些條件才能被包含進來。
must_not:
    文檔 必須不匹配這些條件才能被包含進來。
should:
    如果滿足這些語句中的任意語句,將增加 _score,否則,無任何影響。它們主要用於修正每個文檔的相關性得分。 
filter:
    必須 匹配,但它以不評分、過濾模式來進行。這些語句對評分沒有貢獻,只是根據過濾標準來排除或包含文檔。
相關性得分是如何組合的。每一個子查詢都獨自地計算文檔的相關性得分。一旦他們的得分被計算出來, bool查詢就將這些得分進行合併並且返回一個代表整個布爾操作的得分,對於可以切分爲多個詞的match搜索,es會在底層自動將這個match query轉換爲bool的語法bool should,指定多個搜索詞,同時使用term query。

 九、一些小的知識點
集羣自動負載均衡
所有節點均可處理請求
分片機制
單節點時只能創建主分片,副本是不能創建的,即使設置1也不會執行
水平擴容時,primary shard和replica shard不在一個節點上
所以集羣擴容的極限數量就是shard數,primary shard數量是不能改變的,可以增加replica shard數量
集羣的容錯性,保證至少有一個shard和副本存在。3節點6shard最多接受一臺宕機
提高容錯性:多設置副本
若主節點master宕機,會先選舉master,然後master把丟失的副本提升爲primary,宕機的服務器起來再拷貝一份到該服務器作爲replica
元數據解析 id index type
id可以put方式指定,也可post方式自動生成id,關係型數據庫一般有id,可以指定id自動生成爲GUID,
_source元數據,查詢時_source下爲文檔數據
修改文檔可以put新建覆蓋,或者post修改
post方式比put方式網絡傳輸次數少,提高性能,併發衝突可能性降低
es有內置的腳本支持,可以基於groovy腳本實現複雜的操作(if、初始化)

數據路由:es確定文檔存在那個分片的過程(所以分片多負載大)
默認使用hash%算法,可以手動指定
查詢時也通過hash取餘找到所在分片,用輪詢方法均衡分片和副本

設置超時時間!!:返回超時前查到的內容
shell
GET /lib3/user/_search?timeout=10ms
{
    "_source": ["address","name"],
    "query": {
        "match": {
            "interests": "changge"
        }
    }
}


查詢深度from增加後查詢速度大幅度下降(網絡、內存、cpu)

copy_to字段是把其它字段中的值,以空格爲分隔符組成一個大字符串,然後被分析和索引,但是不存儲,也就是說它能被查詢,但不能被取回顯示。注意:copy_to指向的字段字段類型要爲:text

分詞後不能排序,而text默認分詞,所以要給他設置第二個類型keyword類型,"raw"相當於他的替身
shell
PUT /lib3
{
    "settings":{
        "number_of_shards" : 3,
        "number_of_replicas" : 0
      },
     "mappings":{
      "user":{
        "properties":{
            "name": {"type":"text"},
            "address": {"type":"text"},
            "age": {"type":"integer"},
            "birthday": {"type":"date"},
            "interests": {
                "type":"text",
                "fields": {
                  "raw":{
                     "type": "keyword"
                   }
                },
                "fielddata": true
             }
          }
        }
     }
}

tf-idf算法(加GET /lib3/user/_search?explain=true可顯示計算過程每步分數)
在document中出現次數越多,相關度越高,在所有文本出現次數越多,相關度越低,字段越長,相關度越低(頻率)。

果一次性要查出來比如10萬條數據,那麼性能會很差,此時一般會採取用scoll滾動查詢,一批一批的查,直到所有數據都查詢完爲止。
1.scoll搜索會在第一次搜索的時候,保存一個當時的視圖快照,之後只會基於該舊的視圖快照提供數據搜索,如果這個期間數據變更,是不會讓用戶看到的
2.採用基於_doc(不使用_score)進行排序的方式,性能較高
3.每次發送scroll請求,我們還需要指定一個scoll參數,指定一個時間窗口,每次搜索請求只要在這個時間窗口內能完成就可以了

動態模板

重建索引!!
reindex
自動映射爲data類型後不能再添加字符串類型,所以修改字段類型爲text
但是通常字段的類型一確定就不能修改,所以只能新建新的索引,新索引的字段類型是字符串類型,把舊的數據再導入新的索引中
而切換索引需要重啓應用程序,爲了不重啓,啓用別名
PUT /index1/_alias/index2
一般舊索引數據量大,所以使用scroll批量查詢數據,然後再bulk批量添加到新索引中,再將別名index2和新的索引關聯,應用程序不用重啓
POST /_aliases
{
  "actions": [
    {"remove": {"index":"index1","alias":"index2"}},
    {"add": {"index": "newindex","alias": "index2"}}
]
}

處理併發:樂觀鎖
根據版本號(version)增刪改自動加一
內部版本控制:只有操作版本號和數據版本號一致才執行
外部版本控制:version_type=external 操作版本號需要大於數據版本號才能執行

mapping
定義了字段的數據類型等屬性
查看mapping:
GET /myindex/article/_mapping
創建mapping案例:
shell
PUT /lib2
{
    "settings":{
    "number_of_shards" : 5,
    "number_of_replicas" : 1
    },
     "mappings":{
      "books":{
        "properties":{
            "title":{"type":"text"},
            "name":{"type":"text","index":false},
            "publish_date":{"type":"date","index":false},
            "price":{"type":"double"},
            "number":{"type":"integer"}
        }
      }
     }
}

列舉幾個常用mapping屬性:
"boost":1.23//字段級別的分數加權,默認值是1.0
"doc_values":false//對not_analyzed字段,默認都是開啓,分詞字段不能使用,對排序和聚合能提升較大性能,節約內存
"ignore_above":100 //超過100個字符的文本,將會被忽略,不被索引
"similarity":"BM25"//默認是TF/IDF算法,指定一個字段評分策略,僅僅對字符串型和分詞類型有效
"index": true//分詞,不分詞是:false,設置成false,字段將不會被索引
"analyzer":"ik"//指定分詞器,默認分詞器爲standard analyzer
注:字段type爲text類型會進行分詞,keyword不會分詞

 附錄1:
 centos7下es安裝步驟:
確保jdk1.8環境
下載elasticsearch-6.3.1.tar.gz
官網:https://www.elastic.co/downloads/elasticsearch
在/opt/arbd文件夾內操作:
tar -zxvf elasticsearch-6.3.1.tar.gz
elasticsearch現版本以不允許使用root用戶開啓,所以這裏建立新的用戶和組elk
groupadd elk
等幾秒,否則報錯
useradd elk -g elk -p yfzx1234
chown -R elk:elk elasticsearch-6.3.1/
su elk
mkdir elasticsearch-6.3.1/data
vi elasticsearch-6.3.1/config/elasticsearch.yml
添加(一些默認值也被單獨列出是爲了某些情況下方便修改,注意使用utf-8編碼):
#設置集羣名稱
cluster.name: Cluster150

#設置節點名稱
node.name: cdh150

#修改data存放的路徑
path.data: /opt/arbd/elasticsearch-6.3.1/data

#修改logs日誌的路徑
path.logs: /opt/arbd/elasticsearch-6.3.1/logs

# 索引的刷新頻率,默認1秒,太小會造成索引頻繁刷新,新的數據寫入就慢了。(此參數的設置需要在寫入性能和實時搜索中取平衡)通常在ELK場景中需要將值調大一些比如60s,在有_template的情況下,需要設置在應用的_template中才生效。
index.refresh_interval: 1s

# 設置索引的副本數,默認爲1
index.number_of_replicas: 1

#配置內存使用用交換分區
bootstrap.memory_lock: true

#監聽的網絡地址(本機ip)
network.host: 192.168.2.150

#開啓監聽的端口(默認9200)
http.port: 9200

#增加新的參數,這樣head插件可以訪問es
http.cors.enabled: true
http.cors.allow-origin: "*"
關閉防火牆
systemctl stop firewalld.service
前臺啓動(測試時建議使用,用ctrl+c停止服務)
./elasticsearch-6.3.1/bin/elasticsearch
後臺啓動
./elasticsearch-6.3.1/bin/elasticsearch -d
另啓動一窗口
crul cdh150:9200
若不報錯返回一json字符串即爲安裝成功
若報內存不足問題
vi elasticsearch-6.3.1/bin/jvm.options
調大-Xms512m -Xmx512m參數
若報max file descriptors/memory locking、max number of threads、max virtual memory不足問題,分別對應下面三個配置文件的修改(root用戶):
vi /etc/security/limits.conf       //文件最後加入(elk指啓動es的用戶)
elk soft nofile 65536
elk hard nofile 65536
elk soft nproc 4096
elk hard nproc 4096
elk soft memlock unlimited
elk hard memlock unlimited
重新登錄纔可生效(重新打開xshell窗口)!

vi /etc/security/limits.d/20-nproc.conf 
修改爲 elk soft nproc 4096

vi /etc/sysctl.conf
vm.max_map_count=655360
執行以下命令生效:
sysctl -p

安裝head集羣管理工具插件需要安裝git(略)

 安裝kibana
下載Kibana
https://www.elastic.co/downloads/kibana
vi /usr/local/kibana/config/kibana.yml
將server.host,elasticsearch.url修改成所在服務器的ip地址(注:url必須爲http://ip:port 格式)例:
server.port: 5601
server.host: "trs1"
elasticsearch.url: "http://192.168.110.133:9200"
關閉防火牆
6.x版本自帶x-pack集羣管理插件
啓動:
./bin/kibana
瀏覽器訪問5601端口可以進行相關操作
後臺啓動:
nohup ./bin/kibana &
使用kibana操作es
瀏覽器打開5601端口界面
在左側
Dev Tools中通過QueryDSL增刪改查
 附錄2:
支持的數據類型:
 (1)核心數據類型(Core datatypes)
    字符型:string,string類型包括
    text 和 keyword
    text類型被用來索引長文本,在建立索引前會將這些文本進行分詞,轉化爲詞的組合,建立索引。允許es來檢索這些詞語。text類型不能用來排序和聚合。
    Keyword類型不需要進行分詞,可以被用來檢索過濾、排序和聚合。keyword 類型字段只能用本身來進行檢索
    數字型:long, integer, short, byte, double, float
    日期型:date
    布爾型:boolean
    二進制型:binary
 (2)複雜數據類型(Complex datatypes)
    數組類型(Array datatype):數組類型不需要專門指定數組元素的type,例如:
        字符型數組: [ "one", "two" ]
        整型數組:[ 1, 2 ]
        數組型數組:[ 1, [ 2, 3 ]] 等價於[ 1, 2, 3 ]
        對象數組:[ { "name": "Mary", "age": 12 }, { "name": "John", "age": 10 }]
    對象類型(Object datatype):_ object _ 用於單個JSON對象;
    嵌套類型(Nested datatype):_ nested _ 用於JSON數組;
 (3)地理位置類型(Geo datatypes)
    地理座標類型(Geo-point datatype):_ geo_point _ 用於經緯度座標;
    地理形狀類型(Geo-Shape datatype):_ geo_shape _ 用於類似於多邊形的複雜形狀;
 (4)特定類型(Specialised datatypes)
    IPv4 類型(IPv4 datatype):_ ip _ 用於IPv4 地址;
    Completion 類型(Completion datatype):_ completion _提供自動補全建議;
    Token count 類型(Token count datatype):_ token_count _ 用於統計做了標記的字段的index數目,該值會一直增加,不會因爲過濾條件而減少。
    mapper-murmur3
    類型:通過插件,可以通過 _ murmur3 _ 來計算 index 的 hash 值;
    附加類型(Attachment datatype):採用 mapper-attachments
    插件,可支持_ attachments _ 索引,例如 Microsoft Office 格式,Open Document 格式,ePub, HTML 等。
 支持的屬性:
"store":false//是否單獨設置此字段的是否存儲而從_source字段中分離,默認是false,只能搜索,不能獲取值
"index": true//分詞,不分詞是:false
   ,設置成false,字段將不會被索引
"analyzer":"ik"//指定分詞器,默認分詞器爲standard analyzer
"boost":1.23//字段級別的分數加權,默認值是1.0
"doc_values":false//對not_analyzed字段,默認都是開啓,分詞字段不能使用,對排序和聚合能提升較大性能,節約內存
"fielddata":{"format":"disabled"}//針對分詞字段,參與排序或聚合時能提高性能,不分詞字段統一建議使用doc_value
"fields":{"raw":{"type":"string","index":"not_analyzed"}} //可以對一個字段提供多種索引模式,同一個字段的值,一個分詞,一個不分詞
"ignore_above":100 //超過100個字符的文本,將會被忽略,不被索引
"include_in_all":ture//設置是否此字段包含在_all字段中,默認是true,除非index設置成no選項
"index_options":"docs"//4個可選參數docs(索引文檔號) ,freqs(文檔號+詞頻),positions(文檔號+詞頻+位置,通常用來距離查詢),offsets(文檔號+詞頻+位置+偏移量,通常被使用在高亮字段)分詞字段默認是position,其他的默認是docs
"norms":{"enable":true,"loading":"lazy"}//分詞字段默認配置,不分詞字段:默認{"enable":false},存儲長度因子和索引時boost,建議對需要參與評分字段使用 ,會額外增加內存消耗量
"null_value":"NULL"//設置一些缺失字段的初始化值,只有string可以使用,分詞字段的null值也會被分詞
"position_increament_gap":0//影響距離查詢或近似查詢,可以設置在多值字段的數據上火分詞字段上,查詢時可指定slop間隔,默認值是100
"search_analyzer":"ik"//設置搜索時的分詞器,默認跟ananlyzer是一致的,比如index時用standard+ngram,搜索時用standard用來完成自動提示功能
"similarity":"BM25"//默認是TF/IDF算法,指定一個字段評分策略,僅僅對字符串型和分詞類型有效
"term_vector":"no"//默認不存儲向量信息,支持參數yes(term存儲),with_positions(term+位置),with_offsets(term+偏移量),with_positions_offsets(term+位置+偏移量) 對快速高亮fast vector highlighter能提升性能,但開啓又會加大索引體積,不適合大數據量用
 附錄3:
 安裝ik分詞器(elk用戶,最簡單的安裝方法):
./elasticsearch-6.3.1/bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.3.1/elasticsearch-analysis-ik-6.3.1.zip
重啓elasticsearch生效
前臺啓動(測試時建議使用,用ctrl+c停止服務)
./elasticsearch-6.3.1/bin/elasticsearch
啓動時日誌中發現loaded plugin [analysis-ik]爲安裝成功!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章