Как распечатать инвертированный индекс, созданный elasticsearch?

Если бы я хотел получить все токены индекса, который создает elasticsearch (я использую rails elasticsearch gem), как бы я продолжайте это делать? Выполнение чего-то подобного получает только определенный набор токенов для поискового запроса:

curl -XGET 'http://localhost:9200/development_test/_analyze?text=John Smith'

Ответ 1

Вы можете объединить Scroll API с API-интерфейсом сроков, чтобы перечислять термины в инвертированном индексе:

require "elastomer/client"
require "set"

client = Elastomer::Client.new({ :url => "http://localhost:9200" })
index = "someindex"
type = "sometype"
field = "somefield"

terms = Set.new

client.scan(nil, :index => index, :type => type).each_document do |document|
  term_vectors = client.index(index).docs(type).termvector({ :fields => field, :id => document["_id"] })["term_vectors"]
  if term_vectors.key?(field)
    term_vectors[field]["terms"].keys.each do |term|
      unless terms.include?(term)
        terms << term
        puts(term)
      end
    end
  end
end

Это довольно медленно и расточительно, поскольку он выполняет HTTP-запрос _termvectors для каждого отдельного документа в индексе, содержит все термины в ОЗУ и сохраняет контекст прокрутки открытым на время перечисления. Однако это не требует другого инструмента, такого как Luke, и термины могут быть выведены из индекса.