Elasticsearch术语过滤缓慢

时间:2012-12-27 16:11:41

标签: ruby-on-rails ruby indexing elasticsearch tire

我们目前正在运行一个2节点的弹性搜索集群,其中包含2个索引,并且表现非常出色(750k文档和1110万个文档)。

我们现在正在尝试添加一个包含3540万个文档的新索引,并且搜索性能很慢。术语过滤器大约需要2秒钟才能返回。

映射:

tire do
  mapping _routing: { required: true, path: :order_id } do
    indexes :id,            type: 'string', index: :not_analyzed
    indexes :order_id,      type: 'string', index: :not_analyzed

    [:first_name, :last_name, :company_name, :title, :email, :city, :state_region_province, :postal_code].each do |attribute|
      indexes attribute, type: 'string', analyzer: 'keyword'
    end

    indexes :metadata,      type: 'string'
    indexes :clicks,        type: 'integer', index: :not_analyzed, include_in_all: false
    indexes :view_count,    type: 'integer', index: :not_analyzed, include_in_all: false
    indexes :sender,        type: 'boolean', index: :not_analyzed, include_in_all: false
    indexes :bounced,       type: 'boolean', index: :not_analyzed, include_in_all: false
    indexes :unsubscribed,  type: 'boolean', index: :not_analyzed, include_in_all: false
  end
end

搜索:

Model.tire.search(load: true, page: page, per_page: per_page, routing: order_id) do |search|
  search.query do
    match :metadata, query, type: 'phrase_prefix', max_expansions: 10
  end if query.present?

  search.filter :term, order_id: order_id
  search.filter :term, sender: false
end

我正在进行的搜索只是指定要过滤的order_id;返回结果大约需要2秒钟。我如何加快速度?

修改 我现在正在索引user_id并将其用作路由路径。我创建了一个包含30个分片的新索引来测试分配。

编辑2: 使用30个分片时,索引性能更高,但仍需要一秒钟才能返回第一个查询的数据。我不确定如何加快速度或者我做错了什么。

2 个答案:

答案 0 :(得分:1)

如果您将order_id字段的分析切换为:keyword,会发生什么?从:

indexes :order_id,      type: 'string', index: :not_analyzed

为:

indexes :order_id,      type: 'string', index: :keyword

The docs说:

  

类型关键字的分析器,它将整个流“标记”为单个标记。这对于诸如邮政编码,ID等数据非常有用。

似乎适用于order_id

答案 1 :(得分:1)

如果您没有在查询中使用构面,我建议您将查询转换为filtered query,并将术语过滤器从顶级移动到过滤查询中的过滤器。另请参阅Performance of elastic queries