爲rails 項目搭建elasticsearch服務

爲 rails 本地項目搭建 elasticsearch 服務

首先安裝 elasticsearch 服務

OSX 系統前端

brew install elasticsearch
brew services start elasticsearch

測試服務是否啓動
瀏覽器輸入 localhost:9200瀏覽器

{
  "name" : "Lynx",
  "cluster_name" : "elasticsearch_marin",
  "cluster_uuid" : "acE95aJmQxuMz0cx47b2WQ",
  "version" : {
    "number" : "2.4.6",
    "build_hash" : "5376dca9f70f3abef96a77f4bb22720ace8240fd",
    "build_timestamp" : "2017-07-18T12:17:44Z",
    "build_snapshot" : false,
    "lucene_version" : "5.5.4"
  },
  "tagline" : "You Know, for Search"
}

出現相似上述信息 number 表示當前 elasticsearch 的版本號,須要注意的是 elasticsearch 如今分爲 v2+ 和 v5+ 兩個版本,要根據本身的版原本選擇 searchkick 對應的版本是否合適ruby

gemfile中 引用 searchkick

這裏咱們是使用了 1.3.3 版本的bash

gem 'searchkick', '1.3.3'

model 中引用searchkick

如今咱們已經有搜索服務了,如今要配置須要搜索的 model
在 model 中引用 searchkickapp

# 全文檢索  searchkick
searchkick

給 products 表重建索引elasticsearch

Product.reindex

進行搜索性能

products = Product.search "apples"

這時就會獲得結果集。
若是是簡單的應用到這裏就能夠知足要求 ,固然咱們有時候須要一些個性化的配置。測試

給部分字段創建索引

reindex 方法會默認給全部的字段創建索引,可是因爲字段過長,或者性能緣由咱們只須要部分字段有索引 能夠這樣:ui

def search_data
  {
    name: name
  }
end

重寫 search_data 方法加入name 這樣就只給 name 字段打索引了code

關聯表建索引

class Catalog < ActiveRecord::Base
  has_many :products
end
class Product < ActiveRecord::Base
  belongs_to :catalog
end
def search_data
  {
    name: name
  }.merge{
    catalog_name: catalog.name
  }
end

這裏 咱們給 product 表添加一個索引叫作 分類名稱 catalog_name
這樣搜索分類名稱就能夠搜索出 同一個分類的 商品列表了

指定查詢字段

Product.search key

這個方法會默認搜索 全部的字段 並返回 全部包含 key 的結果集。
若是咱們想搜索指定的字段該如何設置呢?

def self.elasticsearch(params = {}, options = {})
  key = params[:key].blank? ? "*" : params[:key] # 關鍵字
  params[:page] ||= 1 # 分頁
  params[:per_page] ||= 20 # 每頁條數
  where_hash = {
    status: 'success', # 固定篩選值
  }
  conditions = {where: where_hash}
  conditions[:page] = params[:page]
  conditions[:per_page] = params[:per_page]
  search key, conditions
end

這樣 就至關於給結果集添加 scope,和分頁效果,前端配合 kaminari 就能夠實現分頁效果了

@articles = Product.elasticsearch(params)

action 中將設定好的參數傳入就能夠獲得結果集了

QWQ~!!

相關文章
相關標籤/搜索