1

我们目前正在运行一个具有 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 个分片,索引性能更高,但仍然需要一秒钟才能返回第一个查询的数据。我不确定如何加快速度或我做错了什么。

4

2 回答 2

1

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

于 2012-12-27T20:26:38.320 回答
1

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

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

至:

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

文档说:

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

这似乎适用于order_id.

于 2012-12-27T17:01:11.120 回答