日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

Elasticsearch 教程--入门

發(fā)布時(shí)間:2025/3/21 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Elasticsearch 教程--入门 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1.1 初識(shí)

Elasticsearch 是一個(gè)建立在全文搜索引擎?Apache Lucene(TM)?基礎(chǔ)上的搜索引擎,可以說(shuō) Lucene 是當(dāng)今最先進(jìn),最高效的全功能開源搜索引擎框架。

但是 Lucene 只是一個(gè)框架,要充分利用它的功能,你需要使用 JAVA,并且在你的程序中集成 Lucene。更糟的是,你需要做很多的學(xué)習(xí)了解,才能明白它是如何運(yùn)行的,Lucene 確實(shí)非常復(fù)雜。

Elasticsearch 使用 Lucene 作為內(nèi)部引擎,但是在你使用它做全文搜索時(shí),只需要使用統(tǒng)一開發(fā)好的API即可,而并不需要了解其背后復(fù)雜的 Lucene 的運(yùn)行原理。

當(dāng)然 Elasticsearch 并不僅僅是 Lucene 那么簡(jiǎn)單,它不僅包括了全文搜索功能,還可以進(jìn)行以下工作:

    • 分布式實(shí)時(shí)文件存儲(chǔ),并將每一個(gè)字段都編入索引,使其可以被搜索。
    • 實(shí)時(shí)分析的分布式搜索引擎。
    • 可以擴(kuò)展到上百臺(tái)服務(wù)器,處理PB級(jí)別的結(jié)構(gòu)化或非結(jié)構(gòu)化數(shù)據(jù)。

這么多的功能被集成到一臺(tái)服務(wù)器上,你可以輕松地通過(guò)客戶端或者任何你喜歡的程序語(yǔ)言與 ES 的 RESTful API 進(jìn)行交流。

Elasticsearch 的上手是非常簡(jiǎn)單的。它附帶了很多非常合理的默認(rèn)值,這讓初學(xué)者很好地避免一上手就要面對(duì)復(fù)雜的理論,它安裝好了就可以使用了,用很小的學(xué)習(xí)成本就可以變得很有生產(chǎn)力。

隨著學(xué)習(xí)的深入,你還可以使用 Elasticsearch 更多高級(jí)的功能,整個(gè)引擎可以很靈活地進(jìn)行配置。你可以根據(jù)自身需求來(lái)定制屬于你自己的 Elasticsearch。

1.2 安裝

安裝 JAVA

yum install java-1.7.0-openjdk -y

安裝 Elasticsearch

了解 Elasticsearch 最簡(jiǎn)單的方法就是去盡情的玩兒它(汗),準(zhǔn)備好了我們就開始吧。

安裝 Elasticsearch 只有一個(gè)要求,就是要安裝最新版本的JAVA。你可以到官方網(wǎng)站下載它:www.java.com.

你可以在這里下載到最新版本的 Elasticsearch:?elasticsearch.org/download.

curl -L -O http://download.elasticsearch.org/PATH/TO/LATEST/$VERSION.zip unzip elasticsearch-$VERSION.zip cd elasticsearch-$VERSION

提示: 當(dāng)你安裝 Elasticsearch 時(shí),你可以到?下載頁(yè)面?選擇Debian或者RP安裝包。或者你也可以使用官方提供的?Puppet module?或者?Chef cookbook.

安裝 Marvel

這是個(gè)付費(fèi)的監(jiān)控插件 暫時(shí)先不翻譯

Marvel?is a management and monitoring tool for Elasticsearch which is free for development use. It comes with an interactive console called Sense which makes it very easy to talk to Elasticsearch directly from your browser.

Many of the code examples in this book include a ``View in Sense'' link. When clicked, it will open up a working example of the code in the Sense console. You do not have to install Marvel, but it will make this book much more interactive by allowing you to experiment with the code samples on your local Elasticsearch cluster.

Marvel is available as a plugin. To download and install it, run this command in the Elasticsearch directory:

./bin/plugin -i elasticsearch/marvel/latest

You probably don't want Marvel to monitor your local cluster, so you can disable data collection with this command:

echo 'marvel.agent.enabled: false' >> ./config/elasticsearch.yml

運(yùn)行 Elasticsearch

Elasticsearch 已經(jīng)蓄勢(shì)待發(fā),現(xiàn)在你便可以運(yùn)行它了:

./bin/elasticsearch

如果你想讓它在后臺(tái)保持運(yùn)行的話可以在命令后面再加一個(gè)?-d

開啟后你就可以使用另一個(gè)終端窗口來(lái)進(jìn)行測(cè)試了:

curl 'http://localhost:9200/?pretty'

你應(yīng)該看到如下提示:

{"status": 200,"name": "Shrunken Bones","version": { "number": "1.4.0", "lucene_version": "4.10" }, "tagline": "You Know, for Search" }

這就說(shuō)明你的 Elasticsearch?集群?已經(jīng)上線運(yùn)行了,這時(shí)我們就可以進(jìn)行各種實(shí)驗(yàn)了。


集群和節(jié)點(diǎn)

節(jié)點(diǎn)?是 Elasticsearch 運(yùn)行的實(shí)例。集群?是一組有著同樣cluster.name的節(jié)點(diǎn),它們協(xié)同工作,互相分享數(shù)據(jù),提供了故障轉(zhuǎn)移和擴(kuò)展的功能。當(dāng)然一個(gè)節(jié)點(diǎn)也可以是一個(gè)集群。

1.3 API

與 Elasticsearch 通信

如何與 Elasticsearch 通信要取決于你是否使用 JAVA。

Java API

如果你使用的是 JAVA,Elasticsearch 內(nèi)置了兩個(gè)客戶端,你可以在你的代碼中使用:

節(jié)點(diǎn)客戶端: 節(jié)點(diǎn)客戶端以一個(gè)?無(wú)數(shù)據(jù)節(jié)點(diǎn)?的身份加入了一個(gè)集群。換句話說(shuō),它自身是沒(méi)有任何數(shù)據(jù)的,但是他知道什么數(shù)據(jù)在集群中的哪一個(gè)節(jié)點(diǎn)上,然后就可以請(qǐng)求轉(zhuǎn)發(fā)到正確的節(jié)點(diǎn)上并進(jìn)行連接。

傳輸客戶端: 更加輕量的傳輸客戶端可以被用來(lái)向遠(yuǎn)程集群發(fā)送請(qǐng)求。他并不加入集群本身,而是把請(qǐng)求轉(zhuǎn)發(fā)到集群中的節(jié)點(diǎn)。

這兩個(gè)客戶端都使用 Elasticsearch 的?傳輸?協(xié)議,通過(guò)9300端口與 java 客戶端進(jìn)行通信。集群中的各個(gè)節(jié)點(diǎn)也是通過(guò)9300端口進(jìn)行通信。如果這個(gè)端口被禁止了,那么你的節(jié)點(diǎn)們將不能組成一個(gè)集群。


TIP

Java 的客戶端的版本號(hào)必須要與 Elasticsearch 節(jié)點(diǎn)所用的版本號(hào)一樣,不然他們之間可能無(wú)法識(shí)別。


更多關(guān)于 Java API 的說(shuō)明可以在這里找到?Guide.

通過(guò) HTTP 向 RESTful API 傳送 json

其他的語(yǔ)言可以通過(guò)9200端口與 Elasticsearch 的 RESTful API 進(jìn)行通信。事實(shí)上,如你所見,你甚至可以使用行命令?curl?來(lái)與 Elasticsearch 通信。


Elasticsearch 官方提供了很多種編程語(yǔ)言的客戶端,也有和許多社區(qū)化軟件的集成插件,這些都可以在Guide?里面找到。


向 Elasticsearch 發(fā)出的請(qǐng)求和其他所有的 HTTP 請(qǐng)求的組成部分是一致的。例如,計(jì)算集群中文件的數(shù)量,我們就可以使用:

<1>?<2>?<3>?<4> curl -XGET 'http://localhost:9200/_count?pretty' -d ' {?<5> "query": { "match_all": {} } } '

  • 相應(yīng)的 HTTP?請(qǐng)求方法?或者?變量?:?GET,?POST,?PUT,?HEAD?或者?DELETE。

  • 集群中任意一個(gè)節(jié)點(diǎn)的訪問(wèn)協(xié)議、主機(jī)名以及端口。

  • 請(qǐng)求的路徑。

  • 任意一個(gè)查詢后再加上??pretty?就可以生成?更加美觀?的JSON反饋,以增強(qiáng)可讀性。

  • 一個(gè) JSON 編碼的請(qǐng)求主體(如果需要的話)。

  • Elasticsearch 將會(huì)返回一個(gè) HTTP 狀態(tài)碼類似于 '200 OK',以及一個(gè) JSON 格式的主體(除了單純的 'HEAD' 請(qǐng)求),上面的請(qǐng)求會(huì)得到下方的 JSON 主體:

    {?"count" :?0,?"_shards" : {?"total" :?5,?"successful" :?5,?"failed" :?0 } }

    在反饋中,我們并沒(méi)有看見 HTTP 的頭部信息,因?yàn)槲覀儧](méi)有告知?curl?顯示這些內(nèi)容。如果你想看到頭部信息,可以在使用?curl?命令的時(shí)候再加上?-i?這個(gè)參數(shù):

    curl -i -XGET?'localhost:9200/'

    從現(xiàn)在開始,本書里所有涉及?curl?命令的部分我們都會(huì)進(jìn)行簡(jiǎn)寫,因?yàn)橹鳈C(jī)、端口等信息都是相同的,縮減前的樣子:

    curl -XGET 'localhost:9200/_count?pretty' -d ' { "query": { "match_all": {} } }'

    我們將會(huì)簡(jiǎn)寫成這樣:

    GET /_count {?"query": {?"match_all": {} } }

    1.4 文檔

    面向文檔

    程序中的對(duì)象很少是單純的鍵值與數(shù)值的列表。更多的時(shí)候它擁有一個(gè)復(fù)雜的結(jié)構(gòu),比如包含了日期、地理位置、對(duì)象、數(shù)組等。

    遲早你會(huì)把這些對(duì)象存儲(chǔ)在數(shù)據(jù)庫(kù)中。你會(huì)試圖將這些豐富而又龐大的數(shù)據(jù)都放到一個(gè)由行與列組成的關(guān)系數(shù)據(jù)庫(kù)中,然后你不得不根據(jù)每個(gè)字段的格式來(lái)調(diào)整數(shù)據(jù),然后每次重建它你都要檢索一遍數(shù)據(jù)。

    Elasticsearch 是?面向文檔型數(shù)據(jù)庫(kù),這意味著它存儲(chǔ)的是整個(gè)對(duì)象或者?文檔,它不但會(huì)存儲(chǔ)它們,還會(huì)為他們建立索引,這樣你就可以搜索他們了。你可以在 Elasticsearch 中索引、搜索、排序和過(guò)濾這些文檔。不需要成行成列的數(shù)據(jù)。這將會(huì)是完全不同的一種面對(duì)數(shù)據(jù)的思考方式,這也是為什么 Elasticsearch 可以執(zhí)行復(fù)雜的全文搜索的原因。

    JSON

    Elasticsearch使用?JSON?(或稱作JavaScript Object Notation ) 作為文檔序列化的格式。JSON 已經(jīng)被大多數(shù)語(yǔ)言支持,也成為 NoSQL 領(lǐng)域的一個(gè)標(biāo)準(zhǔn)格式。它簡(jiǎn)單、簡(jiǎn)潔、易于閱讀。

    把這個(gè) JSON 想象成一個(gè)用戶對(duì)象:

    {"email": "john@smith.com","first_name": "John","last_name": "Smith", "about": { "bio": "Eco-warrior and defender of the weak", "age": 25, "interests": [ "dolphins", "whales" ] }, "join_date": "2014/05/01", }

    雖然?user?這個(gè)對(duì)象非常復(fù)雜,但是它的結(jié)構(gòu)和含義都被保留到 JSON 中了。在 Elasticsearch 中,將對(duì)象轉(zhuǎn)換為 JSON 并作為索引要比在表結(jié)構(gòu)中做相同的事情簡(jiǎn)單多了。


    將你的數(shù)據(jù)轉(zhuǎn)換為 JSON

    幾乎所有的語(yǔ)言都有將任意數(shù)據(jù)轉(zhuǎn)換、機(jī)構(gòu)化成 JSON,或者將對(duì)象轉(zhuǎn)換為JSON的模塊。查看?serialization?以及marshalling?兩個(gè) JSON 模塊。The official Elasticsearch clients?也可以幫你自動(dòng)結(jié)構(gòu)化 JSON。

    1.5 索引

    啟程

    為了能讓你感受一下 Elasticsearch 能做什么以及它是有多么的易用,我們會(huì)先為你簡(jiǎn)單展示一下,其中包括了基本的?創(chuàng)建索引搜索?以及?聚合

    我們會(huì)在這里向你介紹一些新的術(shù)語(yǔ)以及簡(jiǎn)單的概念,即使你沒(méi)有馬上接受這些概念也沒(méi)有關(guān)系。我們會(huì)在之后的章節(jié)中逐漸幫你理解它們。

    所以,準(zhǔn)備開始享受 Elasticsearch 的學(xué)習(xí)之旅把!

    建立一個(gè)員工名單

    想象我們正在為一個(gè)名叫 megacorp 的公司的 HR 部門制作一個(gè)新的員工名單系統(tǒng),這些名單應(yīng)該可以滿足實(shí)時(shí)協(xié)同工作,所以它應(yīng)該可以滿足以下要求:

      • 數(shù)據(jù)可以包含多個(gè)值的標(biāo)簽、數(shù)字以及純文本內(nèi)容,
      • 可以檢索任何職員的所有數(shù)據(jù)。
      • 允許結(jié)構(gòu)化搜索。例如,查找30歲以上的員工。
      • 允許簡(jiǎn)單的全文搜索以及相對(duì)復(fù)雜的短語(yǔ)搜索。
      • 在返回的匹配文檔中高亮關(guān)鍵字。
      • 擁有數(shù)據(jù)統(tǒng)計(jì)與管理的后臺(tái)。

    為員工檔案創(chuàng)建索引

    這個(gè)項(xiàng)目的第一步就是存儲(chǔ)員工的數(shù)據(jù)。這樣你就需要一個(gè)“員工檔案”的表單,這樣每個(gè)文檔都代表著一個(gè)員工。在 Elasticsearch 中,存儲(chǔ)數(shù)據(jù)的行為就叫做?索引(indexing)?,但是在我們索引數(shù)據(jù)前,我們需要決定將數(shù)據(jù)存儲(chǔ)在哪里。

    在 Elasticsearch 中,文檔屬于一種?類型(type),各種各樣的類型存在于一個(gè)?索引?中。你也可以通過(guò)類比傳統(tǒng)的關(guān)系數(shù)據(jù)庫(kù)得到一些大致的相似之處:

    關(guān)系數(shù)據(jù)庫(kù) ? 數(shù)據(jù)庫(kù) ? 表 ? 行 ? 列(Columns) Elasticsearch ? 索引 ? 類型 ? 文檔 ? 字段(Fields)

    一個(gè) Elasticsearch 集群可以包含多個(gè)?索引(數(shù)據(jù)庫(kù)),也就是說(shuō)其中包含了很多?類型(表)。這些類型中包含了很多的?文檔(行),然后每個(gè)文檔中又包含了很多的?字段(列)。


    索引 索引 索引

    你可能發(fā)現(xiàn)在 Elasticsearch 中,索引這個(gè)詞匯已經(jīng)被賦予了太多意義,所以在這里我們有必要澄清一下:

    索引 (名詞)

    如上文所說(shuō),一個(gè)?索引?就類似于傳統(tǒng)關(guān)系型數(shù)據(jù)庫(kù)中的?數(shù)據(jù)庫(kù)。這里就是存儲(chǔ)相關(guān)文檔的的地方。

    索引 (動(dòng)詞)

    為一個(gè)文檔創(chuàng)建索引?是把一個(gè)文檔存儲(chǔ)到一個(gè)索引(名詞)中的過(guò)程,這樣它才能被檢索。這個(gè)過(guò)程非常類似于 SQL 中的?INSERT?命令,如果已經(jīng)存在文檔,新的文檔將會(huì)覆蓋舊的文檔。

    反向索引

    在關(guān)系數(shù)據(jù)庫(kù)中的某列添加一個(gè)?索引,比如多路搜索樹(B-Tree)索引,就可以加速數(shù)據(jù)的取回速度, Elasticsearch 以及 Lucene 使用的是一個(gè)叫做?反向索引(inverted index)?的結(jié)構(gòu)來(lái)實(shí)現(xiàn)相同的功能。

    通常,每個(gè)文檔中的字段都被創(chuàng)建了索引(擁有一個(gè)反向索引),因此他們可以被搜索。如果一個(gè)字段缺失了反向索引的話,它將不能被搜索。我們將會(huì)在之后的《反向索引》章節(jié)中詳細(xì)介紹它。


    所以為了創(chuàng)建員工名單,我們需要進(jìn)行如下操作:

      • 為每一個(gè)員工的?文檔?創(chuàng)建索引,每個(gè)?文檔?都包含了一個(gè)員工的所有信息。
      • 每個(gè)文檔都會(huì)被標(biāo)記為?employee?類型
      • 這種類型將存活在?megacorp?這個(gè)?索引?中。
      • 這個(gè)索引將會(huì)存儲(chǔ)在 Elasticsearch 的集群中

    在實(shí)際的操作中,這些操作是非常簡(jiǎn)單的(即使看起來(lái)有這么多步驟)。我們可以把如此之多的操作通過(guò)一個(gè)命令來(lái)完成:

    PUT /megacorp/employee/1 {"first_name" : "John","last_name" : "Smith", "age" : 25, "about" : "I love to go rock climbing", "interests": [ "sports", "music" ] }

    注意在?/megacorp/employee/1?路徑下,包含了三個(gè)部分:

    名字 內(nèi)容
    megacorp 索引的名字
    employee 類型的名字
    1 當(dāng)前員工的ID

    請(qǐng)求部分,也就是 JSON 文檔,在這里包含了關(guān)于這名員工的所有信息。他的名字是 “John Smith”,他已經(jīng)25歲了,他很喜歡攀巖。

    怎么樣?很簡(jiǎn)單吧!我們?cè)诓僮髑安恍枰M(jìn)行任何管理操作,比如創(chuàng)建索引,或者為字段指定數(shù)據(jù)的類型。我們就這么直接地為一個(gè)文檔創(chuàng)建了索引。Elasticsearch 會(huì)在創(chuàng)建的時(shí)候?yàn)樗鼈冊(cè)O(shè)定默認(rèn)值,所以所有管理操作已經(jīng)在后臺(tái)被默默地完成了。

    在進(jìn)行下一步之前,我們?cè)贋檫@個(gè)目錄添加更多的員工信息吧:

    PUT /megacorp/employee/2 {"first_name" : "Jane","last_name" : "Smith", "age" : 32, "about" : "I like to collect rock albums", "interests": [ "music" ] } PUT /megacorp/employee/3 { "first_name" : "Douglas", "last_name" : "Fir", "age" : 35, "about": "I like to build cabinets", "interests": [ "forestry" ] }

    1.6 搜索

    檢索文檔

    現(xiàn)在,我們已經(jīng)在 Elasticsearch 中存儲(chǔ)了一些數(shù)據(jù),我們可以開始根據(jù)這個(gè)項(xiàng)目的需求進(jìn)行工作了。第一個(gè)需求就是要能搜索每一個(gè)員工的數(shù)據(jù)。

    對(duì)于 Elasticsearch 來(lái)說(shuō),這是非常簡(jiǎn)單的。我們只需要執(zhí)行一次 HTTP GET 請(qǐng)求,然后指出文檔的地址,也就是索引、類型以及 ID 即可。通過(guò)這三個(gè)部分,我們就可以得到原始的 JSON 文檔:

    GET /megacorp/employee/1

    返回的內(nèi)容包含了這個(gè)文檔的元數(shù)據(jù)信息,而 John Smith 的原始 JSON 文檔也在?_source?字段中出現(xiàn)了:

    {"_index" : "megacorp","_type" : "employee","_id" : "1", "_version" : 1, "found" : true, "_source" : { "first_name" : "John", "last_name" : "Smith", "age" : 25, "about" : "I love to go rock climbing", "interests": [ "sports", "music" ] } }

    我們通過(guò)將HTTP后的請(qǐng)求方式由?PUT?改變?yōu)?GET?來(lái)獲取文檔,同理,我們也可以將其更換為?DELETE?來(lái)刪除這個(gè)文檔,HEAD?是用來(lái)查詢這個(gè)文檔是否存在的。如果你想替換一個(gè)已經(jīng)存在的文檔,你只需要使用?PUT再次發(fā)出請(qǐng)求即可。


    簡(jiǎn)易搜索

    GET?命令真的相當(dāng)簡(jiǎn)單,你只需要告訴它你要什么即可。接下來(lái),我們來(lái)試一下稍微復(fù)雜一點(diǎn)的搜索。

    我們首先要完成一個(gè)最簡(jiǎn)單的搜索命令來(lái)搜索全部員工:

    GET /megacorp/employee/_search

    你可以發(fā)現(xiàn)我們正在使用?megacorp?索引,employee?類型,但是我們我們并沒(méi)有指定文檔的ID,我們現(xiàn)在使用的是?_search?端口。你可以再返回的?hits?中發(fā)現(xiàn)我們錄入的三個(gè)文檔。搜索會(huì)默認(rèn)返回最前的10個(gè)數(shù)值。

    {"took": 6,"timed_out": false,"_shards": { ... }, "hits": { "total": 3, "max_score": 1, "hits": [ { "_index": "megacorp", "_type": "employee", "_id": "3", "_score": 1, "_source": { "first_name": "Douglas", "last_name": "Fir", "age": 35, "about": "I like to build cabinets", "interests": [ "forestry" ] } }, { "_index": "megacorp", "_type": "employee", "_id": "1", "_score": 1, "_source": { "first_name": "John", "last_name": "Smith", "age": 25, "about": "I love to go rock climbing", "interests": [ "sports", "music" ] } }, { "_index": "megacorp", "_type": "employee", "_id": "2", "_score": 1, "_source": { "first_name": "Jane", "last_name": "Smith", "age": 32, "about": "I like to collect rock albums", "interests": [ "music" ] } } ] } }

    注意:反饋值中不僅會(huì)告訴你匹配到哪些文檔,同時(shí)也會(huì)把這個(gè)文檔都會(huì)包含到其中:我們需要搜索的用戶的所有信息。

    接下來(lái),我們將要嘗試著實(shí)現(xiàn)搜索一下哪些員工的姓氏中包含?Smith。為了實(shí)現(xiàn)這個(gè),我們需要使用一種輕量的搜索方法。這種方法經(jīng)常被稱做?查詢字符串(query string)?搜索,因?yàn)槲覀兺ㄟ^(guò)URL來(lái)傳遞查詢的關(guān)鍵字:

    GET /megacorp/employee/_search?q=last_name:Smith

    我們依舊使用?_search?端口,然后可以將參數(shù)傳入給?q=。這樣我們就可以得到姓Smith的結(jié)果:

    {..."hits": {"total": 2,"max_score": 0.30685282, "hits": [ { ... "_source": { "first_name": "John", "last_name": "Smith", "age": 25, "about": "I love to go rock climbing", "interests": [ "sports", "music" ] } }, { ... "_source": { "first_name": "Jane", "last_name": "Smith", "age": 32, "about": "I like to collect rock albums", "interests": [ "music" ] } } ] } }

    使用Query DSL搜索

    查詢字符串是通過(guò)命令語(yǔ)句完成?點(diǎn)對(duì)點(diǎn)(ad hoc)?的搜索,但是這也有它的局限性(可參閱《搜索局限性》章節(jié))。Elasticsearch 提供了更加豐富靈活的查詢語(yǔ)言,它被稱作?Query DSL,通過(guò)它你可以完成更加復(fù)雜、強(qiáng)大的搜索任務(wù)。

    DSL (Domain Specific Language?領(lǐng)域特定語(yǔ)言) 需要使用 JSON 作為主體,我們還可以這樣查詢姓 Smith 的員工:

    GET /megacorp/employee/_search {"query" : {"match" : {"last_name" : "Smith"}} }

    這個(gè)請(qǐng)求會(huì)返回同樣的結(jié)果。你會(huì)發(fā)現(xiàn)我們?cè)谶@里沒(méi)有使用?查詢字符串,而是使用了一個(gè)由 JSON 構(gòu)成的請(qǐng)求體,其中使用了?match?查詢法,隨后我們還將會(huì)學(xué)習(xí)到其他的查詢類型。

    更加復(fù)雜的搜索

    接下來(lái),我們?cè)偬岣咭稽c(diǎn)兒搜索的難度。我們依舊要尋找出姓 Smith 的員工,但是我們還將添加一個(gè)年齡大于30歲的限定條件。我們的查詢語(yǔ)句將會(huì)有一些細(xì)微的調(diào)整來(lái)以識(shí)別結(jié)構(gòu)化搜索的限定條件?filter(過(guò)濾器):

    GET /megacorp/employee/_search {"query" : {"filtered" : {"filter" : {"range" : {"age" : { "gt" : 30 } <1> } }, "query" : { "match" : { "last_name" : "Smith" <2> } } } } }
  • 這一部分的語(yǔ)句是?range?filter?,它可以查詢所有超過(guò)30歲的數(shù)據(jù) --?gt?代表?greater than (大于)

  • 這一部分我們前一個(gè)操作的?match?query?是一樣的

  • 先不要被這么多的語(yǔ)句嚇到,我們將會(huì)在之后帶你逐漸了解他們的用法。你現(xiàn)在只需要知道我們添加了一個(gè)filter,可以在?match?的搜索基礎(chǔ)上再來(lái)實(shí)現(xiàn)區(qū)間搜索。現(xiàn)在,我們的只會(huì)顯示32歲的名為Jane Smith的員工了:

    {..."hits": {"total": 1,"max_score": 0.30685282, "hits": [ { ... "_source": { "first_name": "Jane", "last_name": "Smith", "age": 32, "about": "I like to collect rock albums", "interests": [ "music" ] } } ] } }

    全文搜索

    上面的搜索都很簡(jiǎn)單:名字搜索、通過(guò)年齡過(guò)濾。接下來(lái)我們來(lái)學(xué)習(xí)一下更加復(fù)雜的搜索,全文搜索——一項(xiàng)在傳統(tǒng)數(shù)據(jù)庫(kù)很難實(shí)現(xiàn)的功能。 我們將會(huì)搜索所有喜歡?rock climbing?的員工:

    GET /megacorp/employee/_search {"query" : {"match" : {"about" : "rock climbing"}} }

    你會(huì)發(fā)現(xiàn)我們同樣使用了?match?查詢來(lái)搜索?about?字段中的?rock climbing。我們會(huì)得到兩個(gè)匹配的文檔:

    {..."hits": {"total": 2,"max_score": 0.16273327, "hits": [ { ... "_score": 0.16273327, <1> "_source": { "first_name": "John", "last_name": "Smith", "age": 25, "about": "I love to go rock climbing", "interests": [ "sports", "music" ] } }, { ... "_score": 0.016878016, <1> "_source": { "first_name": "Jane", "last_name": "Smith", "age": 32, "about": "I like to collect rock albums", "interests": [ "music" ] } } ] } }
  • 相關(guān)評(píng)分
  • 通常情況下,Elasticsearch 會(huì)通過(guò)相關(guān)性來(lái)排列順序,第一個(gè)結(jié)果中,John Smith 的?about?字段中明確地寫到?rock climbing。而在 Jane Smith 的?about?字段中,提及到了?rock,但是并沒(méi)有提及到?climbing,所以后者的?_score?就要比前者的低。

    這個(gè)例子很好地解釋了 Elasticsearch 是如何執(zhí)行全文搜索的。對(duì)于 Elasticsearch 來(lái)說(shuō),相關(guān)性的概念是很重要的,而這也是它與傳統(tǒng)數(shù)據(jù)庫(kù)在返回匹配數(shù)據(jù)時(shí)最大的不同之處。

    段落搜索

    能夠找出每個(gè)字段中的獨(dú)立單詞固然很好,但是有的時(shí)候你可能還需要去匹配精確的短語(yǔ)或者?段落。例如,我們只需要查詢到?about?字段只包含?rock climbing?的短語(yǔ)的員工。

    為了實(shí)現(xiàn)這個(gè)效果,我們將對(duì)?match?查詢變?yōu)?match_phrase?查詢:

    GET /megacorp/employee/_search {"query" : {"match_phrase" : {"about" : "rock climbing"}} }

    這樣,系統(tǒng)會(huì)沒(méi)有異議地返回 John Smith 的文檔:

    {..."hits": {"total": 1,"max_score": 0.23013961, "hits": [ { ... "_score": 0.23013961, "_source": { "first_name": "John", "last_name": "Smith", "age": 25, "about": "I love to go rock climbing", "interests": [ "sports", "music" ] } } ] } }

    高亮我們的搜索

    很多程序希望能在搜索結(jié)果中?高亮?匹配到的關(guān)鍵字來(lái)告訴用戶這個(gè)文檔是?如何?匹配他們的搜索的。在 Elasticsearch 中找到高亮片段是非常容易的。

    讓我們回到之前的查詢,但是添加一個(gè)?highlight?參數(shù):

    GET /megacorp/employee/_search {"query" : {"match_phrase" : {"about" : "rock climbing"}},"highlight": { "fields" : { "about" : {} } } }

    當(dāng)我們運(yùn)行這個(gè)查詢后,相同的命中結(jié)果會(huì)被返回,但是我們會(huì)得到一個(gè)新的名叫?highlight?的部分。在這里包含了?about?字段中的匹配單詞,并且會(huì)被?<em></em>?HTML字符包裹住:

    {..."hits": {"total": 1,"max_score": 0.23013961, "hits": [ { ... "_score": 0.23013961, "_source": { "first_name": "John", "last_name": "Smith", "age": 25, "about": "I love to go rock climbing", "interests": [ "sports", "music" ] }, "highlight": { "about": [ "I love to go <em>rock</em> <em>climbing</em>" <1> ] } } ] } }
  • 在原有文本中高亮關(guān)鍵字。
  • 1.7 匯總

    統(tǒng)計(jì)

    最后,我們還有一個(gè)需求需要完成:可以讓老板在職工目錄中進(jìn)行統(tǒng)計(jì)。Elasticsearch 把這項(xiàng)功能稱作?匯總 (aggregations),通過(guò)這個(gè)功能,我們可以針對(duì)你的數(shù)據(jù)進(jìn)行復(fù)雜的統(tǒng)計(jì)。這個(gè)功能有些類似于 SQL 中的GROUP BY,但是要比它更加強(qiáng)大。

    例如,讓我們找一下員工中最受歡迎的興趣是什么:

    GET /megacorp/employee/_search {"aggs": {"all_interests": {"terms": { "field": "interests" } } } }

    請(qǐng)忽略語(yǔ)法,讓我們先來(lái)看一下結(jié)果:

    {..."hits": { ... },"aggregations": {"all_interests": {"buckets": [{"key": "music", "doc_count": 2 }, { "key": "forestry", "doc_count": 1 }, { "key": "sports", "doc_count": 1 } ] } } }

    我們可以發(fā)現(xiàn)有兩個(gè)員工喜歡音樂(lè),還有一個(gè)喜歡森林,還有一個(gè)喜歡運(yùn)動(dòng)。這些數(shù)據(jù)并沒(méi)有被預(yù)先計(jì)算好,它們是在文檔被查詢的同時(shí)實(shí)時(shí)計(jì)算得出的。如果你想要查詢姓 Smith 的員工的興趣匯總情況,你就可以執(zhí)行如下查詢:

    GET /megacorp/employee/_search {"query": {"match": {"last_name": "smith"}},"aggs": { "all_interests": { "terms": { "field": "interests" } } } }

    這樣,all_interests?的統(tǒng)計(jì)結(jié)果就只會(huì)包含滿足查詢的文檔了:

    ..."all_interests": {"buckets": [{"key": "music","doc_count": 2 }, { "key": "sports", "doc_count": 1 } ] }

    匯總還允許多個(gè)層面的統(tǒng)計(jì)。比如我們還可以統(tǒng)計(jì)每一個(gè)興趣下的平均年齡:

    GET /megacorp/employee/_search {"aggs" : {"all_interests" : {"terms" : { "field" : "interests" }, "aggs" : { "avg_age" : { "avg" : { "field" : "age" } } } } } }

    雖然這次返回的匯總結(jié)果變得更加復(fù)雜了,但是它依舊很容易理解:

    ..."all_interests": {"buckets": [{"key": "music","doc_count": 2, "avg_age": { "value": 28.5 } }, { "key": "forestry", "doc_count": 1, "avg_age": { "value": 35 } }, { "key": "sports", "doc_count": 1, "avg_age": { "value": 25 } } ] }

    在這個(gè)豐富的結(jié)果中,我們不但可以看到興趣的統(tǒng)計(jì)數(shù)據(jù),還能針對(duì)不同的興趣來(lái)分析喜歡這個(gè)興趣的平均年齡。

    即使你現(xiàn)在還不能很好地理解語(yǔ)法,但是相信你還是能發(fā)現(xiàn),用這個(gè)功能來(lái)實(shí)現(xiàn)如此復(fù)雜的統(tǒng)計(jì)工作是這樣的簡(jiǎn)單。你的極限取決于你存入了什么樣的數(shù)據(jù)喲!

    1.8 小結(jié)?

    希望上面的幾個(gè)小教程可以很好地向你解釋 Elasticsearch 可以實(shí)現(xiàn)什么功能。為了保持教程簡(jiǎn)短,這里只提及了一些基礎(chǔ),除此之外還有很多功能,比如建議、地理定位、過(guò)濾、模糊以及部分匹配等。但是相信你也發(fā)現(xiàn)了,在這里你只需要很簡(jiǎn)單的操作就可以完成復(fù)雜的操作。無(wú)需配置,添加數(shù)據(jù)就可以開始搜索!

    可能前面有一些語(yǔ)法會(huì)讓你覺(jué)得很難理解,你可能對(duì)如何調(diào)整優(yōu)化它們還有很多疑問(wèn)。那么,本書之后的章節(jié)將會(huì)幫助你逐步解開疑問(wèn),讓你對(duì) Elasticsearch 是如何工作的有一個(gè)全面的了解。

    1.9 分布式

    分布式特性

    在最開始的章節(jié)中,我們?cè)?jīng)提到 Elasticsearch 可以被擴(kuò)展到上百臺(tái)(甚至上千臺(tái))服務(wù)器上,來(lái)處理PB級(jí)別的數(shù)據(jù)。我們的教程只提及了如何使用它,但是并沒(méi)有提及到服務(wù)器方面的內(nèi)容。Elasticsearch 是自動(dòng)分布的,它在設(shè)計(jì)時(shí)就考慮到可以隱藏分布操作的復(fù)雜性。

    Elasticsearch 的分布式部分很簡(jiǎn)單。你甚至不需要關(guān)于分布式系統(tǒng)的任何內(nèi)容,比如分片、集群、發(fā)現(xiàn)等成堆的分布式概念。你可能在你的筆記本中運(yùn)行著剛才的教程,如果你想在一個(gè)擁有100個(gè)節(jié)點(diǎn)的集群中運(yùn)行教程,你會(huì)發(fā)現(xiàn)操作是完全一樣的。

    Elasticsearch 很努力地在避免復(fù)雜的分布式系統(tǒng),很多操作都是自動(dòng)完成的:

      • 可以將你的文檔分區(qū)到不同容器或者?分片?中,這些文檔可能被存在一個(gè)節(jié)點(diǎn)或者多個(gè)節(jié)點(diǎn)。
      • 跨節(jié)點(diǎn)平衡集群中節(jié)點(diǎn)間的索引與搜索負(fù)載。
      • 自動(dòng)復(fù)制你的數(shù)據(jù)以提供冗余副本,防止硬件錯(cuò)誤導(dǎo)致數(shù)據(jù)丟失。
      • 自動(dòng)在節(jié)點(diǎn)之間路由,以幫助你找到你想要的數(shù)據(jù)。
      • 無(wú)縫擴(kuò)展或者恢復(fù)你的集群。

    當(dāng)你在閱讀這本書時(shí),你會(huì)發(fā)現(xiàn)到有關(guān) Elasticsearch 的分布式特性分布式特性的補(bǔ)充章節(jié)。在這些章節(jié)中你會(huì)了解到如何擴(kuò)展集群以及故障轉(zhuǎn)移(《分布式集群》),如何處理文檔存儲(chǔ)(《分布式文檔》),如何執(zhí)行分布式搜索(《分布式搜索》)

    這一部分不是必須要看的——你不懂它們也能正常使用 Elasticsearch。但是幫助你更加全面完整地了解 Elasticsearch。你也可以在之后需要的時(shí)候再回來(lái)翻閱它們。

    1.10 本章總結(jié)

    到目前為止,你應(yīng)該已經(jīng)知道 Elasticsearch 可以實(shí)現(xiàn)哪些功能,入門上手是非常簡(jiǎn)單的。只需要最少的知識(shí)和配置就可以開始使用 Elasticsearch 也是它的追求。學(xué)習(xí) Elasticsearch 最好的方法就是開始使用它:進(jìn)行的檢索與搜索吧!

    當(dāng)然,學(xué)得越多,你的生產(chǎn)力就越高。你也就能對(duì)特定的內(nèi)容進(jìn)行微調(diào),得到更適合你的結(jié)果。

    之后的章節(jié),我們將會(huì)引領(lǐng)你從新手晉級(jí)到專家。每一個(gè)章節(jié)都會(huì)解釋一個(gè)要點(diǎn),同時(shí)我們也會(huì)提供專家級(jí)別的小提示。如果你只是剛剛起步,這些提示可能并不是很適合你。Elasticsearch 會(huì)在一開始設(shè)置很多合理的默認(rèn)值。你可以在需要提升性能的時(shí)候再重新回顧它們。

    一個(gè)菜鳥程序員的成長(zhǎng)之路:http://kenwang.site/BasePage/About
    from:?http://www.cnblogs.com/Wolfmanlq/p/5984376.html

    總結(jié)

    以上是生活随笔為你收集整理的Elasticsearch 教程--入门的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。