Skip to content
forked from Zatvobor/tirexs

An Elixir based DSL for managing the ElasticSearch related stuff, such as indexes, scoped queries and so on.

License

Notifications You must be signed in to change notification settings

chadbean/tirexs

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

https://github.com/roundscope/tirexs Build Status

tirexs

An Elixir based DSL for operating the ElasticSearch cluster related stuff, such as indexes, scoped queries and so on.

releases:

  • v0.5.0 tested on elastisearch 1.1.1, elixir 0.13.1
  • v0.4 tested on elastisearch 0.90.3, elixir 0.12.5

Walk-through a code

Let's create an articles index:

import Tirexs.Bulk

settings = Tirexs.ElasticSearch.Config.new()

Tirexs.Bulk.store [index: "articles", refresh: true], settings do
  create id: 1, title: "One", tags: ["elixir"], type: "article"
  create id: 2, title: "Two", tags: ["elixir", "ruby"], type: "article"
  create id: 3, title: "Three", tags: ["java"], type: "article"
  create id: 4, title: "Four", tags: ["erlang"], type: "article"
end

Ability to customize the mapping for specific document type:

import Tirexs.Mapping

index = [index: "articles", type: "article"]
mappings do
  indexes "id", type: "string", index: "not_analyzed", include_in_all: false
  indexes "title", type: "string", boost: 2.0, analyzer: "snowball"
  indexes "tags",  type: "string", analyzer: "keyword"
  indexes "content", type: "string", analyzer: "snowball"
  indexes "authors", [type: "object"] do
    indexes "name", type: "string"
    indexes "nick_name", type: "string"
  end
end

{ :ok, status, body } = Tirexs.Mapping.create_resource(index)

Now, let's go further. We will be searching for articles whose title begins with letter “T”, sorted by title in descending order, filtering them for ones tagged “elixir”, and also retrieving some facets:

import Tirexs.Search

articles = search [index: "articles"] do
  query do
    string "title:T*"
  end

  filter do
    terms "tags", ["elixir", "ruby"]
  end

  facets do
    global_tags [global: true] do
      terms field: "tags"
    end

    current_tags do
      terms field: "tags"
    end
  end

  sort do
    [
      [title: "desc"]
    ]
  end
end

result = Tirexs.Query.create_resource(articles)

Enum.each result.hits, fn(item) ->
  IO.puts inspect(item)
  #=> [{"_index","articles"},{"_type","article"},{"_id","2"},{"_score",1.0},{"_source",[{"id",2}, {"title","Two"},{"tags",["elixir","r uby"]},{"type","article"}]}]
end

Let's display the global facets:

Enum.each result.facets["global_tags"]["terms"], fn(f) ->
  IO.puts "#{f["term"]}    #{f["count"]}"
end

#=> elixir  2
#=> ruby    1
#=> java    1
#=> erlang  1

Now, let's display the facets based on current query (notice that count for articles tagged with 'java' is included, even though it's not returned by our query; count for articles tagged 'erlang' is excluded, since they don't match the current query):

Enum.each result.facets["current_tags"]["terms"], fn(f) ->
  IO.puts "#{f["term"]}    #{f["count"]}"
end

#=> ruby    1
#=> java    1
#=> elixir  1

License

Tirexs source code is released under Apache 2 License. Check LICENSE and NOTICE files for more details.

About

An Elixir based DSL for managing the ElasticSearch related stuff, such as indexes, scoped queries and so on.

Resources

License

Stars

Watchers

Forks

Packages

No packages published