操屁眼的视频在线免费看,日本在线综合一区二区,久久在线观看免费视频,欧美日韩精品久久综

新聞資訊

    本章將介紹:ElasticSearch的作用,搭建elasticsearch的環(huán)境(Windows/Linux),ElasticSearch集群的搭建,可視化客戶端插件elasticsearch-head的安裝及使用,對IK分詞器的安裝及使用。

    1.ElasticSearch簡介

    Elaticsearch,簡稱為es, es是一個開源的高擴展的分布式全文檢索引擎,它可以近乎實時存儲、檢索數(shù)據(jù);本 身擴展性很好,可以擴展到上百臺服務器,處理PB級別的數(shù)據(jù)。es也使用Java開發(fā)并使用Lucene作為其核心來實 現(xiàn)所有索引和搜索的功能,但是它的目的是通過簡單的RESTful API來隱藏Lucene的復雜性,從而讓全文搜索變得 簡單。

    1.1ElasticSearch的使用案例

    • 2013年初,GitHub拋棄了Solr,采取ElasticSearch 來做PB級的搜索。 “GitHub使用ElasticSearch搜索20TB 的數(shù)據(jù),包括13億文件和1300億行代碼”
    • 維基百科:啟動以elasticsearch為基礎的核心搜索架構(gòu)
    • SoundCloud:“SoundCloud使用ElasticSearch為1.8億用戶提供即時而精準的音樂搜索服務”
    • 百度:百度目前廣泛使用ElasticSearch作為文本數(shù)據(jù)分析,采集百度所有服務器上的各類指標數(shù)據(jù)及用戶自定義數(shù)據(jù),通過對各種數(shù)據(jù)進行多維分析展示,輔助定位分析實例異?;驑I(yè)務層面異常。目前覆蓋百度內(nèi)部20多個業(yè)務線(包括casio、云分析、網(wǎng)盟、預測、文庫、直達號、錢包、風控等),單集群最大100臺機器,200個ES節(jié)點,每天導入30TB+數(shù)據(jù)
    • 新浪使用ES 分析處理32億條實時日志
    • 阿里使用ES 構(gòu)建挖財自己的日志采集和分析體系

    1.2 ElasticSearch與solr的對比

    • Solr 利用 Zookeeper 進行分布式管理,而 Elasticsearch 自身帶有分布式協(xié)調(diào)管理功能;
    • Solr 支持更多格式的數(shù)據(jù),而 Elasticsearch 僅支持json文件格式;
    • Solr 官方提供的功能更多,而 Elasticsearch 本身更注重于核心功能,高級功能多有第三方插件提供;
    • Solr 在傳統(tǒng)的搜索應用中表現(xiàn)好于 Elasticsearch,但在處理實時搜索應用時效率明顯低于 Elasticsearch

    2.ElasticSearch安裝(windows)

    下載壓縮包:

    ElasticSearch的官方地址: https://www.elastic.co/products/elasticsearch

    2.1 安裝

    注意:es使用java開發(fā),使用lucene作為核心,需要配置好java環(huán)境?。╦dk1.8以上)

    類似與tomcat,直接解壓即可。其目錄結(jié)構(gòu)如下:

    2.2修改配置文件

    • 修改conf\jvm.option文件
    將#-Xms2g                                  
      #-Xmx2g修改成為:
    -Xms340m
    -Xmx340m
    否則因為虛擬機內(nèi)存不夠無法啟動
    • 修改conf\elasticsearch.yml文件
    elasticsearch-5.6.8\config\elasticsearch.yml中末尾加入:
    http.cors.enabled: true
    http.cors.allow-origin: "*"
    network.host: 127.0.0.1
    目的是使ES支持跨域請求

    2.3 啟動

    點擊ElasticSearch下的bin目錄下的elasticsearch.bat啟動,控制臺顯示的日志信息如下:

    注意:9300是tcp通信端口,es集群之間使用tcp進行通信,9200是http協(xié)議端口。

    我們在瀏覽器可以訪問:

    2.4 安裝圖形化插件

    上述可以發(fā)現(xiàn),ElasticSearch不同于Solr自帶圖形化界面,我們可以通過安裝ElasticSearch的head插件,完成圖形化界面的效果,完成索引數(shù)據(jù)的查看。安裝插件的方式有兩種,在線安裝和本地安裝。本文檔采用本地安裝方式進行head插件的安裝。elasticsearch-5-*以上版本安裝head需要安裝node和grunt 。

    • 下載head插件:https://github.com/mobz/elasticsearch-head

    下載壓縮包后解壓即可。

    • 下載node.js:https://nodejs.org/en/download/

    雙擊安裝,通過cmd輸入 node -v查看版本號

    • 將grunt安裝為全局命令 ,Grunt是基于Node.js的項目構(gòu)建工具

    在cmd中輸入:

    npm install ‐g grunt‐cli

    由于訪問的是國外的服務器,如果下載速度較慢,可以切換淘寶鏡像

    npm install -g cnpm –registry=https://registry.npm.taobao.org

    后續(xù)使用的時候,只需要把npm xxx 換成 cnpm xxx 即可

    檢測是否安裝成功

    npm config get registry 

    注意:后續(xù)使用時需要將npm替換為cnpm。

    • 啟動head

    進入head插件目錄,打開cmd,輸入:

    >npm install
    >grunt server

    打開瀏覽器,輸入http://localhost:9100即可

    3.ES相關概念

    3.1 概述(重要)

    Elasticsearch是面向文檔(document oriented)的,這意味著它可以存儲整個對象或文檔(document)。然而它不僅 僅是存儲,還會索引(index)每個文檔的內(nèi)容使之可以被搜索。在Elasticsearch中,你可以對文檔(而非成行成列的數(shù)據(jù))進行索引、搜索、排序、過濾。Elasticsearch比傳統(tǒng)關系型數(shù)據(jù)庫如下:

    Relational DB ‐> Databases ‐> Tables ‐> Rows ‐> Columns Elasticsearch ‐> Indices ‐> Types ‐> Documents ‐> Fields

    3.2 核心概念

    1)index索引-

    一個索引就是一個擁有幾分相似特征的文檔的集合。比如說,你可以有一個客戶數(shù)據(jù)的索引,另一個產(chǎn)品目錄的索引,還有一個訂單數(shù)據(jù)的索引。一個索引由一個名字來標識(必須全部是小寫字母的),并且當我們要對對應于這個索引中的文檔進行索引、搜索、更新和刪除的時候,都要使用到這個名字。在一個集群中,可以定義任意多的索引。可類比mysql中的數(shù)據(jù)庫

    2)type類型

    在一個索引中,你可以定義一種或多種類型。一個類型是你的索引的一個邏輯上的分類/分區(qū),其語義完全由你來定。通常,會為具有一組共同字段的文檔定義一個類型。比如說,我們假設你運營一個博客平臺并且將你所有的數(shù)據(jù)存儲到一個索引中。在這個索引中,你可以為用戶數(shù)據(jù)定義一個類型,為博客數(shù)據(jù)定義另一個類型,當然,也可以為評論數(shù)據(jù)定義另一個類型。 可類比mysql中的表

    3)Filed字段

    相當于是數(shù)據(jù)表的字段,對文檔數(shù)據(jù)根據(jù)不同屬性進行的分類標識 。

    4)映射mapping

    mapping是處理數(shù)據(jù)的方式和規(guī)則方面做一些限制,如某個字段的數(shù)據(jù)類型、默認值、分析器、是否被索引等等,這些都是映射里面可以設置的,其它就是處理es里面數(shù)據(jù)的一些使用規(guī)則設置也叫做映射,按著最優(yōu)規(guī)則處理數(shù)據(jù)對性能提高很大,因此才需要建立映射,并且需要思考如何建立映射才能對性能更好。相當于mysql中的創(chuàng)建表的過程,設置主鍵外鍵等等

    5)document文檔

    一個文檔是一個可被索引的基礎信息單元。比如,你可以擁有某一個客戶的文檔,某一個產(chǎn)品的一個文檔,當然,也可以擁有某個訂單的一個文檔。文檔以JSON(Javascript Object Notation)格式來表示,而JSON是一個到處存在的互聯(lián)網(wǎng)數(shù)據(jù)交互格式。在一個index/type里面,你可以存儲任意多的文檔。注意,盡管一個文檔,物理上存在于一個索引之中,文檔必須被索引/賦予一個索引的type。 插入索引庫以文檔為單位,類比與數(shù)據(jù)庫中的一行數(shù)據(jù)

    6)集群cluster

    一個集群就是由一個或多個節(jié)點組織在一起,它們共同持有整個的數(shù)據(jù),并一起提供索引和搜索功能。一個集群由 一個唯一的名字標識,這個名字默認就是“elasticsearch”。這個名字是重要的,因為一個節(jié)點只能通過指定某個集 群的名字,來加入這個集群。

    7)節(jié)點node

    一個節(jié)點是集群中的一個服務器,作為集群的一部分,它存儲數(shù)據(jù),參與集群的索引和搜索功能。和集群類似,一 個節(jié)點也是由一個名字來標識的,默認情況下,這個名字是一個隨機的漫威漫畫角色的名字,這個名字會在啟動的 時候賦予節(jié)點。這個名字對于管理工作來說挺重要的,因為在這個管理過程中,你會去確定網(wǎng)絡中的哪些服務器對 應于Elasticsearch集群中的哪些節(jié)點。

    一個節(jié)點可以通過配置集群名稱的方式來加入一個指定的集群。默認情況下,每個節(jié)點都會被安排加入到一個叫 做“elasticsearch”的集群中,這意味著,如果你在你的網(wǎng)絡中啟動了若干個節(jié)點,并假定它們能夠相互發(fā)現(xiàn)彼此, 它們將會自動地形成并加入到一個叫做“elasticsearch”的集群中。

    在一個集群里,只要你想,可以擁有任意多個節(jié)點。而且,如果當前你的網(wǎng)絡中沒有運行任何Elasticsearch節(jié)點, 這時啟動一個節(jié)點,會默認創(chuàng)建并加入一個叫做“elasticsearch”的集群。

    8)分片和復制 shards&replicas

    一個索引可以存儲超出單個結(jié)點硬件限制的大量數(shù)據(jù)。比如,一個具有10億文檔的索引占據(jù)1TB的磁盤空間,而任一節(jié)點都沒有這樣大的磁盤空間;或者單個節(jié)點處理搜索請求,響應太慢。為了解決這個問題,Elasticsearch提供了將索引劃分成多份的能力,這些份就叫做分片。當你創(chuàng)建一個索引的時候,你可以指定你想要的分片的數(shù)量。每個分片本身也是一個功能完善并且獨立的“索引”,這個“索引”可以被放置到集群中的任何節(jié)點上。分片很重要,主要有兩方面的原因: 1)允許你水平分割/擴展你的內(nèi)容容量。 2)允許你在分片(潛在地,位于多個節(jié)點上)之上進行分布式的、并行的操作,進而提高性能/吞吐量。

    至于一個分片怎樣分布,它的文檔怎樣聚合回搜索請求,是完全由Elasticsearch管理的,對于作為用戶的你來說,這些都是透明的。

    在一個網(wǎng)絡/云的環(huán)境里,失敗隨時都可能發(fā)生,在某個分片/節(jié)點不知怎么的就處于離線狀態(tài),或者由于任何原因消失了,這種情況下,有一個故障轉(zhuǎn)移機制是非常有用并且是強烈推薦的。為此目的,Elasticsearch允許你創(chuàng)建分片的一份或多份拷貝,這些拷貝叫做復制分片,或者直接叫復制。

    復制之所以重要,有兩個主要原因: 在分片/節(jié)點失敗的情況下,提供了高可用性。因為這個原因,注意到復制分片從不與原/主要(original/primary)分片置于同一節(jié)點上是非常重要的。擴展你的搜索量/吞吐量,因為搜索可以在所有的復制上并行運行??傊總€索引可以被分成多個分片。一個索引也可以被復制0次(意思是沒有復制)或多次。一旦復制了,每個索引就有了主分片(作為復制源的原來的分片)和復制分片(主分片的拷貝)之別。分片和復制的數(shù)量可以在索引創(chuàng)建的時候指定。在索引創(chuàng)建之后,你可以在任何時候動態(tài)地改變復制的數(shù)量,但是你事后不能改變分片的數(shù)量。

    默認情況下,Elasticsearch中的每個索引被分片5個主分片和1個復制,這意味著,如果你的集群中至少有兩個節(jié)點,你的索引將會有5個主分片和另外5個復制分片(1個完全拷貝),這樣的話每個索引總共就有10個分片。

    4.ElasticSearch客戶端操作

    上述部分為理論部分,實際開發(fā)中,主要有三種方式可以作為es服務的客戶端:

    • 使用elasticsearch-head插件
    • 使用elasticsearch提供的Restful接口直接訪問
    • 使用elasticsearch提供的API進行訪問

    4.1使用Restful接口直接訪問

    我們需要使用http請求,介紹兩款接口測試工具:postman和Talend API tester。

    • Talend API tester安裝:

    這是一款chrome插件,無需下載;

    • Postman安裝:

    Postman官網(wǎng):https://www.getpostman.com

    4.2使用Talend API tester進行es客戶端操作。

    1)Elasticsearch的接口語法

    curl ‐X<VERB> '<PROTOCOL>://<HOST>:<PORT>/<PATH>?<QUERY_STRING>' ‐d '<BODY>'

    其中:

    2)創(chuàng)建索引庫index并添加映射mapping------PUT

    PUT 

    請求體:

    article:type類型;相當于這個索引庫中有張表叫做article下面定義的這張表中的字段的定義,

    字段默認為不索引的;

    analyzer:分詞器使用標準分詞器

    {
        "mappings": {
            "article": {
                "properties": {
                    "id": {
                        "type": "long",
                        "store": true,
                        "index": "not_analyzed"
                    },
                    "title": {
                        "type": "text",
                        "store": true,
                        "index": "analyzed",
                        "analyzer": "standard"
                    },
                    "content": {
                        "type": "text",
                        "store": true,
                        "index": "analyzed",
                        "analyzer": "standard"
                    }
                }
            }
        }
    }

    在可視化工具elasticsearch-head中查看:

    3)先創(chuàng)建索引index,再添加mapping ----PUT

    我們可以在創(chuàng)建索引時設置mapping信息,當然也可以先創(chuàng)建索引然后再設置mapping。 在上一個步驟中不設置maping信息,直接使用put方法創(chuàng)建一個索引,然后設置mapping信息。 請求的url:

    PUT   http://127.0.0.1:9200/hello2/article/_mapping

    請求體:

    {
         "article": {
                "properties": {
                    "id": {
                        "type": "long",
                        "store": true,
                        "index": "not_analyzed"
                    },
                    "title": {
                        "type": "text",
                        "store": true,
                        "index": "analyzed",
                        "analyzer": "standard"
                    },
                    "content": {
                        "type": "text",
                        "store": true,
                        "index": "analyzed",
                        "analyzer": "standard"
                    }
                }
            }
    }

    4)刪除索引index ----DELETE

    請求URL:

    DELETE  http://127.0.0.1:9200/hello2

    5)創(chuàng)建文檔document(向索引庫中添加內(nèi)容)---POST

    請求URL:

    POST  http://127.0.0.1:9200/hello/article/1

    請求體:

    {
        "id": 1,
        "title": "ElasticSearch是一個基于Lucene的搜索服務器",
        "content": "它提供了一個分布式多用戶能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java開發(fā)的,并作為Apache許可條款下的開放源碼發(fā)布,是當前流行的企業(yè)級搜索引擎。設計用于云計算中,能夠達到實時搜索,穩(wěn)定,可靠,快速,安裝使用方便。"
    }

    在elasticsearch-head中查看:

    注意,一般我們將_id與id賦相同值。

    6)修改document內(nèi)容----POST

    請求URL:

    POST http://127.0.0.1:9200/hello/article/1

    在elasticsearch-head中查看:

    7)刪除文檔document---DELETE

    請求URL:

    DELETE http://127.0.0.1:9200/hello/article/2

    8)查詢文檔document-----GET

    查詢文檔有三種方式:

    • 根據(jù)id查詢;
    • 根據(jù)關鍵詞查詢
    • 根據(jù)輸入的內(nèi)容先分詞,再查詢

    i.根據(jù)id查詢

    請求URL:

    GET http://127.0.0.1:9200/hello/article/1

    ii.根據(jù)關鍵字查詢-term查詢

    請求URL:

    POST http://127.0.0.1:9200/hello/article/_search

    請求體:

    {
        "query": {
            "term": {
                "title": "搜"
            }
        }
    }

    iii.查詢文檔-querystring查詢

    請求URL:

    POST   http://127.0.0.1:9200/hello/article/_search

    請求體:

    {
        "query": {
            "query_string": {
                "default_field": "title",
                "query": "搜索服務器"
            }
        }
    }

    指定: 在哪個字段上進行查詢; 要查詢的內(nèi)容是什么;

    它會把查詢內(nèi)容先進行分詞,再進行查詢

    4.3使用elasticsearch-head進行es客戶端操作

    在elasticsearch-head中集成了http請求的工具,可以提供復查查詢:

    5.IK分詞器和Elasticsearch集成使用

    上述分詞器使用的是標準分詞器,其對中文分詞不是很友好,例如對我是程序員進行分詞得到:

    GET http://127.0.0.1:9200/_analyze?analyzer=standard&pretty=true&text=我是程序員
    "tokens":[
    {"token": "我", "start_offset": 0, "end_offset": 1, "type": "<IDEOGRAPHIC>",…},
    {"token": "是", "start_offset": 1, "end_offset": 2, "type": "<IDEOGRAPHIC>",…},
    {"token": "程", "start_offset": 2, "end_offset": 3, "type": "<IDEOGRAPHIC>",…},
    {"token": "序", "start_offset": 3, "end_offset": 4, "type": "<IDEOGRAPHIC>",…},
    {"token": "員", "start_offset": 4, "end_offset": 5, "type": "<IDEOGRAPHIC>",…}
    ]

    我們希望達到的分詞是:我、是、程序、程序員。

    支持中文的分詞器有很多,word分詞器,庖丁解牛,Ansj分詞器,下面注意說IK分詞器的使用。

    5.1IK分詞器的安裝

    1)下載地址:https://github.com/medcl/elasticsearch-analysis-ik/releases

    2)解壓,將解壓后的elasticsearch文件夾拷貝到elasticsearch-5.6.8\plugins下,并重命名文件夾為analysis-ik (其他名字也可以,目的是不要重名)

    3)重新啟動ElasticSearch,即可加載IK分詞器

    5.2IK分詞器測試

    IK提供兩種分詞ik_smart和ik_max_word

    其中ik_smart為最少切分,ik_max_word為最細粒度劃分。

    下面測試一下:

    • 最小切分:在瀏覽器輸入地址:
    GET   http://127.0.0.1:9200/_analyze?analyzer=ik_smart&pretty=true&text=我是程序員

    返回結(jié)果:

    "tokens":[
    {"token": "我", "start_offset": 0, "end_offset": 1, "type": "CN_CHAR",…},
    {"token": "是", "start_offset": 1, "end_offset": 2, "type": "CN_CHAR",…},
    {"token": "程序員", "start_offset": 2, "end_offset": 5, "type": "CN_WORD",…}
    ]
    • 最新切分:在瀏覽器輸入地址:
    GET   http://127.0.0.1:9200/_analyze?analyzer=ik_max_word&pretty=true&text=我是程序員

    返回結(jié)果:

    "tokens":[
    {"token": "我", "start_offset": 0, "end_offset": 1, "type": "CN_CHAR",…},
    {"token": "是", "start_offset": 1, "end_offset": 2, "type": "CN_CHAR",…},
    {"token": "程序員", "start_offset": 2, "end_offset": 5, "type": "CN_WORD",…},
    {"token": "程序", "start_offset": 2, "end_offset": 4, "type": "CN_WORD",…},
    {"token": "員", "start_offset": 4, "end_offset": 5, "type": "CN_CHAR",…}
    ]

    6.ElasticSearch集群

    ES集群是一個 P2P類型(使用 gossip 協(xié)議)的分布式系統(tǒng),除了集群狀態(tài)管理以外,其他所有的請求都可以發(fā)送到集群內(nèi)任意一臺節(jié)點上,這個節(jié)點可以自己找到需要轉(zhuǎn)發(fā)給哪些節(jié)點,并且直接跟這些節(jié)點通信。所以,從網(wǎng)絡架構(gòu)及服務配置上來說,構(gòu)建集群所需要的配置極其簡單。在 Elasticsearch 2.0 之前,無阻礙的網(wǎng)絡下,所有配置了相同 cluster.name 的節(jié)點都自動歸屬到一個集群中。2.0 版本之后,基于安全的考慮避免開發(fā)環(huán)境過于隨便造成的麻煩,從 2.0 版本開始,默認的自動發(fā)現(xiàn)方式改為了單播(unicast)方式。配置里提供幾臺節(jié)點的地址,ES 將其視作gossip router 角色,借以完成集群的發(fā)現(xiàn)。由于這只是 ES 內(nèi)一個很小的功能,所以 gossip router 角色并不需要單獨配置,每個 ES 節(jié)點都可以擔任。所以,采用單播方式的集群,各節(jié)點都配置相同的幾個節(jié)點列表作為 router即可。

    集群中節(jié)點數(shù)量沒有限制,一般大于等于2個節(jié)點就可以看做是集群了。一般處于高性能及高可用方面來

    慮一般集群中的節(jié)點數(shù)量都是3個及3個以上 .

    6.1 集群的搭建(Windows)

    1)準備三臺elasticsearch服務器:

    2)修改每臺服務器的配置

    修改\comf\elasticsearch.yml配置文件:

    #Node節(jié)點1:
     
    http.cors.enabled: true
    http.cors.allow-origin: "*"
    #節(jié)點1的配置信息:
    #集群名稱,保證唯一
    cluster.name: my-elasticsearch
    #節(jié)點名稱,必須不一樣
    node.name: node-1
    #必須為本機的ip地址
    network.host: 127.0.0.1
    #服務端口號,在同一機器下必須不一樣
    http.port: 9201
    #集群間通信端口號,在同一機器下必須不一樣
    transport.tcp.port: 9301
    #設置集群自動發(fā)現(xiàn)機器ip集合
    discovery.zen.ping.unicast.hosts: ["127.0.0.1:9301","127.0.0.1:9302","127.0.0.1:9303"]
     
    #Node節(jié)點2:
     
    http.cors.enabled: true
    http.cors.allow-origin: "*"
    #節(jié)點1的配置信息:
    #集群名稱,保證唯一
    cluster.name: my-elasticsearch
    #節(jié)點名稱,必須不一樣
    node.name: node-2
    #必須為本機的ip地址
    network.host: 127.0.0.1
    #服務端口號,在同一機器下必須不一樣
    http.port: 9202
    #集群間通信端口號,在同一機器下必須不一樣
    transport.tcp.port: 9302
    #設置集群自動發(fā)現(xiàn)機器ip集合
    discovery.zen.ping.unicast.hosts: ["127.0.0.1:9301","127.0.0.1:9302","127.0.0.1:9303"]
     
    #Node節(jié)點3:
     
    http.cors.enabled: true
    http.cors.allow-origin: "*"
    #節(jié)點1的配置信息:
    #集群名稱,保證唯一
    cluster.name: my-elasticsearch
    #節(jié)點名稱,必須不一樣
    node.name: node-3
    #必須為本機的ip地址
    network.host: 127.0.0.1
    #服務端口號,在同一機器下必須不一樣
    http.port: 9203
    #集群間通信端口號,在同一機器下必須不一樣
    transport.tcp.port: 9303
    #設置集群自動發(fā)現(xiàn)機器ip集合
    discovery.zen.ping.unicast.hosts: ["127.0.0.1:9301","127.0.0.1:9302","127.0.0.1:9303"]

    3.啟動各個節(jié)點服務器

    可以分別啟動每個服務器下的elasticsearch.bat,我這里使用的是windows下的批處理文件:

    新建一個elasticsearch_cluster_start.bat文件,然后添加下面內(nèi)容:

    格式為:start "需要啟動的文件名" "文件的路徑" &表示啟動A后繼續(xù)執(zhí)行。

    start "elasticsearch.bat" "F:\Soft\ES-cluster\cluster01\bin\elasticsearch.bat" &
    start "elasticsearch.bat" "F:\Soft\ES-cluster\cluster02\bin\elasticsearch.bat" &
    start "elasticsearch.bat" "F:\Soft\ES-cluster\cluster03\bin\elasticsearch.bat" 

    關于Windows的批處理在本章就不細說了。

    4.集群測試

    只要連接集群中的任意節(jié)點,其操作方式與單機版本基本相同,改變的僅僅是存儲的結(jié)構(gòu)。

    添加索引和映射

    PUT  http://127.0.0.1:9201/hello

    請求體:

    {
        "mappings": {
        "article": {
            "properties": {
                "id": {
                    "type": "long",
                    "store": true,
                     "index": "not_analyzed"
                },
                "title": {
                    "type": "text",
                    "store": true,
                    "index": true,
                    "analyzer": "ik_smart"
                },
                "content": {
                    "type": "text",
                    "store": true,
                    "index": true,
                    "analyzer": "ik_smart"
                }
            }
        }
        }
    }

    返回結(jié)果:

    {
    "acknowledged": true,
    "shards_acknowledged": true,
    "index": "hello"
    }

    添加文檔

    POST   http://127.0.0.1:9201/hello/article/1

    請求體:

    {
    "id":1,
    "title":"ElasticSearch是一個基于Lucene的搜索服務器",
    "content":"它提供了一個分布式多用戶能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java開發(fā)的,并作為Apache許可條款下的開放源碼發(fā)布,是當前流行的企業(yè)級搜索引擎。設計用于云計算中,能夠達到實時搜索,穩(wěn)定,可靠,快速,安裝使用方便。"
    }

    返回值:

    {
    "_index": "hello",
    "_type": "article",
    "_id": "1",
    "_version": 1,
    "result": "created",
    "_shards":{
    "total": 2,
    "successful": 2,
    "failed": 0
    },
    "created": true
    }

    在elasticsearch-head中查看:

    7.ElasticSearch安裝(Linux)

    1)保證你已經(jīng)安裝了java環(huán)境

    可以直接把windows中的copy過去,不用安裝,解壓即可。

    tar -zxf elasticsearch-6.3.2.tar.gz

    2)修改配置文件

    • 修改conf\jvm.option文件
    將#-Xms2g                                  
      #-Xmx2g修改成為:
    -Xms340m
    -Xmx340m
    否則因為虛擬機內(nèi)存不夠無法啟動
    • 修改conf\elasticsearch.yml文件
    #elasticsearch-5.6.8\config\elasticsearch.yml中末尾加入:
    http.cors.enabled: true
    http.cors.allow-origin: "*"
    network.host: 127.0.0.1
    目的是使ES支持跨域請求

    3)啟動

    注意:在linux環(huán)境下不支持root用戶直接啟動(理由是安全問題)

    • 添加用戶:
    [root@coderxz bin]# useradd rxz -p rongxianzhao
    [root@coderxz bin]# chown -R rxz:rxz /usr/local/elasticsearch/*
    [root@coderxz bin]# su rxz
    • 執(zhí)行:
    #注意:切換為非root用戶執(zhí)行哦
    [rxz@coderxz bin]$ ./elasticsearch
    • 查看運行狀態(tài):
    檢測是否運行:jps (顯示所有的Java進程pid的命令)
                      ps aux|grep elasticsearch
                      [root@coderxz ~]# curl -X GET 'http://localhost:9200'

    4)配置外網(wǎng)訪問9200端口 需要開放服務器的端口

    修改配置文件 config/elasticsearch.yml

    network.host: 0.0.0.0

    5)后臺啟動

    如果你在服務器上安裝Elasticsearch,而你想在本地機器上進行開發(fā),這時候,你很可能需要在關閉終端的時候,讓Elasticsearch繼續(xù)保持運行。最簡單的方法就是使用nohup。先按Ctrl + C,停止當前運行的Elasticsearch,改用下面的命令運行Elasticsearch。

    nohup ./bin/elasticsearch&

    原文連接:https://www.cnblogs.com/coderxz/p/13268417.html

    作者:coderxz

    基于文檔式的全文檢索引擎大家都不陌生,之前一篇文章:使用Redisearch實現(xiàn)的全文檢索功能服務,曾經(jīng)使用Rediseach來小試牛刀了一把,文中戲謔的稱Rediseach已經(jīng)替代了Elasticsearch,其實不然,Elasticsearch作為老牌的全文檢索引擎還并沒有退出歷史舞臺,依舊占據(jù)主流市場,桃花依舊笑春風,阿里也在其ecs服務中推出了云端Elasticsearch引擎,所以本次我們在Win10系統(tǒng)中依托Docker來感受一下Elasticsearch的魅力。

    首先安裝Docker,具體流程請參照:win10系統(tǒng)下把玩折騰DockerToolBox以及更換國內(nèi)鏡像源(各種神坑),這里不再贅述。

    拉取Elasticsearch鏡像,這里我們使用7.0以上的版本,該版本從性能和效率上都得到了優(yōu)化。

    docker pull elasticsearch:7.2.0

    隨后運行Elasticsearch鏡像

    docker run --name es -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -d elasticsearch:7.2.0

    容器別名我們就用縮寫es來替代,通過 9200 端口并使用 Elasticsearch 的原生 傳輸 協(xié)議和集群交互。集群中的節(jié)點通過端口 9300 彼此通信。如果這個端口沒有打開,節(jié)點將無法形成一個集群,運行模式先走單節(jié)點模式。

    啟動容器成功后,可以訪問一下瀏覽器: http://localhost:9200

    OK,沒有任何問題,Elasticsearch 采用 YAML 文件對系統(tǒng)進行配置,原理很簡單,就像Django的settings或者Flask的Config,只要通知Elasticsearch服務在運行過程中一些你想要的功能,而Elasticsearch會找到elasticsearch.yml,之后按你指定的參數(shù)運行服務。

    此時,我們需要將容器內(nèi)部Elasticsearch的配置文件拷貝出來,這樣以后啟動容器就可以按照我們自己指定的配置來修改了。

    docker cp 容器id:/usr/share/elasticsearch/config/elasticsearch.yml ./elasticsearch.yml

    老規(guī)矩,前面的是容器內(nèi)地址,后面的是宿主機地址,這里我就拷貝到當前目錄下,當然了,你也可以指定絕對路徑。

    打開elasticsearch.yml,可以自己加一些配置,比如允許跨域訪問,這樣你這臺Elasticsearch就可以被別的服務器訪問了,這是微服務全文檢索系統(tǒng)架構(gòu)的第一步。

    cluster.name: "docker-cluster"
    network.host: 0.0.0.0
    http.cors.enabled: true
    http.cors.allow-origin: "*"

    然后停止正在運行的Elasticsearch容器,并且刪除它。

    docker stop 容器id
    docker rm $(docker ps -a -q)

    再次啟動Elasticsearch容器,這一次不同的是,我們需要通過-v掛載命令把我們剛剛修改好的elasticsearch.yml掛載到容器內(nèi)部去,這樣容器就根據(jù)我們自己修改的配置文件來運行Elasticsearch服務。

    docker run --name es -v /es/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -d elasticsearch:7.2.0

    這里需要注意一點,就是在Win10宿主機里需要單獨設置一下共享文件夾,這里我設置的共享文件夾叫做es,如果是Centos或者Mac os就直接寫真實物理路徑即可。

    這里再簡單介紹一下Win10如何設置共享文件夾用來配合Docker的掛載,打開virtualBox設置,新建一個共享文件夾es

    隨后,重啟Docker,輸入命令進入默認容器:docker-machine ssh default

    在容器根目錄能夠看到剛剛設置的共享文件夾,就說明設置成功了。


    另外還有一個需要注意的點,就是Elasticsearch存儲數(shù)據(jù)也可以通過-v命令掛載出來,如果不對數(shù)據(jù)進行掛載,當容器被停止或者刪除,數(shù)據(jù)也會不復存在,所以掛載后存儲在宿主機會比較好一點,命令是:


    docker run --name es -v /es/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml -v /es/data:/usr/share/elasticsearch/data -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -d elasticsearch:7.2.0


    再次啟動容器成功之后,我們就可以利用Python3來和全文檢索引擎Elasticsearch進行交互了,安裝依賴的庫。

    pip3 install elasticsearch

    新建es_test.py測試腳本

    建立Elasticsearch的檢索實例

    from elasticsearch import Elasticsearch
     
    es=Elasticsearch(hosts=[{"host":'Docker容器所在的ip', "port": 9200}])

    這里的host指容器ip,因為可以擴展集群,所以是一個list,需要注意一點,如果是Win10就是系統(tǒng)分配的那個ip,Centos或者Mac os直接寫127.0.0.1即可。

    建立索引(Index),這里我們創(chuàng)建一個名為 article 的索引

    result=es.indices.create(index='article', ignore=400)
    print(result)
    
    {'acknowledged': True, 'shards_acknowledged': True, 'index': 'article'}
    

    其中的 acknowledged 字段表示創(chuàng)建操作執(zhí)行成功。

    刪除索引也是類似的,代碼如下:

    result=es.indices.delete(index='article', ignore=[400, 404])
    print(result)
    
    {'acknowledged': True}

    插入數(shù)據(jù),Elasticsearch 就像 MongoDB 一樣,在插入數(shù)據(jù)的時候可以直接插入結(jié)構(gòu)化字典數(shù)據(jù),插入數(shù)據(jù)可以調(diào)用 index() 方法,這里索引和數(shù)據(jù)是強關聯(lián)的,所以插入時需要指定之前建立好的索引。

    data={'title': '我在北京學習人工智能', 'url': 'http://123.com','content':"在北京學習"}
    result=es.index(index='article',body=data)
    print(result)
    
    {'_index': 'article', '_type': '_doc', '_id': 'GyJgb3MBuQaE6wYOApTh', '_version': 1, 'result': 'created', '_shards': {'total': 2, 'successful': 1, 'failed': 0}, '_seq_no': 5, '_primary_term': 1}
    

    可以看到index()方法會自動生成一個唯一id,當然我們也可以使用create()方法創(chuàng)建數(shù)據(jù),不同的是create()需要手動指定一個id。

    修改數(shù)據(jù)也非常簡單,我們同樣需要指定數(shù)據(jù)的 id 和內(nèi)容,調(diào)用 index() 方法即可,代碼如下:

    data={'content':"在北京學習python"}
    
    #修改
    result=es.index(index='article',body=data, id='GyJgb3MBuQaE6wYOApTh')
    
    {'_index': 'article', '_type': '_doc', '_id': 'GyJgb3MBuQaE6wYOApTh', '_version': 2, 'result': 'updated', '_shards': {'total': 2, 'successful': 1, 'failed': 0}, '_seq_no': 6, '_primary_term': 1}
    

    刪除數(shù)據(jù),可以調(diào)用 delete() 方法,指定需要刪除的數(shù)據(jù) id 即可

    #刪除
    result=es.delete(index='article',id='GyJgb3MBuQaE6wYOApTh')
    print(result)
    
    {'_index': 'article', '_type': '_doc', '_id': 'GyJgb3MBuQaE6wYOApTh', '_version': 3, 'result': 'deleted', '_shards': {'total': 2, 'successful': 1, 'failed': 0}, '_seq_no': 7, '_primary_term': 1}
    

    查詢數(shù)據(jù),這里可以簡單的查詢?nèi)繑?shù)據(jù):

    #查詢
    result=es.search(index='article')
    print(result)
    
    {'took': 1079, 'timed_out': False, '_shards': {'total': 1, 'successful': 1, 'skipped': 0, 'failed': 0}, 'hits': {'total': {'value': 5, 'relation': 'eq'}, 'max_score': 1.0, 'hits': [{'_index': 'article', '_type': 'blog', '_id': '1', '_score': 1.0, '_source': {'title': '我在北京學習人工智能', 'url': 'http://123.com', 'content': '在北京學習'}}, {'_index': 'article', '_type': 'blog', '_id': 'FyIdb3MBuQaE6wYO8JQR', '_score': 1.0, '_source': {'title': '你好', 'content': '你好123'}}, {'_index': 'article', '_type': 'blog', '_id': 'GCIeb3MBuQaE6wYOnpSv', '_score': 1.0, '_source': {'title': '你好', 'url': 'http://123.com', 'content': '你好123'}}, {'_index': 'article', '_type': 'blog', '_id': 'GSJfb3MBuQaE6wYOu5RD', '_score': 1.0, '_source': {'title': '你好', 'url': 'http://123.com', 'content': '你好123'}}, {'_index': 'article', '_type': 'blog', '_id': 'GiJfb3MBuQaE6wYO5pR4', '_score': 1.0, '_source': {'title': '你好', 'url': 'http://123.com', 'content': '你好123'}}]}}
    

    還可以進行全文檢索,這才是體現(xiàn) Elasticsearch 搜索引擎特性的地方。

    mapping={
        'query': {
            'match': {
                'content': '學習 北京'
            }
        }
    }
    
    result=es.search(index='article',body=mapping)
    print(result)
    
    {'took': 4, 'timed_out': False, '_shards': {'total': 1, 'successful': 1, 'skipped': 0, 'failed': 0}, 'hits': {'total': {'value': 1, 'relation': 'eq'}, 'max_score': 4.075481, 'hits': [{'_index': 'article', '_type': 'blog', '_id': '1', '_score': 4.075481, '_source': {'title': '我在北京學習人工智能', 'url': 'http://123.com', 'content': '在北京學習'}}]}}
    

    可以看出,檢索時會對對應的字段全文檢索,結(jié)果還會按照檢索關鍵詞的相關性進行排序,這就是一個基本的搜索引擎雛形。

    除了這些最基本的操作,Elasticsearch還支持很多復雜的查詢,可以參照最新的7.2版本文檔:https://www.elastic.co/guide/en/elasticsearch/reference/7.2/query-dsl.html

    結(jié)語:體驗了之后,有人說,Elasticsearch這玩意還真不錯,能不能把Mysql或者Mongo全都扔了,就拿它當數(shù)據(jù)庫不就完事了嗎?答案當然是不可能的,因為Elasticsearch沒有事務,而且是查詢是近實時,寫入速度很慢,只是讀取數(shù)據(jù)快,成本也比數(shù)據(jù)庫高,幾乎就在靠吃內(nèi)存提高性能,它目前只是作為搜索引擎的存在,如果你的業(yè)務涉及全文檢索,那么它就是你的首選方案之一。

網(wǎng)站首頁   |    關于我們   |    公司新聞   |    產(chǎn)品方案   |    用戶案例   |    售后服務   |    合作伙伴   |    人才招聘   |   

友情鏈接: 餐飲加盟

地址:北京市海淀區(qū)    電話:010-     郵箱:@126.com

備案號:冀ICP備2024067069號-3 北京科技有限公司版權(quán)所有