0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

[010] ドキュメントを 10件だけ取得する by Ruby elasticsearch 7.14

Last updated at Posted at 2021-08-14
シリーズトップページ
https://qiita.com/robozushi10/items/2c8b6951ee342b013974

概要

Ruby の Elasticsearch Client を使って Elasticsearch 7.14 で REST API の操作する.
また、比較のために、Kibana DevTool でのクエリも合せて記しておく.

今回はインデックス「shakespeare」から「ドキュメント10件のみの取得」を行う.1

検証環境

下記の要領で検証用データ「Shakespeare」が登録された
・Elasticsearch + Kibana (7.14)
を使用した

[00] Ruby の elasticsearch client パッケージを使って Elasticsearch 7.14 を操作してみる ... 検証環境構築編

参考にした情報

URL
https://www.elastic.co/guide/en/elasticsearch/reference/current/search-search.html

実践

Kibana DevTool の場合

コード

GET shakespeare/_search
{

}

結果

image.png

Ruby の場合

コード

重要な部分は「if __FILE__ == $0 以降」である.

class MySimpleClient は丸々コピーで良い. (が、192.168.10.115 のみ、適宜読み替えること)

#!/usr/bin/env ruby
# -*- encoding: utf-8 -*-
require 'multi_json'
require 'faraday'
require 'elasticsearch/api'
require 'active_support/core_ext' #! note_0004
require 'active_support' #! note_0005

class MySimpleClient
# note_0001
  include Elasticsearch::API
  CONNECTION = ::Faraday::Connection.new url: 'http://192.168.10.115:29200'
  def perform_request(method, path, params, body, headers = nil)
    #! note_0003
    CONNECTION.run_request \
      method.downcase.to_sym,
      path_with_params(path, params),
      (body ? MultiJson.dump(body): nil),
      {'Content-Type' => 'application/json'}
  end

  private

  def path_with_params(path, params)
    return path if params.blank?

    case params
    when String
      "#{path}?#{params}"
    when Hash
      "#{path}?#{params.to_query}"
    else
      raise ArgumentError, "Cannot parse params: '#{params}'"
    end
  end
end

if __FILE__ == $0

  client = MySimpleClient.new

  q = {}
  res = client.search index: 'shakespeare', body: {}
  h = JSON.parse(res)
  pp h
end

# note_0001: https://rubydoc.info/gems/elasticsearch-api
# note_0002: https://rubydoc.info/gems/elasticsearch-api/Elasticsearch/API/Cluster/Actions#health-instance_method
# note_0003: client.cluster.health から呼び出されるので実装が必要である
# note_0004: 'active_support' を 'active_support/core_ext' に変更する.
#            APIドキュメントにある 'active_support' 指定だと次のエラーが発生してしまうためである.
#            tutorial.rb:26:in `path_with_params': undefined method `blank?' for {}:Hash (NoMethodError)
# note_0005: require 'active_support' が存在しないと次のエラーが発生してしまう.
#            /usr/local/bundle/gems/activesupport-6.0.4/lib/active_support/core_ext/object/json.rb:42:
#              in `to_json': uninitialized constant ActiveSupport::JSON (NameError)

結果

{"took"=>0,
 "timed_out"=>false,
 "_shards"=>{"total"=>1, "successful"=>1, "skipped"=>0, "failed"=>0},
 "hits"=>
  {"total"=>{"value"=>10000, "relation"=>"gte"},
   "max_score"=>1.0,
   "hits"=>
    [{"_index"=>"shakespeare",

     {"_index"=>"shakespeare",
      "_type"=>"_doc",
      "_id"=>"8",
      "_score"=>1.0,
      "_source"=>
       {"type"=>"line",
        "line_id"=>9,
        "play_name"=>"Henry IV",
        "speech_number"=>1,
        "line_number"=>"1.1.6",
        "speaker"=>"KING HENRY IV",
        "text_entry"=>"Shall daub her lips with her own childrens blood;"}},
     {"_index"=>"shakespeare",
      "_type"=>"_doc",
      "_id"=>"9",
      "_score"=>1.0,
      "_source"=>
       {"type"=>"line",
        "line_id"=>10,
        "play_name"=>"Henry IV",
        "speech_number"=>1,
        "line_number"=>"1.1.7",
        "speaker"=>"KING HENRY IV",
        "text_entry"=>"Nor more shall trenching war channel her fields,"}}]}}

検証

結果比較 DevTool vs Ruby が一致しているか?

🆗一致している模様

image.png

  1. Elasticsearch 7.14 ではデフォルト 10件しか取得しない模様

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?