7.4.2 elasticsearch(IK分詞器,Kibana)---CentOS7.5上安裝與配置


官網: https://www.elastic.co/cn/  

中文社區: https://elasticsearch.cn/ (可下載任意版本)

目前官網最新是7.5.0,我這里使用的次新版 7.4.2版本 Linux

 默認它不允許使用 root用戶,我們這里使用的是yangw這個用戶.

安裝elasticsearch之前,請確保已安裝了JDK8 

tar -zxvf  elasticsearch-7.4.2-linux-x86_64.tar.gz    #解壓縮

mv elasticsearch-7.4.2 elasticsearch

cd elasticsearch/

mkdir data

cd config/

vim  jvm.options   我的虛擬機內存只設置了1G,故改一下虛擬機大小參數,見圖

 vim elasticsearch.yml (path指定的路徑若不存在則自行創建); 網絡改成0.0.0.0表示任意IP都能連

 

cd ../bin

./elasticsearch

它的啟動會比較慢,需要耐心等待...

 啟動報如下5個錯.

 

 [1]: initial heap size [268435456] not equal to maximum heap size [536870912]; this can cause resize pauses and prevents mlockall from locking the entire heap

 解決辦法: 重新修改elasticsearch的 jvm.options, 將內存都改成512m即可解決;

 

 [2]: max file descriptors [4096] for elasticsearch process is too low, increase to at least [65535]

 解決辦法

ulimit -Hn  查看硬限制 結果是4096

切換到root用戶

vim /etc/security/limits.conf

在文件最后追加內容: (其中yangw表示對yangw這個用戶做的修改. 也可以用 * 表示所有用戶)

yangw soft nofile 65536
yangw hard nofile 65536

一般要使用 exit命令退出當前終端,再重新登錄啟動即可生效;

 

[3]: max number of threads [3764] for user [yangw] is too low, increase to at least [4096]

解決辦法:

切換到root用戶

vim /etc/security/limits.conf

在文件最后追加內容

yangw soft nproc 4096
yangw hard nproc 4096

一般要使用 exit命令退出當前終端,再重新登錄啟動即可生效;

 

[4]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]

解決辦法:

切換到root用戶,編輯文件 vim /etc/sysctl.conf  在末尾追加內容:

vm.max_map_count=262144

並執行命令 sysctl -p

 

[5]: the default discovery settings are unsuitable for production use; at least one of [discovery.seed_hosts, discovery.seed_providers, cluster.initial_master_nodes] must be configured

解決辦法:

 

 

 后台運行

若要在關閉終端的時候,讓Elasticsearch繼續保持運行。最簡單的方法就是使用 nohup。 先按Ctrl + C,停止當前運行的Elasticsearch,改用下面的命令運行Elasticsearch

nohup ./bin/elasticsearch&


成功啟動后的日志截圖:


9300端口: ES節點之間通訊使用

9200端口: ES節點 和 外部 通訊使用

 

9300是TCP協議端口號,ES集群之間通訊端口號

9200端口號,暴露ES RESTful接口端口號

 
        

  瀏覽器訪問:

 

 

IK分詞器 可以到github上下載:(選擇與elasticsearch一樣的版本 7.4.2 )

 https://github.com/medcl/elasticsearch-analysis-ik/tree/master

 https://github.com/medcl/elasticsearch-analysis-ik/releases (選擇任意版本)

 

 Analyzer: ik_smart , ik_max_word , Tokenizer: ik_smart , ik_max_word

 

安裝步驟:

 將elasticsearch-analysis-ik-7.4.2.zip上傳到elasticsearch安裝目錄的plugins目錄

 unzip elasticsearch-analysis-ik-7.4.2.zip -d analysis-ik

 rm -rf elasticsearch-analysis-ik-7.4.2.zip

重新啟動 elasticsearch

 

 

官方提供大量的Rest風格API: https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html

官方提供各語言的客戶端API:https://www.elastic.co/guide/en/elasticsearch/client/index.html

 

 

 Java Low Level REST Client 是低級別的封裝,提供一些基礎功能,但更靈活;

 Java High Level REST Client是高級別的封裝,功能更豐富和完善,而且API會變得簡單;

客戶端這塊,我們主要是學習 Spring Data Elasticsearch 客戶端API

 

Kibana是一個基於Node.js的Elasticsearch索引庫數據統計工具,可以利用Elasticsearch的聚合功能,生成各種圖表,如柱形圖,線狀圖,餅圖等。

而且還提供了操作Elasticsearch索引數據的控制台,並且提供了一定的API提示。

一句話,它就是可視化窗口工具.

 

 它是基於Nodejs的,故要現在Linux服務器上安裝Nodejs環境

nodejs安裝步驟:

 上傳 node-v10.16.3-linux-x64.tar.gz 包到服務器,

tar -zxvf node-v10.16.3-linux-x64.tar.gz

mv node-v10.16.3-linux-x64 node_10.16.3

cd ~

vim .bashrc

添加環境變量內容:

 

 source .bashrc

查看版本node -v  出現版本號就表示OK.

 

kibana安裝步驟

tar -zxvf kibana-7.4.2-linux-x86_64.tar.gz

cd kibana-7.4.2-linux-x86_64

cd config

vim kibana.yml

修改如下內容:

 

 

 cd ../bin

./kibana

 啟動時間稍微長一點,請耐心等待.

若啟動報如下類型的錯誤

 Status changed from yellow to red - [data] Elasticsearch cluster did not respond with license information.

 

 

 請修改elasticsearch的配置文件,vim elasticsearch.yml

 

 再次啟動,就正常了,正常日志如下:

 

 瀏覽器訪問:

 

 kibana的控制台,可以對http請求進行簡化.

創建索引:

  • 請求方式:PUT

  • 請求路徑:/索引庫名

  • 請求參數:json格式:


    {
       "settings": {
           "number_of_shards": 3,
           "number_of_replicas": 2
        }
    }
    • settings:索引庫的設置

      • number_of_shards:分片數量

      • number_of_replicas:副本數量

 

 查看索引  GET /索引庫名

 

 刪除索引  DELETE /索引庫名

 

 

 

 當然,我們也可以用HEAD請求,查看索引是否存在

 

 

 

2.5.1.創建映射字段

https://www.elastic.co/guide/en/elasticsearch/reference/7.4/mapping.html

屬性字段的一些設置
  • type:類型,可以是text、long、short、date、integer、object等

  • index:是否索引,默認為true

  • store:是否存儲,默認為false

  • analyzer:分詞器,這里的ik_max_word即使用ik分詞器

 數據類型: https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-types.html

 

我們說幾個關鍵的:

  • String類型,又分兩種:

    • text:可分詞,不可參與聚合

    • keyword:不可分詞,數據會作為完整字段進行匹配,可以參與聚合

  • Numerical:數值類型,分兩類

    • 基本數據類型:long、interger、short、byte、double、float、half_float

    • 浮點數的高精度類型:scaled_float

      • 需要指定一個精度因子,比如10或100。elasticsearch會把真實值乘以這個因子后存儲,取出時再還原。

  • Date:日期類型

    elasticsearch可以對日期格式化為字符串存儲,但是建議我們存儲為毫秒值,存儲為long,節省空間。

 

2.5.3.2.index

index影響字段的索引情況。

  • true:字段會被索引,則可以用來進行搜索。默認值就是true

  • false:字段不會被索引,不能用來搜索

index的默認值就是true,也就是說你不進行任何配置,所有字段都會被索引。

但是有些字段是我們不希望被索引的,比如商品的圖片信息,就需要手動設置index為false。

 

2.5.3.3.store

是否將數據進行額外存儲。

在學習lucene和solr時,我們知道如果一個字段的store設置為false,那么在文檔列表中就不會有這個字段的值,用戶的搜索結果中不會顯示出來。

但是在Elasticsearch中,即便store設置為false,也可以搜索到結果。

原因是Elasticsearch在創建文檔索引時,會將文檔中的原始數據備份,保存到一個叫做_source的屬性中。而且我們可以通過過濾_source來選擇哪些要顯示,哪些不顯示。

而如果設置store為true,就會在_source以外額外存儲一份數據,多余,因此一般我們都會將store設置為false,事實上,store的默認值就是false。

 

創建映射  PUT /索引庫名/_mapping (這個是elastic7.x的語法)

 

 查看映射   GET /索引庫名/_mapping

 查看映射(某個具體的字段)   GET /索引庫名/_mapping/field/字段名

Elasticsearch 7.x

  • 不建議在請求中指定類型。新索引API使用 PUT {index}/_doc/{id}於顯式ID 和 POST {index}/_doc 自動生成的ID。請注意,在7.0中,它_doc是路徑的永久部分,代表端點名稱而不是文檔類型。

事實上Elasticsearch非常智能,你不需要給索引庫設置任何mapping映射,它也可以根據你輸入的數據來判斷類型,動態添加數據映射。

 更新數據  POST /索引庫名/_update/{id}

 刪除數據   DELETE  /索引庫名/_doc/{id}

 

https://www.elastic.co/guide/en/elasticsearch/reference/7.4/query-dsl-match-query.html

https://www.elastic.co/guide/en/elasticsearch/reference/7.4/full-text-queries.html

 查詢數據語法:

GET /索引庫名/_search
{
    "query":{
        "查詢類型":{
            "查詢條件":"查詢條件值"
        }
    }
}
 

這里的query代表一個查詢對象,里面可以有不同的查詢屬性

  • 查詢類型:

    • 例如:match_all, matchterm , range 等等

  • 查詢條件:查詢條件會根據類型的不同,寫法也有差異。

 

查詢所有(match_all)

 

  • took:查詢花費時間,單位是毫秒

  • time_out:是否超時

  • _shards:分片信息

  • hits:搜索結果總覽對象

    • total:搜索到的總條數

    • max_score:所有結果中文檔得分的最高分

    • hits:搜索結果的文檔對象數組,每個元素是一條搜索到的文檔信息

      • _index:索引庫

      • _type:文檔類型

      • _id:文檔id

      • _score:文檔得分

      • _source:文檔的源數據

 

 

匹配查詢(match)

默認是or的關系,如果要再精確匹配的話,可以使用  "operator":"and" 

 

 

 `match` 查詢支持 minimum_should_match 最小匹配參數, 這讓我們可以指定必須匹配的詞項數用來表示一個文檔是否相關。我們可以將其設置為某個具體數字,更常用的做法是將其設置為一個百分數,因為我們無法控制用戶搜索時輸入的單詞數量:

多字段查詢(multi_match)

 

 

 詞條匹配(term)

https://www.elastic.co/guide/en/elasticsearch/reference/7.4/query-dsl-term-query.html

 term 查詢被用於精確值 匹配,這些精確值可能是數字、時間、布爾或者那些未分詞的字符串

 https://www.elastic.co/guide/en/elasticsearch/reference/7.4/query-dsl-terms-query.html

 

 

 

結果過濾

默認情況下,elasticsearch在搜索的結果中,會把文檔中保存在 _source 的所有字段都返回。

1. 如果我們只想獲取其中的部分字段,我們可以添加_source的過濾;

2. 也可以在_source中使用includes excutes來設置包含和排除那些字段;

 

 高級查詢

 布爾組合(bool)

bool把各種其它查詢通過must(與)、must_not(非)、should(或)的方式進行組合

 

 

范圍查詢(range)

range 查詢找出那些落在指定區間內的數字或者時間

 gt  大於   gte 大於等於   lt小於  lte 小於等於

 

 模糊查詢(fuzzy)

 fuzzy 查詢是 term 查詢的模糊等價。它允許用戶搜索詞條與實際詞條的拼寫出現偏差,但是偏差的編輯距離不得超過2:

我們可以通過fuzziness來指定允許的編輯距離:

 

 條件查詢中進行過濾

 所有的查詢都會影響到文檔的評分及排名。如果我們需要在查詢結果中進行過濾,並且不希望過濾條件影響評分,那么就不要把過濾條件作為查詢條件來用。而是使用filter方式;

一般都是在bool查詢中使用filter

 

 

 無查詢條件,直接過濾

如果一次查詢只有過濾,沒有查詢條件,不希望進行評分,我們可以使用constant_score取代只有 filter 語句的 bool 查詢。在性能上是完全相同的,但對於提高查詢簡潔性和清晰度有很大幫助。

 

 排序

單字段排序

sort 可以讓我們按照不同的字段進行排序,並且通過order指定排序的方式

 

聚合aggregations

聚合可以讓我們極其方便的實現對數據的統計、分析。例如:

  • 什么品牌的手機最受歡迎?

  • 這些手機的平均價格、最高價格、最低價格?

  • 這些手機每月的銷售情況如何?

實現這些統計功能的比數據庫的sql要方便的多,而且查詢速度非常快,可以實現實時搜索效果。 

 基本概念

Elasticsearch中的聚合,包含多種類型,最常用的兩種,一個叫,一個叫度量

**桶(bucket)**

桶的作用,是按照某種方式對數據進行分組,每一組數據在ES中稱為一個``

Elasticsearch中提供的划分桶的方式有很多:

  • Date Histogram Aggregation:根據日期階梯分組,例如給定階梯為周,會自動每周分為一組

  • Histogram Aggregation:根據數值階梯分組,與日期類似

  • Terms Aggregation:根據詞條內容分組,詞條內容完全匹配的為一組

  • Range Aggregation:數值和日期的范圍分組,指定開始和結束,然后按段分組

  • ……

bucket aggregations 只負責對數據進行分組,並不進行計算,因此往往bucket中往往會嵌套另一種聚合:metrics aggregations即度量

度量(metrics)

分組完成以后,我們一般會對組中的數據進行聚合運算,例如求平均值、最大、最小、求和等,這些在ES中稱為度量

比較常用的一些度量聚合方式:

  • Avg Aggregation:求平均值

  • Max Aggregation:求最大值

  • Min Aggregation:求最小值

  • Percentiles Aggregation:求百分比

  • Stats Aggregation:同時返回avg、max、min、sum、count等

  • Sum Aggregation:求和

  • Top hits Aggregation:求前幾

  • Value Count Aggregation:求總數

  • ……

注意:在ES中,需要進行聚合、排序、過濾的字段其處理方式比較特殊,因此不能被分詞。這里我們將color和make這兩個文字類型的字段設置為keyword類型,這個類型不會被分詞,將來就可以參與聚合


例子: 常見索引庫,定義字段,批量插入數據
批量插入用 _bulk

 

  • size: 查詢條數,這里設置為0,因為我們不關心搜索到的數據,只關心聚合結果,提高效率

  • aggs:聲明這是一個聚合查詢,是aggregations的縮寫

    • popular_colors:給這次聚合起一個名字,任意。

      • terms:划分桶的方式,這里是根據詞條划分

        • field:划分桶的字段

 

 桶內度量

前面的例子告訴我們每個桶里面的文檔數量,這很有用。 但通常,我們的應用需要提供更復雜的文檔度量。 例如,每種顏色汽車的平均價格是多少?

因此,我們需要告訴Elasticsearch使用哪個字段使用何種度量方式進行運算,這些信息要嵌套在內,度量的運算會基於內的文檔進行

現在,我們為剛剛的聚合結果添加 求價格平均值的度量:

 

 

 

  • aggs:我們在上一個aggs(popular_colors)中添加新的aggs。可見度量也是一個聚合

  • avg_price:聚合的名稱

  • avg:度量的類型,這里是求平均值

  • field:度量運算的字段

桶內嵌套桶

剛剛的案例中,我們在桶內嵌套度量運算。事實上桶不僅可以嵌套運算, 還可以再嵌套其它桶。也就是說在每個分組中,再分更多組。

比如:我們想統計每種顏色的汽車中,分別屬於哪個制造商,按照make字段再進行分桶

 

階梯分桶Histogram

histogram是把數值類型的字段,按照一定的階梯大小進行分組。你需要指定一個階梯值(interval)來划分階梯大小

 

 







 摘自別的地方:

 bootstrap.memory_lock: true導致Elasticsearch啟動失敗問題

 elasticsearch官網建議生產環境需要設置bootstrap.memory_lock: true

 

解決辦法如下:

需要修改
/etc/security/limits.conf 
baoshan soft memlock unlimited
baoshan hard memlock unlimited

修改:
/etc/sysctl.conf 
vm.swappiness=0

之后重啟機器

 


免責聲明!

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



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