繁体   English   中英

在Tire和Ruby on Rails上使用Elasticsearch搜索电子邮件时结果无效

[英]Invalid results when searching emails using elasticsearch with Tire and Ruby on Rails

我正在尝试使用Tyre和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:”进行搜索时,分析器可以完美地工作,但是如果没有它,它会在没有指定分析器的情况下在电子邮件中搜索该字符串,从而得到很多不良结果。

我认为您的问题与_all字段有关。 默认情况下,所有字段都被索引两次,一次在其字段名称下,另一次在_all字段中使用另一个分析器。

如果您发送查询时指定要搜索的字段,则将针对_all字段执行_all 当您为文档建立索引时,电子邮件字段的内容会在_all字段下再次建立索引(以停止在您的映射中设置这个include_in_all: false ),在此处以标准方式标记它们(分别位于@和。上)。 这意味着未经指导的查询将给出奇怪的结果。

我要解决的方法是对电子邮件使用term查询,并确保指定要搜索的字段。 术语查询速度更快,因为它没有query_string查询具有的查询解析步骤(这就是为什么在字符串前面加上“ email:”前缀的原因,它进入了正确的字段,这就是查询解析器的作用)。 同时你并不需要,除非你是索引同时包含免费的文字和网址,电子邮件字段指定自定义分析。 如果该字段仅包含电子邮件,则只需设置index: not_analyzed ,它将保留为单个令牌。 (您可能希望有一个自定义分析器,但是可以将电子邮件小写。)

使您的搜索查询如下所示:

"term": {
    "email": "example@domain.com"
}

祝好运!

将字段添加到_all,然后尝试通过将转义字符(\\)添加到emailid的特殊字符进行搜索。

例如: something \\ @example \\ .com

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM