使用ElasticSearch进行部分搜索

时间:2014-05-15 00:13:55

标签: elasticsearch tire

我正试图通过我的人群索引进行部分搜索。

每个人都有一个标识符(可以是数字,字符串,电子邮件地址)和标签(字符串,数字或任何您想要标记用户的内容)。

我希望能够搜索整个列表并匹配部分字符串。例如,如果我搜索“@ gmail.com”,它应匹配所有在其标识符或标记中都包含“@gmail”的用户。

我一直在尝试多种功能,但无法使其适用于部分搜索。

顺便说一句,我正在使用轮胎红宝石。

当我使用像 gmail.com 这样的通配符搜索时,它很有用,但速度非常慢。


class Person
  include Tire::Model::Search
  ...
  settings analysis: {
    analyzer: {
      email_analyzer: {
        "tokenizer" => "standard",
        "filter" => "lowercase"
      }
    }
  }

  mapping do
    indexes :identifier,  analyzer: "email_analyzer"
    indexes :email,       analyzer: "email_analyzer"
    indexes :tags_name,   analyzer: "keyword"
  end
  ...
  def tire_search(search)
    query ||= begin
      t = search.gsub(/[@\-\+\:]/, " ").strip
      t.present? ? "*#{t}*" : ""
    end
    tire.search(load: false, page: page, per_page: per_page) do
      query { string query, :default_operator => :AND, :fields => ['identifier', 'email', 'tags_name'] } if query.present?
      filter :terms, account_id: [account_id]
    end
  end
end

0 个答案:

没有答案