Islands in the byte stream

Technical notes by a software engineer

Elasticsearch+Railsでフィールドがどうanalyzeされるかをドキュメントごとに見る

環境: Elasticsearch 1.7.3, elasticsearch-rails 0.1.8

ドキュメントごとにフィールドがどうanalyzeされて格納するかを管理画面に表示したいのだけど、そういう便利APIはないみたい。

そこでmappingの設定を読んで一つ一つ _analyze するユーティリティを定義することにした。 ついでに _source も表示することにした。

module Searchable
  included do
    include Elasticsearch::Model

  # ...

  def es_perform_request(method, path, params, body = nil)
    es = self.class.__elasticsearch__.client
    es.perform_request(method, "#{self.class.index_name}/#{path}", params, body).body
  end

  def es_source
    es_perform_request(:get, "#{model.document_type}/#{id}/_source", {})
  rescue => e
    Rails.logger.error(e)
    {}
  end

  # to show how Elasticsearch analyzer works for each field
  def es_analyzed
    analyzed = {}
    source = as_indexed_json
    model = self.class
    mapping = model.mapping.to_hash[model.mapping.type.to_sym]
    mapping[:properties].each do |name, setting|
      next unless setting[:analyzer]

      result = es_perform_request(:get, '_analyze', analyzer: setting[:analyzer], text: source[name])
      analyzed[name] = result['tokens'].map { |item| item['token'] }
    end
    analyzed
  rescue => e
    Rails.logger.error(e)
    {}
  end
end

See Also