[英]Elasticsearch with Tire: edgeNgram with multiple words
假设我有5部电影片名:
我想用这个预期的行为实现一个自动完成的搜索字段:
这个用例似乎是显而易见的,必须是许多人使用的,但我无法让它正常工作,我似乎无法找到任何答案或文档来帮助。 这是我目前的型号:
class Film < Media
include Tire::Model::Search
include Tire::Model::Callbacks
settings :analysis => {
:filter => {
:title_ngram => {
"type" => "edgeNGram",
"min_gram" => 2,
"max_gram" => 8,
"side" => "front" }
},
:analyzer => {
:title_analyzer => {
"tokenizer" => "lowercase",
"filter" => ["title_ngram"],
"type" => "custom" }
}
} do
mapping do
indexes :title, :type => 'string', :analyzer => 'title_analyzer'
indexes :int_english_title, :type => 'string', :analyzer => 'title_analyzer'
end
end
end
以及如何在search_controller中处理查询:
search = Tire.search ['books', 'films', 'shows'], :load => true, :page => 1, :per_page => 10 do |s|
s.query do |query|
query.string "title:#{params[:search]}"
end
end
@results = search.results
这会产生一些奇怪的行为:
我认为您可以通过match
查询集来实现您想要的type:"phrase_prefix"
。 大多数(但不是全部)示例都可以使用。
使用Ngrams,你可以更好地控制这个过程,但是它们有一个相当大的召回(它们通常会返回你想要的更多数据),你必须对抗它。 这是你用多个查询术语(“Sans so”)观察到的“奇怪行为”,因为它们被有效地执行为Sans OR so
查询。
尝试使用default_operator: "AND"
选项(参见轮胎的query_string_test.rb ),或者更确切地说, match
查询(见轮胎的match_query_test.rb )与operator: "AND"
选项。
有一些关于自动完成,Tire和Ngrams的文章可用:
试试以下
search = Tire.search ['books', 'films', 'shows'], :load => true, :page => 1, :per_page => 10 do |s|
s.query do |q|
q.boolean do |b|
b.must {|m| m.string params[:search]}
end
end
end
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.