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