0

Tireとelasticsearchを使ってメールでインデックスと検索を試みています。

問題は、「something@example.com」を検索した場合です。@ と . シンボル。クエリ文字列をハッキングし、文字列であると思われる文字列の前に「email:」を追加することで「解決」しました。そうしないと、「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

「email:」で検索すると、アナライザーは完全に機能しますが、それがないと、指定されたアナライザーなしで電子メール内のその文字列を検索し、多くの望ましくない結果が得られます。

4

2 に答える 2