基于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
分享到:
相关推荐
Searchkick不仅简化了与Elasticsearch的交互,还提供了一些高级特性,如自动补全、拼写纠错和相关性评分,为用户提供更加智能和个性化的搜索体验。 ### 1. 安装和配置 首先,将`searchkick`添加到你的Rails项目的...
该自述文件通常会记录启动和运行应用程序所需的所有步骤。 您可能要讲的内容: Ruby版本 系统依赖 配置 数据库创建 数据库初始化 如何运行测试套件 服务(作业队列,缓存服务器,搜索引擎等) 部署说明 ...
Searchkick句柄: 茎- tomatoes与tomato匹配特殊字符- jalapeno搭配jalapeño jalapeno 多余的空格- dishwasher搭配dish washer 拼写错误zuchini与zucchini匹配自定义同义词- pop匹配soda 加: 像SQL一样的查询-无需...
`bookstore-example`是一个基于Ruby的示例项目,它演示了如何在Rails应用中使用Elasticsearch和Searchkick实现高效的搜索功能。这个项目可以帮助开发者理解如何将Elasticsearch的强大力量引入到Web应用中,尤其是...
安装确保已安装JAVA和Elasticsearch 从安装ElasticSearch 测试您的连接curl -XGET'http 9200'-状态应等于200 在“管理”面板中将搜索引擎切换到Elasticsearch Engine并选择语言。 (默认为英语) 运行Elasticsearch...
Rails自动完成与ElasticSearch和SearchKick意图我打算建立此仓库的目的是分享我对该主题的简要知识:全文搜索或FTS 。 如您所见,我已经进行了一些测试和研究以得出结论,上一部分中的某些链接可以帮助想要了解我所...
Searchkick? 智能搜索变得轻松Searchkick可以了解您的用户正在寻找什么。 随着越来越多的人搜索,它变得越来越聪明,结果也越来越好。 它对开发人员很友好-对您的用户来说是不可思议的。 S Searchkick:rocket:智能...
在这种背景下,"Laravel开发-mysticquent"项目引入了一种名为Mysticquent的工具,它是一个针对Elasticsearch的ODM(对象文档映射)和映射器。这个工具的设计灵感来源于Sleimanx2/塑料和SearchKick这两个库,它们在...
和声2 和谐加 :rocket: :rocket: :rocket: 第37队:Henry Gan、饶宜然、赵航鹏、罗倩梅、程晓义、Shrayus Gupta 我们使用 Searchkick ...页面上启用搜索功能来过滤/搜索学生申请。...elasticsearch-1.7.0.deb
帕吉 Pagy是终极的分页宝石,在每个基准和比较中均胜过其他分页。3.0+的新功能在现代环境中,Pagy 3.0+比2.0+更快,更轻,更高效(请参见下表)。 javascript导航助手已经过重构,以提高性能和更直观的API i18n已被...