README.md in elastic_mapper-0.0.1 vs README.md in elastic_mapper-0.1.0

- old
+ new

@@ -1,66 +1,132 @@ ElasticMapper ============= -A dead simple DSL for integrating ActiveRecord with ElasticSearch. +A damn simple mixin for integrating ActiveModel with ElasticSearch. -ElasticMapper is built on top of the [Stretcher](https://github.com/PoseBiz/stretcher) library. +ElasticMapper is built on top of the [Stretcher](https://github.com/PoseBiz/stretcher) client. Background ---------- -Describing Mappings ----------------- +I'm a big fan of the [Stretcher](https://github.com/PoseBiz/stretcher) ElasticSearch client. It exposes an API that's: straightforward, elegant, and well documented. I tend to choose stretcher when pulling search into Rails projects. +A few projects in, I noticed that I was rewriting a lot of the same code for: + +* describing the mappings on documents. +* indexing documents. +* and searching for documents. + +From this grew ElasticMapper; Simply include the ElasticMapper mixin in your ActiveModels, it provides helpers for: generating mappings, indexing documents, and performing search. + +Creating Mappings +----------------- + Mappings indicate to ElasticSearch how the fields of a document should be indexed: http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/mapping.html ElasticMapper provides a `mapping` method, for describing these mappings. ```ruby -def Article +def Article < ActiveHash::Base include ElasticMapper + # Note we might sometimes want to index the same field in a few + # different ways, ElasticMapper creates a unique name automatically + # if fields collide :title, :title_1, ... mapping :title, :doi, { type => :string, index => :not_analyzed } mapping :title, :abstract, type => :string mapping :publication_date, type => :date end ``` -When you first create or modify mappings on an ElasticMapper model, you should run: +When you create or modify mappings on an ElasticMapper model, you should run: ```ruby Article.put_mapping ``` -ToDo ----- +Indexing a Document +------------------- -* Put more tests around search. -* Test the library out. +When you create or update a document using the ElasticMapper mixin, simply call `index`. +```ruby +article = Article.create(title: "Hello World", doi: "doi://12354.com") +article.index +``` + +Or, even easier, use the ActiveRecord `:after_save` hook: + +```ruby +class Article < ActiveRecord::Base + + include ElasticMapper + + validates_uniqueness_of :doi + validates_presence_of :doi, :title + + after_save :index + + mapping :title, :doi, :index => :not_analyzed + mapping :title, :abstract + mapping :publication_date, :type => :date +end +``` + +Searching +--------- + +ElasticMapper adds the `search` method to your ActiveModel classes. Results will be returned as instances of your ActiveModel class. + +*String Queries* + +You can provide a string query to your model, and it will be parsed using the ElasticSearch query DSL: + +```ruby +articles = Article.search('hello AND world') +``` + +*Hash Queries* + +You can also provide a hash object, for advanced searches. + +```ruby +articles = Article.search({ "query_string" => { "query" => 'alpha' } }) +``` + +*Pagination* + +* `:size` how many search results should be returned? +* `:from` what offset should we start returning results from? + +```ruby +results = SearchModel.search('* OR alpha', size: 10, from: 10) +``` + +That's It +--------- + +Let me know what you think! + ## Installation Add this line to your application's Gemfile: - gem 'elasticmapper' + gem 'elastic_mapper' And then execute: $ bundle Or install it yourself as: - $ gem install elasticmapper + $ gem install elastic_mapper -## Usage - -TODO: Write usage instructions here - ## Contributing -1. Fork it ( http://github.com/<my-github-username>/elasticmapper/fork ) +1. Fork it ( http://github.com/bcoe/elasticmapper/fork ) 2. Create your feature branch (`git checkout -b my-new-feature`) 3. Commit your changes (`git commit -am 'Add some feature'`) 4. Push to the branch (`git push origin my-new-feature`) 5. Create new Pull Request