我是弹性搜索的新手,想在我的应用程序中实现部分单词匹配,不知道如何实现,请建议我的代码如下:
的文章。rb文件
class Article < ActiveRecord::Base
include Tire::Model::Search
include Tire::Model::Callbacks
settings analysis: {
filter: {
ngram_filter: { type: "nGram", min_gram: 2, max_gram: 12 }
},
analyzer: {
partial_analyzer: {
type: "snowball",
tokenizer: "standard",
filter: ["standard", "lowercase", "ngram_filter"]
}
}
} do
mapping do
indexes :title, index_filter: "ngram_filter"
indexes :body, index_analyzer: "partial_analyzer"
indexes :id
end
end
def self.search(params)
tire.search() do
query { string params[:query]} if params[:query].present?
end
end
end
article_controller.rb
class ArticlesController < ApplicationController
def index
if params[:query].present?
@articles = Article.search(params)
# @articles = Article.where(title: params["query"])
else
@articles = Article.all
end
respond_to do |format|
format.js { render :layout => false }
format.html
end
end
end
我也不太了解映射和索引,所以请给我建议解决方案,谢谢。
您可以通过在搜索框中传递星号(*)来执行部分搜索,如:
search_term*
默认情况下,你想在搜索方法中添加它只需像
那样添加它def self.search(params)
tire.search() do
query { string "*#{params[:query]}*" } if params[:query].present?
end
end
您需要这样写,并确保修复搜索的模糊性以及用于搜索的列(如title)
@term = params[:keyword].to_s
@results = JobSubcategory.search({#size: 20 ,
query: {
multi_match:{
query: @term,
fields: [ "title"],
fuzziness: 2
}
}}).paginate(page: params[:page], per_page: params[:per_page])