1. 程式人生 > >Elasticsearch:一個方便易用的全文搜尋庫

Elasticsearch:一個方便易用的全文搜尋庫

注:本文內容均來自《Elasticsearch權威指南》,是做讀書筆記,同時做一個總結。
Elasticsearch是使用基於http的RestFul來實現和使用的,因此使用curl來測試。如果不使用curl,使用各種語言的對應http請求即可使用。

Elasticsearch

叢集包含索引,索引包含型別,型別儲存文件,文件具有屬性

能力

高可拓展、全文搜尋、分析、儲存

使用舉例

  1. 線上web商店,可支援使用者搜尋產品(儲存產品目錄、產品搜尋、補全建議)
  2. 收集執行資料、分析資料
  3. 價格預警平臺
  4. 分析、快速投資、分析、視覺化等
  5. ……

基本概念:

  1. 接近實時性的
  2. 叢集
  3. 節點:叢集中的單獨服務
  4. 索引:儲存資料到Elasticsearch的行為叫做索引
  5. 文件:最基本的可以被索引的資訊、JSON
  6. 碎片 & 副本:碎片(切分/擴充套件 內容 卷、分發 和 並行 操作)、 副本:(高可用性(當碎片或節點不可用時)、允許擴充套件搜尋卷)

使用

放入資料及搜尋

放入資料

curl -X PUT "localhost:9200/megacorp/employee/1" -H 'Content-Type: application/json' -d'
{
    "first_name" : "John",
    "last_name" :  "Smith",
    "age"
: 25, "about" : "I love to go rock climbing", "interests": [ "sports", "music" ] } '

讀取資料

curl -X GET "localhost:9200/megacorp/employee/1"

簡單搜尋

curl -X GET "localhost:9200/megacorp/employee/_search"

帶引數簡單搜尋

curl -X GET "localhost:9200/megacorp/employee/_search?q=last_name:Smith"

查詢表示式搜尋

curl -X GET "localhost:9200/megacorp/employee/_search" -H 'Content-Type: application/json' -d'
{
    "query" : {
        "match" : {
            "last_name" : "Smith"
        }
    }
}

帶過濾器的搜尋

curl -X GET "localhost:9200/megacorp/employee/_search" -H 'Content-Type: application/json' -d'
{
    "query" : {
        "bool": {
            "must": {
                "match" : {
                    "last_name" : "smith" 
                }
            },
            "filter": {
                "range" : {
                    "age" : { "gt" : 30 } 
                }
            }
        }
    }
}
'

全文搜尋
此功能即可實現相關性搜尋

curl -X GET "localhost:9200/megacorp/employee/_search" -H 'Content-Type: application/json' -d'
{
    "query" : {
        "match" : {
            "about" : "rock climbing"
        }
    }
}
'

短語搜尋
即精確搜尋,使用此搜尋模式將返回精確結果。

curl -X GET "localhost:9200/megacorp/employee/_search" -H 'Content-Type: application/json' -d'
{
    "query" : {
        "match_phrase" : {
            "about" : "rock climbing"
        }
    }
}
'

高亮搜尋
高亮顯示搜尋結果,會在搜尋結果的匹配部分以<em></em>封裝。

curl -X GET "localhost:9200/megacorp/employee/_search" -H 'Content-Type: application/json' -d'
{
    "query" : {
        "match_phrase" : {
            "about" : "rock climbing"
        }
    },
    "highlight": {
        "fields" : {
            "about" : {}
        }
    }
}
'

分析

curl -X GET "localhost:9200/megacorp/employee/_search" -H 'Content-Type: application/json' -d'
{
  "aggs": {
    "all_interests": {
      "terms": { "field": "interests" }
    }
  }
}
'

分析的同時搜尋
這種方式會匹配match欄位內的值,然後再進行分析。

curl -X GET "localhost:9200/megacorp/employee/_search" -H 'Content-Type: application/json' -d'
{
  "query": {
    "match": {
      "last_name": "smith"
    }
  },
  "aggs": {
    "all_interests": {
      "terms": {
        "field": "interests"
      }
    }
  }
}
'

聚合分級彙總
按照排序進行分級分析並彙總。

curl -X GET "localhost:9200/megacorp/employee/_search" -H 'Content-Type: application/json' -d'
{
    "aggs" : {
        "all_interests" : {
            "terms" : { "field" : "interests" },
            "aggs" : {
                "avg_age" : {
                    "avg" : { "field" : "age" }
                }
            }
        }
    }
}
'

文件控制

放入文件
其中的website是索引,blog是型別,123是id。
使用此功能也能更新文件。

curl -X PUT "localhost:9200/website/blog/123" -H 'Content-Type: application/json' -d'
{
  "title": "My first blog entry",
  "text":  "Just trying this out...",
  "date":  "2014/01/01"
}
'

因為使用上述方法,會對文件造成更新,而有時候我們並不想更新文件。所以也可以使用以下兩種方法來進行建立:

第一種方法使用 op_type 查詢 -字串引數:
PUT /website/blog/123?op_type=create
{ ... }

第二種方法是在 URL 末端使用 /_create :
PUT /website/blog/123/_create
{ ... }

這樣,在成功建立時,返回201,否則返回409衝突響應碼。
自動生成id

curl -X POST "localhost:9200/website/blog/" -H 'Content-Type: application/json' -d'
{
  "title": "My second blog entry",
  "text":  "Still trying this out...",
  "date":  "2014/01/01"
}
'

取回文件

curl -X GET "localhost:9200/website/blog/123?pretty"

檢查文件是否存在

curl -i -XHEAD http://localhost:9200/website/blog/123

刪除文件

curl -X DELETE "localhost:9200/website/blog/123"

處理併發

對於併發有兩種方式:

悲觀併發控制
這種方法被關係型資料庫廣泛使用,它假定有變更衝突可能發生,因此阻塞訪問資源以防止衝突。 一個典型的例子是讀取一行資料之前先將其鎖住,確保只有放置鎖的執行緒能夠對這行資料進行修改。

樂觀併發控制
Elasticsearch 中使用的這種方法假定衝突是不可能發生的,並且不會阻塞正在嘗試的操作。 然而,如果源資料在讀寫當中被修改,更新將會失敗。應用程式接下來將決定該如何解決衝突。 例如,可以重試更新、使用新的資料、或者將相關情況報告給使用者。

樂觀併發控制
指定版本號來修改應用。

curl -X PUT "localhost:9200/website/blog/1?version=1" -H 'Content-Type: application/json' -d'
{
  "title": "My first blog entry",
  "text":  "Starting to get the hang of this..."
}
'

通過外部系統使用版本控制

curl -X PUT "localhost:9200/website/blog/2?version=5&version_type=external" -H 'Content-Type: application/json' -d'
{
  "title": "My first external blog entry",
  "text":  "Starting to get the hang of this..."
}
'

文件的部分更新

curl -X POST "localhost:9200/website/blog/1/_update" -H 'Content-Type: application/json' -d'
{
   "doc" : {
      "tags" : [ "testing" ],
      "views": 0
   }
}
'

批量取回文件

curl -X GET "localhost:9200/_mget" -H 'Content-Type: application/json' -d'
{
   "docs" : [
      {
         "_index" : "website",
         "_type" :  "blog",
         "_id" :    2
      },
      {
         "_index" : "website",
         "_type" :  "pageviews",
         "_id" :    1,
         "_source": "views"
      }
   ]
}
'

使用預設的索引值甚至型別值,可以覆蓋

curl -X GET "localhost:9200/website/blog/_mget" -H 'Content-Type: application/json' -d'
{
   "docs" : [
      { "_id" : 2 },
      { "_type" : "pageviews", "_id" :   1 }
   ]
}
'

結論

Elasticsearch使用十分簡單方便,對於應用開發者,只需在Elasticsearch的基礎上再整合自己的應用框架,即可輕鬆使用Elasticsearch,同時Elasticsearch也可作為NoSQL的儲存方式來使用,即可以使用Elasticsearch來做儲存和資料分析、檢索等功能,實現上也非常強大。

相關推薦

Elasticsearch一個方便全文搜尋

注:本文內容均來自《Elasticsearch權威指南》,是做讀書筆記,同時做一個總結。 Elasticsearch是使用基於http的RestFul來實現和使用的,因此使用curl來測試。如果不使用curl,使用各種語言的對應http請求即可使用。 Ela

vue-lazyload 一個簡單的 Vue 圖片延遲載入外掛

介紹: vue-lazyload主要應用於圖片延遲載入。包含如下的特點: 小巧輕便,功能強大,易於使用 可以用於載入任何影象型別 支援Vue 1.0和Vue 2.0 理解圖片延遲載入: 當某個網頁中呈現的圖片較多時,由於網路等原因,訪問該網頁時,所有的圖片不會立馬全部

FineBI一個簡單的自助BI工具

過去,有關企業資料分析的重擔都壓在IT部門,傳統BI分析更多面向的是具有IT背景的人員。但隨著業務分析需求的增加,很多公司都希望為業務使用者提供自助分析服務,將分析工作落實到業務人員手中。但同時,分析工

一個簡單的Linux文字編輯器nano的安裝與使用

許多狀況下咱們都必要編纂雲主機裡的文字情節,而現時用的比力多的文字編纂器是vim,這個估量許多人都以為很難用,這邊伏筆VPS引薦一

php 一個簡單的資料庫類---Medoo

參照: https://packagist.org/packages/catfan/medoo https://medoo.in/doc php關於資料庫操作的工具類有很多, 現在介紹一種相容性較好,比較簡單,上手容易的sql類,Medoo。 對於一些小專案來說完全夠用。 使用M

pytorch一個非常好的工具檔案

在pytorch中去寫訓練函式和測試函式是一件重複的事,因此可以寫成一個總的訓練檔案。 from datetime import datetime import torch import torch.nn.functional as F from torch import nn from

AgentWeb , 一個簡潔的 Android Web

AgentWeb , 一個簡潔易用的 Android Web 庫 AgentWeb 介紹 AgentWeb 是一個高度封裝的 Android WebView ,簡單易用 , 帶有進度條 、 支援檔案上傳 、 下載 、 簡化 Javascript 通訊 ,加強 W

Java架構-蘇寧 11.11蘇寧購訂單搜尋系統架構及實現

背景 隨著蘇寧易購平臺規模的飛速發展,平臺的訂單量呈現指數級的增長,儲存容量已達 TB 級,訂單量更是到了萬億級別,尤其在雙 11 大促流量洪峰的場景下,面臨兩個挑戰: 1、如何儲存如此巨大的資料量 2、如何提供高併發、低延遲、多維度的檢索服務 傳統關係型資料庫無法支撐多維度的

ASP.NET Web API + Elasticsearch 6.x 快速做個全文搜尋

最近想做個全文搜尋,設想用 ASP.NET Web API + Elasticsearch 6.x 來實現。 網上搜了下 Elasticsearch 的資料,大部分是講 linux 平臺下如何用 java 來開發,有少量講在 windows 平臺下用 c# 開發的,且版本是 Elasti

如何實現一個簡單且可靠的訊息佇列框架?

作者:李豔鵬 編輯:Gary 訊息佇列在網際網路領域裡得到了廣泛的應用,它多應用在非同步處理、模組之間的解偶和高併發的消峰等場景,訊息佇列中表現最好的當屬Apache開源專案Kafka,Kafka使用支援高併發的Scala語言開發,利用作業系統的快取原理達到高效能,並且天生具有可分割槽,分散式的特

類描述 一個方便在多種狀態切換的view

##  多種狀態切換的view(loadingview,error,empty,content) [^code]         在佈局檔案中引入         

真正搜尋功能長什麼樣?

你知不知道有超過半數的使用者在網站中的行為由搜尋支配? 我對搜尋功能及它的價值持肯定態度,尤其是在電商網站上。它能讓我很快就能找到想要的,而不需要通過在一層層的分類列表裡翻尋。 那麼我們應該做什麼才能讓搜尋功能做得更好呢? 想象上一次去某個網站尋找某個視訊的時候,你

日記俠一個簡單執行的吸粉策略

你好,我是王剛,行走於網路江湖的“日記俠”。每天分享我的思考和經驗,希望身邊的人可以和我一樣天天寫日記,今天是王剛日記第642天。 想獲取使用者一定要有吸粉策略。 先想想你對於微課平臺是如何理解的? 我猜,很多人都是想靠這些平臺來賺錢的的。 起初,我也是這樣的想法

easyopen——一個簡單的介面開放平臺

easyopen介紹一個簡單易用的介面開放平臺,平臺封裝了常用的引數校驗、結果返回等功能,開發者只需實現業務程式碼即可。easyopen的功能類似於淘寶開放平臺,它的所有介面只提供一個url,通過引數來區分不同業務。這樣做的好處是介面url管理方便了,平臺管理者只需維護好介面引數即可。由於引數的數量是可知的,

PHPnow -- 一個方便的綠色 PHP 環境包

有了它,配置PHP環境就不用像以前那麼麻煩了~ :D PHPnow 是 Win32 下綠色免費的 Apache + PHP + MySQL 環境套件包。簡易安裝、快速搭建支援虛擬主機的 PHP 環境。附帶 PnCp.cmd 控制面板,幫助你快速配置你的套件,使用非常方便。安裝

unity中的一個簡單的A*尋路演算法類

以前專案中用到了尋路,就寫了個A*尋路的演算法類,感覺還不錯,這裡分享出來。A*演算法的原理網上有很多,這裡只簡單說一下我這個演算法的邏輯:*我的這個演算法裡面沒有關閉列表,因為我會根據地圖資料建立一個對應的節點資料的陣列,每個節點資料記錄自己當前的狀態,是開啟還是關閉的。節

分享一個簡單的python並行模組【PP模組】

目前個人計算機大都是多核的,但是在執行python程式的時候會發現實際上只有一個核心(CPU)在跑程式碼,另外幾個核心都在偷懶呢,如下圖  平行計算的目的是將所有的核心都執行起來以提高程式碼的執行速度,在python中由於存在全域性直譯器鎖(GIL)如果使用預設的python多執行緒進行平行計算可能會發現程

Intel和Nokia宣稱MeeGo將比Android更加開放且方便

   上週在波士頓舉行的一年一度的 LinuxCon會議上, Linux基金會執行理事 JimZemlin主持了一個關於基於 Linux系統的 MeeGo平臺的座談會, Nokia公司的 MeeGo系統開發主席 Thomas Miller和 Intel公司的開源工程師 De

頭像截圖上傳兩種方式(SWFUpload、一個簡單的flash外掛)

1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 2 <html xmlns="http:

一個簡單的Http訪問工具類for Android

    前言    去年(2017)參加服務外包省賽的時候,負責App開發的我遇到了一個小難題——Http請求。雖說已經有成熟的HttpUrlConnection庫供使用,但依然感到有些不方便:進行一次簡單的請求並對結果進行處理,需要敲下不少程式碼;多次請求之間其實有很多重複