[英]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.