ç¶ããæ¸ãã¾ããã
Rubyã§ãã ã®Arrayã ã¨æã£ã¦ã»ã»ã®ç¶ãã§ããæ£æä¸ã«æ´åãã¦gemåãã¾ããã
GrnMini
- Groonga(Rroonga)ãç°¡åã«ä½¿ããããã«ã©ãããããã®ã§ãã
- ã«ã©ã æå®ä¸è¦ã§ãã¼ã¿ã追å ãããã¨ãåºæ¥ã¾ãã
- æ°¸ç¶åãé«åº¦ãªæ¤ç´¢ã¯ã¨ãªãã½ã¼ããã°ã«ã¼ãå(ããªã«ãã¦ã³)ãã¹ããããããã¼ã¸ãã¼ã·ã§ã³ãªã©ãç°¡åã«ä½¿ããã¨ãåºæ¥ã¾ãã
- æ¤ç´¢ã¨ã³ã¸ã³ãããã«ä½ãã¾ãã
ã¤ã³ã¹ãã¼ã«
$ gem install grn_mini
åºæ¬çãªä½¿ãæ¹
å®ä½ã¯Rroongaã®èãã©ããã¼ã§ããé£ãããã¨ãèããã«ä½¿ãããã工夫ãã¦ãã¾ãã
require 'grn_mini' array = GrnMini::Array.new("test.db")
åãã¦ãã¼ã¿ã追å ããæã«ã«ã©ã 種é¡ã顿¨ãã¦ä½æãã¾ãã追å ãããã¼ã¿ãæååã®æã¯åããã¦å ¨ææ¤ç´¢ç¨ã®è»¢ç½®ã¤ã³ããã¯ã¹ãè²¼ãã¾ãã
array.add(text: "aaa", number: 1)
以å¾ã¯åãã«ã©ã 種é¡ã®ãã¼ã¿ã追å åºæ¥ãããã«ãªãã¾ãããã¼ã¿ã®è¿½å ã¯<<
ã§ãå¯è½ã§ãã
array << {text: "bbb", number: 2} array << {text: "ccc", number: 3} array.size #=> 3
ãã§ã«ä½ææ¸ã¿ã®ãã¼ã¿ãã¼ã¹ãéããã¨ãåºæ¥ã¾ãã
require 'grn_mini' array = GrnMini::Array.new("test.db") array.size #=> 3
GrnMini::Array#tmpdb
ã使ãã¨ãã³ãã©ãªãã¼ã¿ãã¼ã¹ãä½æåºæ¥ã¾ãã(ãã¹ãã«ä¾¿å©ã§ã)
GrnMini::Array.tmpdb do |array| array << {text: "aaa", number: 1} array << {text: "bbb", number: 2} array << {text: "ccc", number: 3} end # 䏿çãªãã¼ã¿ãã¼ã¹ãåé¤ããã
ãã¼ã¿ç¨®é¡
æååãæ´æ°ãå°æ°ãæéãä»ã®æå¯¾å¿æ¸ã¿ã§ãã
GrnMini::Array.tmpdb do |array| array << {filename: "a.txt", int: 1, float: 1.5, time: Time.at(1999)} array << {filename: "b.doc", int: 2, float: 2.5, time: Time.at(2000)} # ShortText array[1].filename #=> "a.txt" array[2].filename #=> "b.doc" # Int32 array[1].int #=> 1 array[2].int #=> 2 # Float array[1].float #=> 1.5 array[2].float #=> 2.5 # Time array[1].time #=> 1999-01-01 array[2].time #=> 2000-01-01 end
8.4. ãã¼ã¿å â Groonga documentation ãåèã«ãã¦ä¸ããã
ã¬ã³ã¼ãæä½
追å
require 'grn_mini' array = GrnMini::Array.new("test2.db") array << {name:"Tanaka", age: 11, height: 162.5} array << {name:"Suzuki", age: 31, height: 170.0}
èªã¿è¾¼ã¿
record = array[1] # Read from id (> 0) record.id #=> 1
ã«ã©ã åã¨åãååã®é¢æ°ã§ã¢ã¯ã»ã¹åºæ¥ã¾ãã
record.name #=> "Tanaka record.age #=> 11 record.height #=> 162.5
Groonga::Record#attributes
ããããã°ã«ä¾¿å©ã§ããçã®Rroongaã§ã使ãã¾ãã
record.attributes #=> {"_id"=>1, "age"=>11, "height"=>162.5, "name"=>"Tanaka"}
æ´æ°
array[2].name = "Hayashi" array[2].attributes #=> {"_id"=>2, "age"=>31, "height"=>170.0, "name"=>"Hayashi"}
åé¤
IDãæ¸¡ãã¦åé¤ãã¾ãã
array.delete(1) # It returns 'nil' value when you access a deleted record array[1].attributes #=> {"_id"=>1, "age"=>0, "height"=>0.0, "name"=>nil} # Can't see deleted records if access from Enumerable array.first.id #=> 2 array.first.attributes #=> {"_id"=>2, "age"=>31, "height"=>170.0, "name"=>"Hayashi"}
ãããã¯ã渡ãã¦åé¤ãããã¨ãåºæ¥ã¾ãã
GrnMini::Array.tmpdb do |array| array << {name:"Tanaka", age: 11, height: 162.5} array << {name:"Suzuki", age: 31, height: 170.0} array << {name:"Hayashi", age: 20, height: 165.0} array.delete do |record| record.age <= 20 end array.size #=> 1 array.first.attributes #=> {"_id"=>2, "age"=>31, "height"=>170.0, "name"=>"Suzuki"} end
æ¤ç´¢
çæãããã¼ãã«ã®æ¤ç´¢ã«ã¯GrnMini::Array#select
ã使ãã¾ããç¹ã«æå®ããªãå ´åã¯:text
ã«ã©ã ã:default_column
æå®ããã¾ãã
GrnMini::Array.tmpdb do |array| array << {text:"aaa", number:1} array << {text:"bbb", number:20} array << {text:"bbb ccc", number:2} array << {text:"bbb", number:15} array << {text:"ccc", number:3} results = array.select("aaa") results.map {|record| record.attributes} #=> [{"_id"=>1, "_key"=>{"_id"=>1, "number"=>1, "text"=>"aaa"}, "_score"=>1}] # ANDæ¤ç´¢ results = array.select("bbb ccc") results.map {|record| record.attributes} #=> [{"_id"=>2, "_key"=>{"_id"=>3, "number"=>2, "text"=>"bbb ccc"}, "_score"=>2}] # ã«ã©ã æå® results = array.select("bbb number:<10") results.map {|record| record.attributes} #=> [{"_id"=>2, "_key"=>{"_id"=>3, "number"=>2, "text"=>"bbb ccc"}, "_score"=>2}] # AND, OR, ã°ã«ã¼ãã³ã° results = array.select("bbb (number:<= 10 OR number:>=20)") results.map {|record| record.attributes} #=> [{"_id"=>2, "_key"=>{"_id"=>3, "number"=>2, "text"=>"bbb ccc"}, "_score"=>2}, {"_id"=>4, "_key"=>{"_id"=>2, "number"=>20, "text"=>"bbb"}, "_score"=>2}] # NOT results = array.select("bbb - ccc") results.map {|record| record.attributes} #=> [{"_id"=>1, "_key"=>{"_id"=>2, "number"=>20, "text"=>"bbb"}, "_score"=>1}, {"_id"=>3, "_key"=>{"_id"=>4, "number"=>15, "text"=>"bbb"}, "_score"=>1}] end
以ä¸ã¯ :default_column
ã :filename
ã«å¤æ´ããä¾ã§ãã
GrnMini::Array.tmpdb do |array| array << {text: "txt", filename:"a.txt"} array << {text: "txt", filename:"a.doc"} array << {text: "txt", filename:"a.rb"} # ã«ã©ã æå®ããå ´å results = array.select("filename:@txt") results.first.attributes #=> {"_id"=>1, "_key"=>{"_id"=>1, "filename"=>"a.txt", "text"=>"txt"}, "_score"=>1} # ããã©ã«ãã«ã©ã ã夿´ããå ´å results = array.select("txt", default_column: "filename") results.first.attributes #=> {"_id"=>1, "_key"=>{"_id"=>1, "filename"=>"a.txt", "text"=>"txt"}, "_score"=>1} end
ãããªãæ å ±ã¯ 8.10.1. ã¯ã¨ãªã¼æ§æ, Groonga::Table#select ãåèã«ãã¦ä¸ããã
Groongaã®ã¯ã¨ãªã¼æ§æã¯ããªãå å®ãã¦ããã®ã§ããªãã¡ã¬ã³ã¹ããã¥ã¢ã«ãèªãã°ãããããã¨ã¯ä¸éãåºæ¥ãã®ã§ã¯ãªããã¨æãã¾ãã
ãã®ä»ã®æ©è½
README.mdãã©ããã
ã½ã¼ããã°ã«ã¼ãã³ã°ãã¹ããããããã¼ã¸ãã¼ã·ã§ã³ãªã©æ¤ç´¢ã¨ã³ã¸ã³ãä½ãã®ã«å¿ è¦ãªæ©è½ã¯ä¸éãæã£ã¦ãã¾ãã
ä½ã£ãçµç·¯
ã»ãã³ã¤ã¬ãã³ã®ã³ã¼ãã¼ãå»å¹´ä¸çªã®ãããååã ããã§ãããå®¶ã«ã³ã¼ãã¼ã®ããªããã»ãããããã®ã§ãããªã«å©ç¨ãããã¨ã¯ç¡ãã®ã§ããã話ãèãã¨ããã¾ã§ããã®ã¯é¢åã ãã©100åã§ç¾å³ããã³ã¼ãã¼ã飲ããã¨ããã®ããããã®ç§è¨£ãããã§ãã確ãã«ããªãããããè±ãæ½ãã®ã¯çµæ§é¢åã§ãã(æãå®¶ã«ãé¢åãªæç¨ã®ã¤ã³ã¹ã¿ã³ãã³ã¼ãã¼ãããã¾ããæ¬æ«è»¢åã§ããã»ã»)
ããªãããè±ãæ½ããªã©ã¯ã³ã¼ãã¼ãç¾å³ããé£²ãæ¹æ³ã¨ãã¦ã¯ãããåå¿è åãã§ããããã«ç¾å³ãã飲ã¿ãããã°èªå®¶çç ãã¨ã¹ãã¬ãã½ãã·ã³ãªã©ãããã§ãããã®ã§ããæéã¨ãéãã©ãã©ãå¢ãã¾ãã究極ã«ç¾å³ããã³ã¼ãã¼ãé£²ãæ¹æ³ã大åã§ããã誰ã§ãç°¡åã«ç¾å³ããã³ã¼ãã¼ã飲ããããã®ä»çµã¿ã大åã ã¨æãã®ã§ãã
é·ãåç½®ãããã£ã¦ãããããæ¬é¡ãªã®ã§ãããRroongaã¨ããå ¨ææ¤ç´¢ã¨ã³ã¸ã³ããã£ã¦ãæ¥æ¬èªã®æ¤ç´¢ã«å¼·ãã¦ãã¹ãã¬ã¼ã¸ã¨ãã¦ã使ãã¦ãæ¥æ¬èªã®æ å ±ãå¤ãã¦æç¨ãã¦ãã¾ããããããã£ã¨ç°¡åã«ãããããã®äººã«ä½¿ã£ã¦ãããããã¦GrnMiniãä½ãã¾ããã
ç¹ã«ã«ã©ã ã¹ãã¢ç³»ã®ãã¼ã¿ãã¼ã¹ã§ã¯ãã«ã©ã ã®åç¨®é¡æå®ã¨å ¨ææ¤ç´¢ç¨ã®è»¢ç½®ã¤ã³ããã¯ã¹ãæ ¼ç´ããããã®ãã¼ãã«ã®ä½æãåå¿è ã«ã¨ã£ã¦ã¯è¤éã§é£ããã§ããéã«è¨ãã°ãããèªååãããã°æè¿æµè¡ã£ã¦ããKVSã¨ãããªã«å¤ããã使ããã®ã§ã¯ãªããã¨æã£ã¦ãã¾ãã
GrnMiniã使ãã¨é åã¨åãæè¦ã§é«éãªå ¨ææ¤ç´¢ã®æ©æµãåãããã¨ãåºæ¥ã¾ããèãã©ããã¼ãªã®ã§çã®Rroongaã®æ©è½ãç´æ¥ä½¿ãã®ãç°¡åã§ããæ¯é使ã£ã¦ã¿ã¦ææ³ããèããä¸ããã