Elasticsearch 持久化 Persistence

Neil Zhu衬潦,簡書ID Not_GOD斤蔓,University AI 創(chuàng)始人 & Chief Scientist,致力于推進世界人工智能化進程镀岛。制定并實施 UAI 中長期增長戰(zhàn)略和目標(biāo)弦牡,帶領(lǐng)團隊快速成長為人工智能領(lǐng)域最專業(yè)的力量。
作為行業(yè)領(lǐng)導(dǎo)者漂羊,他和UAI一起在2014年創(chuàng)建了TASA(中國最早的人工智能社團), DL Center(深度學(xué)習(xí)知識中心全球價值網(wǎng)絡(luò))驾锰,AI growth(行業(yè)智庫培訓(xùn))等,為中國的人工智能人才建設(shè)輸送了大量的血液和養(yǎng)分走越。此外椭豫,他還參與或者舉辦過各類國際性的人工智能峰會和活動,產(chǎn)生了巨大的影響力旨指,書寫了60萬字的人工智能精品技術(shù)內(nèi)容赏酥,生產(chǎn)翻譯了全球第一本深度學(xué)習(xí)入門書《神經(jīng)網(wǎng)絡(luò)與深度學(xué)習(xí)》,生產(chǎn)的內(nèi)容被大量的專業(yè)垂直公眾號和媒體轉(zhuǎn)載與連載谆构。曾經(jīng)受邀為國內(nèi)頂尖大學(xué)制定人工智能學(xué)習(xí)規(guī)劃和教授人工智能前沿課程裸扶,均受學(xué)生和老師好評。

elasticsearch-persistence Rubygem 提供了 Ruby domain 對象的持久層搬素。
它支持兩個設(shè)計模式來集成你的對象:repositoryactive record呵晨。

Repository

Elasticsearch::Persistence::Repository 模塊提供了一個 repository 模式的實現(xiàn),可以進行保存蔗蹋、刪除何荚、尋找和搜索存儲在 Elasticsearch 中的對象,并對索引的映射和設(shè)置進行配置猪杭。

簡介特性

  • Elasticsearch 的客戶端訪問
  • 設(shè)置索引名稱、文檔類型和反序列化的對象類
  • 為索引復(fù)合映射和設(shè)置
  • 創(chuàng)建妥衣、刪除和刷新索引
  • 尋找或者搜索文檔
  • 提供對 domain 對象和搜索返回結(jié)果的訪問
  • 提供對搜索結(jié)果(聚合皂吮、總共……)的 Elasticsearch 響應(yīng)的訪問
  • 定義了序列化和反序列化的方法

使用

讓我們看看簡單的老的 Ruby 對象(PORO):

class Note
  attr_reader :attributes

  def initialize(attributes={})
    @attributes = attributes
  end

  def to_hash
    @attributes
  end
end

現(xiàn)在創(chuàng)建一個默認的,空白的 repository税手,作為第一步:

require 'elasticsearch/persistence'
repository = Elasticsearch::Persistence::Repository.new

我們可以保存 Note 實例到 repository 中蜂筹,然后查找、搜索芦倒、刪除它:

note = Note.new id: 1, text: 'Test'

repository.save(note)
# PUT http://localhost:9200/repository/note/1
# > {"id":1,"text":"Test"}
# < {"_index":"repository","_type":"note","_id":"1","_version":1,"created":true}

n = repository.find(1)
# GET http://localhost:9200/repository/_all/1
# < {"_index":"repository","_type":"note","_id":"1","_version":2,"found":true, "_source" : {"id":1,"text":"Test"}}
=> <Note:0x007fcbfc0c4980 @attributes={"id"=>1, "text"=>"Test"}>

repository.search(query: { match: { text: 'test' } }).first
# GET http://localhost:9200/repository/_search
# > {"query":{"match":{"text":"test"}}}
# < {"took":2, ... "hits":{"total":1, ... "hits":[{ ... "_source" : {"id":1,"text":"Test"}}]}}
=> <Note:0x007fcbfc1c7b70 @attributes={"id"=>1, "text"=>"Test"}>

repository.delete(note)
# DELETE http://localhost:9200/repository/note/1
# < {"found":true,"_index":"repository","_type":"note","_id":"1","_version":3}
=> {"found"=>true, "_index"=>"repository", "_type"=>"note", "_id"=>"1", "_version"=>2}

repository 模塊提供了一些特性和便利方式來配置和定制行為艺挪,以及對擴展自身和定制的 repository 類的支持。

參考documentation查看更多信息兵扬。

同樣麻裳,檢查example application展示了使用 repository 觀點來進行持久化的方法口蝠。

Active Record

Elasticsearch::Persistence::Model 模塊提供了一個 Active record 的設(shè)計模式,并帶有一個常見的接口來使用 Elasticsearch 作為 Rails 應(yīng)用的持久層津坑。模型和 Rails 的規(guī)范和幫助都是合拍的妙蔗,例如 url_for

所有的方法都有易懂的例子疆瑰,online可以查看眉反。

特性

  • 來自 ActiveRecords 的持久化方法的熟悉的接口
  • 比如 validation 和 callbacks 這樣的共同的模型特性
  • 定義模型屬性的方法,包含 Elasticsearch 映射
  • 支持 bulk 獲取數(shù)據(jù)(find_in_batches, find_each
  • 輔助的搜索結(jié)果易用性穆役,模型實例和元數(shù)據(jù)(如高亮或者聚合)
  • 易用的頂層的 gateway 和 client

使用

將 persistence 使用 require 語句加入到 Gemfile:

gem "elasticsearch-persistence", require: 'elasticsearch/persistence/model'

可以包含模塊到一個正常的 Ruby 類中寸五,設(shè)置屬性、映射等等:

class Article
  include Elasticsearch::Persistence::Model

  # Define a plain `title` attribute
  #
  attribute :title,  String

  # Define an `author` attribute, with multiple analyzers for this field
  #
  attribute :author, String, mapping: { fields: {
                               author: { type: 'string'},
                               raw:    { type: 'string', analyzer: 'keyword' }
                             } }


  # Define a `views` attribute, with default value
  #
  attribute :views,  Integer, default: 0, mapping: { type: 'integer' }

  # Validate the presence of the `title` attribute
  #
  validates :title, presence: true

  # Execute code after saving the model.
  #
  after_save { puts "Successfully saved: #{self}" }
end

模型的屬性定義支持使用 Virtus RubyGem 實現(xiàn)耿币,naming播歼、validation 等等特性使用 ActiveModel RubyGem 實現(xiàn)。

屬性 validation

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末掰读,一起剝皮案震驚了整個濱河市秘狞,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蹈集,老刑警劉巖烁试,帶你破解...
    沈念sama閱讀 222,681評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異拢肆,居然都是意外死亡减响,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,205評論 3 399
  • 文/潘曉璐 我一進店門郭怪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來支示,“玉大人,你說我怎么就攤上這事鄙才∷毯瑁” “怎么了?”我有些...
    開封第一講書人閱讀 169,421評論 0 362
  • 文/不壞的土叔 我叫張陵攒庵,是天一觀的道長嘴纺。 經(jīng)常有香客問我,道長浓冒,這世上最難降的妖魔是什么栽渴? 我笑而不...
    開封第一講書人閱讀 60,114評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮稳懒,結(jié)果婚禮上闲擦,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好墅冷,可當(dāng)我...
    茶點故事閱讀 69,116評論 6 398
  • 文/花漫 我一把揭開白布纯路。 她就那樣靜靜地躺著,像睡著了一般俺榆。 火紅的嫁衣襯著肌膚如雪感昼。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,713評論 1 312
  • 那天罐脊,我揣著相機與錄音定嗓,去河邊找鬼。 笑死萍桌,一個胖子當(dāng)著我的面吹牛宵溅,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播上炎,決...
    沈念sama閱讀 41,170評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼恃逻,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了藕施?” 一聲冷哼從身側(cè)響起寇损,我...
    開封第一講書人閱讀 40,116評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎裳食,沒想到半個月后矛市,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,651評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡诲祸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,714評論 3 342
  • 正文 我和宋清朗相戀三年浊吏,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片救氯。...
    茶點故事閱讀 40,865評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡找田,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出着憨,到底是詐尸還是另有隱情墩衙,我是刑警寧澤,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布享扔,位于F島的核電站底桂,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏惧眠。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,211評論 3 336
  • 文/蒙蒙 一于个、第九天 我趴在偏房一處隱蔽的房頂上張望氛魁。 院中可真熱鬧,春花似錦、人聲如沸秀存。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,699評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽或链。三九已至惫恼,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間澳盐,已是汗流浹背祈纯。 一陣腳步聲響...
    開封第一講書人閱讀 33,814評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留叼耙,地道東北人腕窥。 一個月前我還...
    沈念sama閱讀 49,299評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像筛婉,于是被迫代替她去往敵國和親簇爆。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,870評論 2 361

推薦閱讀更多精彩內(nèi)容