我正在尝试使用 Tire 和 elasticsearch 通过电子邮件进行索引和搜索。
问题是,如果我搜索:“something@example.com”。由于 @ 和 ,我得到了奇怪的结果。符号。我通过破解查询字符串并在我怀疑是字符串的字符串之前添加“电子邮件:”来“解决”。如果我不这样做,在搜索“something@example.com”时,我会得到“something@gmail.com”或“asd@example.com”的结果。
include Tire::Model::Search
include Tire::Model::Callbacks
settings :analysis =>{
:analyzer => {
:whole_email => {
'tokenizer' => 'uax_url_email'
}
}
} do
mapping do
indexes :id
indexes :email, :analyzer => 'whole_email', :boost => 10
end
end
def self.search(params)
params[:query] = params[:query].split(" ").map { |x| x =~ EMAIL_REGEXP ? "email:#{x}" : x }.join(" ")
tire.search(load: {:include => {'event' => 'organizer'}}, page: params[:page], per_page: params[:per_page] || 10) do
query do
boolean do
must { string params[:query] } if params[:query].present?
must { term :event_id, params[:event_id] } if params[:event_id].present?
end
end
sort do
by :id, 'desc'
end
end
end
def to_indexed_json
self.to_json
end
使用“电子邮件:”进行搜索时,分析器可以完美运行,但没有它,它会在没有指定分析器的情况下在电子邮件中搜索该字符串,得到很多不想要的结果。