1. 程式人生 > >ELK之Elasticsearch介紹及在搜尋中的使用

ELK之Elasticsearch介紹及在搜尋中的使用

  1. ELK: Elasticsearch + Logstash + Kibana

Elasticsearch: 是一個分散式的、實時全文搜尋及分析引擎;檢索效能高效是最大的特色。

Logstash: 是一個數據收集器,有豐富的外掛(input/filter/output)。

Kibana: 是一個基於Elasticsearch的web展示平臺。

  1. Elasticsearch的基本概念

近實時(Near Realtime): 從一個doc被索引到能夠查詢到, 大約有1秒的間隔

index: 索引,類似SQL中的database, NoSQL中的database

type: 一個index下, 可以有多個type, 類似SQL中的table, NoSQL中的collection

document: 某index/type下的一條資料,以json的格式。類似SQL中的row,NoSQL中的document.

MySQL

database

table

row

mongodb

database

collection

document

ES

index

type

document


shard: 一個index可以有多個shards,預設是5。目的是,方便水平擴容和提高負載。一旦index被建立,shards的數量不能再改。每個shard,就是一個Lucene的index。一個Lucene的index能夠容納的documents的數量上限是2,147,483,519 (= Integer.MAX_VALUE - 128)

replica: 一個index的備份數,預設是1。目的是,提高可靠性,加快search的速度。replicas的數量可以隨時修改。e.g. http://10.16.25.16:9000/_plugin/head/

node:

cluster: one or more nodes with same cluster name

  1. Schemaless or not

在某種意義上,ES是schemaless的, 在索引doc的時候, 直接指定index/type就可以了,無需對index/type進行任何的設定。實際上, 在index/type被建立的時候,ES會去猜json裡面的欄位,然後自動生成一份mapping(mapping是對doc中, 各欄位的型別的定義, 及索引方式等的解析)。

一旦有了mapping, 就變成schema的了,doc裡面已有的欄位型別 就不能隨意更改了。

  1. template and mapping

mapping:用來說明doc裡面的各個欄位的型別, 以及如何儲存和索引。mapping依賴於index, 不同的type有不同的mapping。mapping中的欄位型別, 一旦建立,不能修改,但可以新增欄位。


template:在index被建立的時候, 提供index的setting以及需要的mapping,先於index存在,且只在index 被建立的時候生效,一旦索引被建立,修改template就不會對已經建立的index生效了。

  1. ES的三個基本問題之寫入資料

ES使用了2個埠9200和9300(預設)

9200負責HTTP的請求

e.g. curl -XPUT http://esnode:9200/index/type -d ‘{json_doc}’

9300是TCP埠,供ES nodes之間通訊使用。

寫資料到ES,所使用的clients分成2種,

第一是JAVA的,第二是其它。

先說其它的(python/go/...等),都是用的是http REST api的方式,即訪問的是9200.

再說JAVA client,根據角色的不同, 用分成2種,

其一,節點client(node client)即,java client成為ES cluster中的一個節點,但不儲存資料。

其二,傳輸client(transport client),即java client不加入ES cluster, 只是傳輸資料給ES cluster中的節點。JAVA client使用的都是9300埠, 使用的是Elasticsearch的傳輸 協議(native Elasticsearch transport protocol)。

Java 的客戶端的版本號必須要與 Elasticsearch 節點所用的版本號一樣,不然他們之間可能無法識別

  1. ES的三個基本問題之讀取資料

  1. 通過doc ID直接獲取

e.g. curl -XGET xxxx/yyyy/AVQvYyK6aK8LxcWQ324f

and the return

{"_index":"xxxx”,"_type":"yyyy","_id":"AVQvYyK6aK8LxcWQ324f”,

"_version":1,"found":true,

"_source”:{json_doc}

}

  1. 通過_search獲取,size default 10

GET /index/type/_search?q=last_name:Smith

GET /index/type/_search

{

"query" : {

               "match" : {

                   "last_name" : "Smith"

               }

           }

}

  1. 通過_scroll來獲取大量資料,類似database的遊標

一般用於reindex

  1. ES的三個基本問題之效能優化

CPU/記憶體/SSD磁碟

除了官網上介紹的,ES_HEAP_SIZE/swap off/bootstrap.mlockall等

translog.durability:”async”,這個對寫的效能影響巨大,

預設是request,即每當有增刪改操作時, 就會觸發flush/commit to Lucene(磁碟IO)

  1. ES的欄位型別及index

螢幕快照 2016-06-01 下午4.02.58.png

若沒有mapping, ES會根據上面的規則去guess

若有mapping,ES會根據mapping對欄位進行匹配及轉換

e.g. 某欄位在mapping中是number,而doc裡面是 “123”,則會被自動轉成123;“cde”則會報錯


ES中, 不同型別的欄位, ES的處理方式是不同的。對於非string欄位, ES會原樣索引;對於string型別的欄位,index型別有:no/not_analyzed/analyzed

no

not_analyzed

analyzed(預設)

不索引,該欄位無法search

不分析,原樣索引

只對string欄位,先分析(分詞),然後索引

analyzer: 對於index:analyzed的string型別的欄位, 使用哪種analyzer(when index and also search), 預設是standard,對於中文, 會切成單字,搜尋中會使用IK

  1. DSL介紹

1) match_all

{ "match_all": {}} 匹配所有的, 當不給查詢條件時,預設。

2) match

進行full text search或者exact value(非string欄位或not_analyzed的欄位),進行匹配

3) multi_match

同時對多個欄位進行同樣的match

{

   "multi_match": {

       "query":    "full text search",

       "fields":   [ "title", "body" ]

   }

}

4) range

對number或時間欄位進行

{

   "range": {

       "age": {

           "gte":  20,

           "lt":   30

       }

   }

}

5) term

對欄位進行確切值(exact value)的查詢,如數字、時間、bool、not_analyzed欄位等。

{ "term": { "age":    26           }}

{ "term": { "date":   "2014-09-01" }}

{ "term": { "public": true         }}

{ "term": { "tag":    "full_text"  }}

6) terms

和term一樣, 不同的是,可以指定多個值來進行精確匹配

{ "terms": { "tag": [ "search", "full_text", "nosql" ] }}

7) exists/missing

用來查詢某個欄位是否有值, 類似SQL中的 not is_null/is_null

{

   "exists":   {

       "field":    "title"

   }

}

8) bool 用來連線一系列的查詢子句:包括must/must_not/filter/should

{

   "bool" : {

       "must" : {

           "term" : { "user" : "kimchy" }

       },

       "filter": {

           "term" : { "tag" : "tech" }

       },

       "must_not" : {

           "range" : {

               "age" : { "from" : 10, "to" : 20 }

           }

       },

       "should" : [

           {

               "term" : { "tag" : "wow" }

           },

           {

               "term" : { "tag" : "elasticsearch" }

           }

       ]

   }

}

  1. query VS filter

除了需要匹配程度的查詢(有_score的情況)使用query, 其餘的查詢都應該使用filter。(As a general rule, use query clauses for full-text search or for any condition that should affect the relevance score, and use filters for everything else.)

filter的結果是會被ES快取的, 以此來提高效率。

另外, filter由於不計算分數及排序, 所以, 速度較 query要快。

GET _search

{

 "query": {

   "bool": {

     "must": [

       { "match": { "title":   "Search"        }},

       { "match": { "content": "Elasticsearch" }}  

     ],

     "filter": [

       { "term":  { "status": "published" }},

       { "range": { "publish_date": { "gte": "2015-01-01" }}}

     ]

   }

 }

}

  1. script

ES支援使用script。(script fields, script score)

groovy default script language

script預設是被禁止的, 需要在config/elasticsearch.yml中開啟

script.inline: true

script.indexed: true

script有4種:inline/file/indexed/plugin

1) inline

GET /_search{"script_fields": {"my_field": {"script": {"inline": "1 + my_var","params": {"my_var": 2       }     }   } }}

2) file

存放的位置:config/scripts/my_script.groovy

GET /_search

{ "script_fields":

{ "my_field": {

"script": {

"file": "my_script",

"params": { "my_var": 2 }

}

}

}

}

3) indexed

將指令碼儲存在ES內, index as .script, 然後通過ID訪問。

curl -XPOST localhost:9200/_scripts/groovy/indexedCalculateScore -d '{"script":"log(_score * 2) + my_modifier"}'

{  "script_score":{    "script":{      "id": "indexedCalculateScore",      "lang" : "groovy",      "params":{        "my_modifier":8}}}}

4) plugin

需要install到ES

{"script_score":{"script":{"inline":"my_script","lang":"native"}}}

ssh://git.wandoulabs.com:29418/es-search

es-search/es-score下有MyNativeScript*.java是個示例, 比較方便。

  1. function_score

doc and source:

使用source可以訪問doc的原值,但速度較慢(not loaded into memory), 訪問時需要經歷loaded -> parsed的過程。

doc可以訪問not_analyzed的欄位的值,e.g. doc[‘field_name’].value


速度的優化措施:

0) 使用doc, 不使用source,使用source慢得離譜了。因為doc已經在記憶體裡了

1) 增加shards數及ES node數, 結果不是很明顯

2) 使用size, 發現只是展示的doc的數量變化, 對於速度無影響

3) terminate_after: 在每個shards上, 只search前N個doc, 不實際,無法保證結果。

4) 增加filter, 使得進行二次打分的doc數量極大的降低, 來提高速度。

  1. IK分詞

對於string欄位, 預設使用的analyzer是standard,對中文會分成單字,效果不好。

對於title等欄位, 增加子欄位, fields: title.cn, 使用"analyzer": "ik"進行分析。

"mappings":{"my_type":{"properties":{"text":{"type":"string","fields"

相關推薦

ELKElasticsearch介紹搜尋的使用

ELK: Elasticsearch + Logstash + Kibana Elasticsearch: 是一個分散式的、實時全文搜尋及分析引擎;檢索效能高效是最大的特色。 Logstas

Elasticsearch外掛介紹安裝

ES站點外掛(以網頁形式展現)   1、BigDesk Plugin (作者 Lukáš Vlček)     簡介:監控es狀態的外掛,推薦!【目前不支援2.x】   2、Elasticsearch Head Plugin (作者 Ben Birch) (主要)    

Spring.net介紹MVC應用

text name default 轉變 業務層 核心 解耦 inf star Spring.net兩大核心內容: IOC(控制反轉) 傳統的面相對象思維模式是對象A依賴對象B,對象B的實例化和調用都在對象A中發生,一旦對象B中發生變化,對象A也要隨之變化,這樣使得

Windows 活動目錄(AD)服務器系統升級到2012環境介紹準備(一)

AD 升級 activedirectory DHCP 1. AD服務器相關配置信息1 2 1.1 系統版本角色名稱操作系統版本語言數量ADWindows server 2003 sp2CN2ADWindows server 2012 R2CN21.2 主機名和IP地址服務器主機名IP地

ELKElasticSearch 6.4.x安全認證Search Guard6

The getclass false not for internal 安全 mod word ELK的安裝非常簡單,解壓稍加配置即能用。 今天的重點是記錄ELK的安全認證,ELK安裝好後,ElasticSearch是可以直接瀏覽訪問的,非常不安全,Kibana也是一樣直接

斐波那契數列介紹Python五種方法斐波那契數列

Q:斐波那契數列為什麼那麼重要,所有關於數學的書幾乎都會提到? A:因為斐波那契數列在數學和生活以及自然界中都非常有用。 1. 斐波那契數列 概念引入 斐波那契數列(Fibonacci sequence),又稱黃金分割數列,因數學家列昂納多·斐波那契(Leonar

大資料Storm介紹原理

一、概述 Storm是一個開源的分散式實時計算系統,可以簡單、可靠的處理大量的資料流。 Storm有很多使用場景:如實時分析,線上機器學習,持續計算,分散式RPC,ETL等等。 Storm支援水平擴充套件,具有高容錯性,保證每個訊息都會得到處理,而且處理速度很快(在一個小叢集中,每個

javaURI,URL,URL介紹AndroidUri解析

一、URI 1.1 定義 在電腦術語中,統一資源識別符號(Uniform Resource Identifier,即URI)是一個用於標識某一網際網路資源名稱的字串。 該種標識允許使用者對任何(包括本地和網際網路)的資源通過特定的協議進行互動操作。 1.2 組成 一般格式為:

MySQL · 捉蟲動態 · MySQL字符集相關變數介紹binlog字符集相關缺陷分析

MySQL字符集相關變數介紹及binlog中字符集相關缺陷分析 MySQL支援多種字符集(character set)提供使用者儲存資料,同時允許用不同排序規則(collation)做比較。 本文基於MySQL5.7介紹了字符集相關變數的使用,通過例子描述了

ijkplayer入門目錄介紹編譯

ijkPlayer主要包含了android, extra, ijkmedia, ios幾個核心原始碼目錄 android 目錄包括了android 平臺上層介面提供、用例等等 ----ijkplayer:android 測試用例,直接匯入android studio後可以使

.net持續整合cake篇cake介紹簡單示例

cake介紹 Cake 是.net平臺下的一款自動化構建工具,可以完成對.net專案的編譯,打包,執行單元測試,整合測試甚至釋出專案等等.如果有些特徵Cake沒有實現,我們還可以很容易地通過擴充套件Cake來實現我們想要的功能. Cake有以下特點 1) 使用c#語言編寫,可以在Cake腳本里使用C#語言來實

資料探勘入門系列教程(十點五)DNN介紹公式推導

## 深度神經網路(DNN,Deep Neural Networks)簡介 首先讓我們先回想起在之前部落格([資料探勘入門系列教程(七點五)之神經網路介紹](https://www.cnblogs.com/xiaohuiduan/p/12623925.html))中介紹的神經網路:為了解決M-P模型中無法處

linq介紹工作應用兩例——左聯與內聯,linq迴圈方法

[toc] #1 linq介紹 ##1.1 linq產生背景 一個應用服務後臺程式,肯定會需要格式各樣的資料檢索跟操作,而這些資料在過去的這些年裡一般都會包含在關係型資料庫或者xml檔案中。 .Net3.5版本發行之前,傳統的資料來源訪問方式就是直接對資料庫或者xml檔案進行檢索操作。在.Net3.5 V

ELK介紹搭建 Elasticsearch 分布式集群

ELK 日誌系統 CentOS7 Elasticsearch分布式集群 筆記內容:ELK介紹及搭建 Elasticsearch 分布式集群筆記日期:2018-03-02 27.1 ELK介紹 27.2 ELK安裝準備工作 27.3 安裝es 27.4 配置es 27.5 curl查看es集群

搭建ELK日誌分析平臺(上)—— ELK介紹搭建 Elasticsearch 分散式叢集

轉:http://blog.51cto.com/zero01/2079879 筆記內容:搭建ELK日誌分析平臺(上)—— ELK介紹及搭建 Elasticsearch 分散式叢集筆記日期:2018-03-02 27.1 ELK介紹 27.2 ELK安裝準備工作 27.3 安

架構師路--搜尋業務和技術介紹容錯機制高階教程

java架構師、叢集、高可用、高可擴充套件、高效能、高併發、效能優化、Spring boot、Redis、ActiveMQ、Nginx、Mycat、Netty、Jvm大型分散式專案實戰 視訊課程內容包含: 高階Java架構師包含:Spring boot、Spring  

玩轉webservlet(六)---session介紹簡單使用(登入驗證儲存資訊)

在瀏覽器與伺服器進行互動時,往往需要把涉及到的一些資料儲存下來,這時就需要使用cookie或session進行狀態管理。這篇文章先來說說session怎麼用,首先在servlet中建立一個session來儲存資訊,舉個例子,在做登陸驗證時,如果登陸成功,需要將使用者的資訊儲

自動化運維saltstack(二)states介紹使用

配置文件 如何 states master 根目錄 一、什麽是Salt States?Salt States是Salt模塊的擴展,主系統使用的狀態系統叫SLS系統,SLS代表Saltstack State,Salt是一些狀態文件,其中包含有關如何配置Salt子節點的信息,這些狀態被存放在一

架構師路--搜索業務和技術介紹容錯機制

朋友 單節點 adb 一致性 公司 一個 memcache 消息通知 包括  今天和搜索部門一起做了一下MQ的遷移,順便交流一下業務和技術。發現現在90後小夥都挺不錯。我是指能力和探究心。我家男孩,不招女婿。   在前面的文章中也提到,我們有媒資庫(樂視視頻音頻本身內容)

Python零基礎學習系列二--Python介紹環境搭建

url 軟件包 三方庫 簡單的 lin 文件的 span 高級程序設計 擴展 1-1、Python簡介:  Python是一種解釋型、面向對象、動態數據類型的高級程序設計語言。Python由Guido van Rossum於1989年底發明,第一個公開發行版發行於1991年