`

searchkick 和 Elasticsearch

阅读更多
基于searchkick的样例

brew install elasticsearch
brew services start elasticsearch


gem 'searchkick', '2.5.0'


class SearchObj < ApplicationRecord

  searchkick merge_mappings: true, mappings: {
    search_obj:{
      properties: {
        name: {type: 'string', analyzer: "standard"},
        cas: {type: 'string'}
      }
    }
  }

  def search_data
    {
        name: good_name,
        cas: cas
    }
  end

  # 手动调整搜索结构
  # ops: {q: '12233', type: 1}
  def self.es_search(opts)
    bools = {
      must:     [],  # a & b & c
      should:   [],  # a || b || c
      must_not: []   # !a & !b & !c
    }

    if opts[:q].present?
      bools[:should] << {
        match: {cas: { query: opts[:q], boost: 100 }}
      }

      bools[:should] << {
        match: {name: {query: opts[:q], boost: 10}}
      }

    end



    search_body = {
      query: {
        bool: bools
      },
      size: opts[:per_page] || 10,
      from: ((opts[:page] || 1) - 1) * (opts[:per_page] || 10),
      sort: "_score"
    }

    search body: search_body

  end

end


一些参考链接
https://segmentfault.com/a/1190000011490134

基于elasticsearch-rails的样例

gem 'elasticsearch-model'
gem 'elasticsearch-rails'

namespace :activities do
  task refresh_es: :environment do 
    class VendorProductPromotionPriceEs
      include ActiveModel::Model
      include Elasticsearch::Model
      index_name  "mall-#{Rails.env}"
      document_type "vendor_product_promotion_prices"
      settings index: { number_of_shards: 1, number_of_replicas: 0 } do
        mappings  do
          indexes :cas, type: 'string', index: "not_analyzed", analyzer: 'snowball'
          indexes :names, type: 'string', analyzer: 'snowball'
          indexes :names_keywords, type: 'string', analyzer: 'keyword'
          indexes :names_cn, type: 'string', analyzer: 'ik_max_word'
          indexes :names_cn_keywords, type: 'string', analyzer: 'keyword'
          indexes :status, type:  'integer'
          indexes :vendor_ids, type:  'integer'
          indexes :activity_ids, type:  'integer'
        end
      end
      attr_accessor :chemi_id, :vendor_ids, :activity_ids

      def chemical
        @_chemical ||= Chemi.find_by_id(self.chemical_id)
      end

      def id
        chemical_id
      end


      def as_indexed_json(options={})
       h = chemical.as_indexed_json(options)
       h.delete(:suggest)
       h.delete(:suggest_cn)
       h[:vendor_ids] = self.vendor_ids
       h[:activity_ids] = self.activity_ids
       h
      end
    end
    results = ActiveRecord::Base.connection.select_all 'select distinct chemical_id, vendor_id,activity_id from vendor_product_promotion_prices'
    cs = {}
    results.each do |r|
      cs[r['chemical_id']] ||= {}
      cs[r['chemical_id']]['vendor_ids'] ||= []
      cs[r['chemical_id']]['activity_ids'] ||= []
      cs[r['chemical_id']]['vendor_ids']  << r['vendor_id']
      cs[r['chemical_id']]['activity_ids'] << r['activity_id']
    end

    es = []
    cs.each do |chemical_id, values|
      es << VendorProductPromotionPriceEs.new(chemical_id: chemical_id, vendor_ids: values['vendor_ids'].to_a.uniq, activity_ids: values['activity_ids'].to_a.uniq)
    end

    index_name  = "whmall-#{Rails.env}"
    document_type = "vendor_product_promotion_prices"
    es.in_groups_of(1000,false).each do |batch|
      VendorProductPromotionPriceEs.__elasticsearch__.client.bulk( index:   index_name, type:    document_type, body:    batch.map { |model| { index: { _id: model.id, data: model.as_indexed_json}}})
    end
  end
end


rake environment elasticsearch:import:model FORCE=y CLASS='Chemi' SCOPE='with_products'

更新产品在elasticsearch中的索引
chem = Chem.find(19385)
chem.__elasticsearch__.index_document(refresh: true) # index_document是创建索引, refresh: true 是强制ES刷新索引,刷新后才能search
# #需要注意,chem.danger 需要设置为0,不能是nil

获取产品在ES里的索引信息
chem.__elasticsearch__.as_indexed_json

删除产品在ES中的索引
chem.__elasticsearch__.delete_document(refresh: true)

重建所有的产品索引
Chemical.__elasticsearch__.reindex!


一些参考链接
https://www.rubydoc.info/gems/elasticsearch-api/

分词:
Elasticsearch 标准分词和ik分词的差别
https://blog.csdn.net/silent1/article/details/44590701

ElasticSearch最全分词器比较及使用方法 - 赵英超的博客 - CSDN博客: https://blog.csdn.net/ZYC88888/article/details/83620572


另外的一些gem
sunspot/sunspot
https://blog.csdn.net/raosheng1993/article/details/45438573
https://ruby-china.org/topics/21473

搜索引擎选择: Elasticsearch与Solr
https://www.cnblogs.com/chowmin/articles/4629220.html
0
0
分享到:
评论

相关推荐

    Ruby-Searchkick利用Rails和Elasticsearch轻松实现智能搜索

    Searchkick不仅简化了与Elasticsearch的交互,还提供了一些高级特性,如自动补全、拼写纠错和相关性评分,为用户提供更加智能和个性化的搜索体验。 ### 1. 安装和配置 首先,将`searchkick`添加到你的Rails项目的...

    065-searchkick-and-elasticsearch:使用Searchkick和Elasticsearch添加全文搜索。 在这里,我将展示将搜索添加到现有应用程序中的步骤以及自动完成功能的示例

    该自述文件通常会记录启动和运行应用程序所需的所有步骤。 您可能要讲的内容: Ruby版本 系统依赖 配置 数据库创建 数据库初始化 如何运行测试套件 服务(作业队列,缓存服务器,搜索引擎等) 部署说明 ...

    searchkick:Rails和Elasticsearch使智能搜索变得容易

    Searchkick句柄: 茎- tomatoes与tomato匹配特殊字符- jalapeno搭配jalapeño jalapeno 多余的空格- dishwasher搭配dish washer 拼写错误zuchini与zucchini匹配自定义同义词- pop匹配soda 加: 像SQL一样的查询-无需...

    bookstore-example:显示 Elasticsearch + Searchkick 集成的示例应用

    `bookstore-example`是一个基于Ruby的示例项目,它演示了如何在Rails应用中使用Elasticsearch和Searchkick实现高效的搜索功能。这个项目可以帮助开发者理解如何将Elasticsearch的强大力量引入到Web应用中,尤其是...

    redmine_search

    安装确保已安装JAVA和Elasticsearch 从安装ElasticSearch 测试您的连接curl -XGET'http 9200'-状态应等于200 在“管理”面板中将搜索引擎切换到Elasticsearch Engine并选择语言。 (默认为英语) 运行Elasticsearch...

    rails-autocomplete:使用Elasticsearch服务和kicksearch gem进行文本搜索的Rails API

    Rails自动完成与ElasticSearch和SearchKick意图我打算建立此仓库的目的是分享我对该主题的简要知识:全文搜索或FTS 。 如您所见,我已经进行了一些测试和研究以得出结论,上一部分中的某些链接可以帮助想要了解我所...

    Rails和Elasticsearch使智能搜索变得容易-Ruby开发

    Searchkick? 智能搜索变得轻松Searchkick可以了解您的用户正在寻找什么。 随着越来越多的人搜索,它变得越来越聪明,结果也越来越好。 它对开发人员很友好-对您的用户来说是不可思议的。 S Searchkick:rocket:智能...

    Laravel开发-mysticquent

    在这种背景下,"Laravel开发-mysticquent"项目引入了一种名为Mysticquent的工具,它是一个针对Elasticsearch的ODM(对象文档映射)和映射器。这个工具的设计灵感来源于Sleimanx2/塑料和SearchKick这两个库,它们在...

    harmonyos2-harmony-plus:和谐加

    和声2 和谐加 :rocket: :rocket: :rocket: 第37队:Henry Gan、饶宜然、赵航鹏、罗倩梅、程晓义、Shrayus Gupta 我们使用 Searchkick ...页面上启用搜索功能来过滤/搜索学生申请。...elasticsearch-1.7.0.deb

    pagy:终极分页Ruby宝石

    帕吉 Pagy是终极的分页宝石,在每个基准和比较中均胜过其他分页。3.0+的新功能在现代环境中,Pagy 3.0+比2.0+更快,更轻,更高效(请参见下表)。 javascript导航助手已经过重构,以提高性能和更直观的API i18n已被...

Global site tag (gtag.js) - Google Analytics