简体   繁体   English

导轨4,elasticsearch-rails

[英]Rails 4, elasticsearch-rails

I'm looking for some advice on the best way forward with my app which i have began to integrate elasticsearch for the first time. 我正在寻找有关通过我的应用程序前进的最佳方式的建议,这是我第一次开始集成Elasticsearch。 Im a bit of a beginner in rails but keen to dive in so forgive any glaring errors! 我是一名初学者,但是热衷于深入研究,以便原谅任何明显的错误!

I followed a tutorial http://www.sitepoint.com/full-text-search-rails-elasticsearch/ and have also implemented some additional elasticsearch dsl features from reading documentation etc.. im just not convinced i'm there yet. 我遵循了教程http://www.sitepoint.com/full-text-search-rails-elasticsearch/ ,并且还通过阅读文档等实现了一些额外的elasticsearch dsl功能。我只是不相信我在那里。 (I certainly need to move out of the model, as currently most sits in the Product active record model.) (我当然需要退出模型,因为目前大多数人都处于产品有效记录模型中。)

I am trying to implement a search on the Product model with ability to partial word search, fuzzy search (misspellings). 我正在尝试对Product模型实施搜索,以实现部分单词搜索,模糊搜索(拼写错误)的功能。 From what I understand, I am able to set my own analyzers and filters for the elasticsearch, which I have done and currently reside in the Product model. 据我了解,我能够为我的Elasticsearch设置自己的分析器和过滤器,这已经完成并且目前存在于Product模型中。 I would like to move these to a more sensible location too, once I have established if indeed I am actually doing this correctly. 一旦确定是否确实正确地执行了此操作,我也想将它们移至更明智的位置。 I do get results when i search but im including things like deleting the index, creating a new index with mapping all in the end of the product model, if what i have below is not "the correct way", what better way is there than what i have to 1, implement elastic search using rails 2, seperate concerns more efficiently. 我在搜索时确实得到了结果,但是我包括删除索引,在产品模型的末尾映射所有内容以创建新索引之类的东西,如果我下面的内容不是“正确的方法”,那还有什么更好的方法呢?我必须要做的1,使用rails进行弹性搜索2,更有效地分离关注点。

thanks and much appreciated 谢谢,非常感谢

CODE: 码:

lib/tasks/elasticsearch.rake: lib / tasks / elasticsearch.rake:

   require 'elasticsearch/rails/tasks/import'

View: 视图:

    <%= form_tag search_index_path, class: 'search', method: :get do %>
      <%= text_field_tag :query, params[:query], autocomplete: :off, placeholder: 'Search', class: 'search' %>
     <% end %>

Gems i used: 我使用的宝石:

 gem 'elasticsearch-model', git: 'git://github.com/elasticsearch/elasticsearch-rails.git'
 gem 'elasticsearch-rails', git: 'git://github.com/elasticsearch/elasticsearch-rails.git'

Search Controller: 搜索控制器:

class SearchController < ApplicationController
def index
 if params[:query].nil?
   @products = []
 else
   @products = Product.search(params[:query])
 end
end
end

Product Model: 产品型号:

require 'elasticsearch/model'
class Product < ActiveRecord::Base
     # ElasticSearch
  include Elasticsearch::Model
  include Elasticsearch::Model::Callbacks

  settings index: {
    number_of_shards: 1,
    analysis: {
      filter: {
        trigrams_filter: {
          type: 'ngram',
          min_gram: 2,
          max_gram: 10
        },
        content_filter: {
          type: 'ngram',
          min_gram: 4,
          max_gram: 20
        }
      },
      analyzer: {
        index_trigrams_analyzer: {
          type: 'custom',
          tokenizer: 'standard',
          filter: ['lowercase', 'trigrams_filter']
        },
        search_trigrams_analyzer: {
          type: 'custom',
          tokenizer: 'whitespace',
          filter: ['lowercase']
        },
        english: {
          tokenizer: 'standard',
          filter: ['standard', 'lowercase', 'content_filter']
        }
      }
    }
    } do
    mappings dynamic: 'false' do
      indexes :name, index_analyzer: 'index_trigrams_analyzer', search_analyzer: 'search_trigrams_analyzer'
      indexes :description, index_analyzer: 'english', search_analyzer: 'english'
      indexes :manufacturer_name, index_analyzer: 'english', search_analyzer: 'english'
      indexes :type_name, analyzer: 'snowball'
    end
  end

  # Gem Plugins
   acts_as_taggable
   has_ancestry
   has_paper_trail
 @@ -99,6 +146,33 @@ def all_sizes
     product_attributes.where(key: 'Size').map(&:value).join(',').split(',')
   end

  def self.search(query)
    __elasticsearch__.search(
      {
        query: {
          query_string: {
            query: query,
            fuzziness: 2,
            default_operator: "AND",
            fields: ['name^10', 'description', 'manufacturer_name', 'type_name']
          }
        },
        highlight: {
          pre_tags: ['<em>'],
          post_tags: ['</em>'],
          fields: {
            name: {},
            description: {}
          }
        }
      }
    )
  end

  def as_indexed_json(options={})
    as_json(methods: [:manufacturer_name, :type_name])
  end

 end

# Delete the previous products index in Elasticsearch
Product.__elasticsearch__.client.indices.delete index: Product.index_name rescue nil

# Create the new index with the new mapping
Product.__elasticsearch__.client.indices.create \
  index: Product.index_name,
  body: { settings: Product.settings.to_hash, mappings: Product.mappings.to_hash }

# Index all article records from the DB to Elasticsearch
Product.import(force: true)
end

If you are using elasticsearch for searching,then i will recommend gem 'chewy' with elasticsearch server. 如果您正在使用Elasticsearch进行搜索,那么我将为Elasticsearch服务器推荐gem'chewy'。

For more information just go to the links provided below. 有关更多信息,请转到下面提供的链接。

for chewy: 耐嚼

https://github.com/toptal/chewy https://github.com/toptal/chewy

Integrate chewy with elasticsearch: 将耐嚼性与elasticsearch集成:

http://www.toptal.com/ruby-on-rails/elasticsearch-for-ruby-on-rails-an-introduction-to-chewy http://www.toptal.com/ruby-on-rails/elasticsearch-for-ruby-on-rails-an-introduction-to-chewy

Thanks 谢谢

I can recommend searchkick: 我可以推荐searchkick:

https://github.com/ankane/searchkick https://github.com/ankane/searchkick

Several apps in production running with searchkick and it's easy to use. 生产中的多个应用程序通过searchkick运行,并且易于使用。

Also check out the documentation of searchkick where a search for products is described in detail with facets, suggestions, etc. 另外,请查看searchkick的文档,其中详细介绍了产品搜索,包括方面,建议等。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM