当前位置: 首页 > 面试题库 >

ElasticSearch搜索性能

葛修真
2023-03-14
问题内容

我们有两个节点的集群(私有云中的VM,64GB的RAM,每个节点8个核心CPU,CentOS),几个小索引(约100万个文档)和一个大索引,约有2.2亿个文档(2个分片,170GB)的空间)。每个盒上分配了24GB的内存用于elasticsearch。

文件结构:

 {
        'article_id': {
            'index': 'not_analyzed',
            'store': 'yes',
            'type': 'long'
        },
        'feed_id': {
            'index': 'not_analyzed',
            'store': 'yes',
            'type': 'string'
        },
        'title': {
            'index': 'analyzed',
            'type': 'string'
        },
        'content': {
            'index': 'analyzed',
            'type': 'string'
        },
        'lang': {
            'index': 'not_analyzed',
            'type': 'string'
        }
    }

运行以下查询大约需要1-2秒:

{
    "query" : {
        "multi_match" : {
            "query" : "some search term",
            "fields" : [ "title", "content" ],
            "type": "phrase_prefix"
        }
    },
    "size": 20,
    "fields" :["article_id", "feed_id"]
}

我们是在此时达到硬件极限,还是有办法优化查询或数据结构以提高性能?

提前致谢!


问题答案:

您可能会达到硬件的极限,但是首先可以对查询做一些事情来帮助优化它。

最大扩展

我要做的第一件事是限制max_expansions。前缀查询的工作方式是生成与查询中的最后一个令牌匹配的前缀列表。在您的搜索查询“ some
search term”中,最后一个标记“ term”将使用“ term”作为前缀种子进行扩展。您可以生成如下列表:

  • 术语
  • 条款
  • 终止
  • 终结者
  • 白蚁

前缀扩展过程贯穿您的发布列表,以查找与种子前缀匹配的任何单词。默认情况下,此列表是无限制的,这意味着您可以生成很大的扩展列表。

第二阶段term使用扩展将您的原始查询重写为一系列查询。扩展列表越大,针对您的索引评估的术语越多,并且速度相应降低。

如果将扩展过程限制在合理的范围内,则可以保持速度,并且通常仍会获得良好的前缀匹配:

{
    "query" : {
        "multi_match" : {
            "query" : "some search term",
            "fields" : [ "title", "content" ],
            "type": "phrase_prefix",
            "max_expansions" : 100
        }
    },
    "size": 20,
    "fields" :["article_id", "feed_id"],

}

您将需要玩几个扩展。这是速度和召回之间的权衡。

筛选

通常,您可以添加的另一件事是过滤。如果可以过滤某些类型的条件,则可以极大地提高速度。当前,您的查询是针对整个索引(2.5亿个文档)执行的,需要进行大量评估。如果您可以添加过滤器以减少该数量,则可以看到延迟大大改善了。

归根结底,查询评估的文档越少,查询将运行得越快。过滤器减少了查询将看到,被缓存,运行非常快等的文档数量。

您的情况可能没有任何适用的过滤器,但如果有,它们确实可以提供帮助!

文件系统缓存

该建议完全取决于系统的其余部分。如果由于进行简单的搜索和过滤(例如,不分面/地理/繁重的排序/脚本)而没有充分利用堆(24gb),则可以将堆重新分配给文件系统缓存。

例如,如果最大堆使用量峰值为12gb,则可以将堆大小减小到15gb。您释放的额外10gb将返回到操作系统并帮助缓存段,这将仅由于更多操作是无盘事实而有助于提高搜索性能。



 类似资料:
  • 主要内容:多索引此API用于在Elasticsearch中搜索内容。 用户可以通过发送具有查询字符串的获取请求作为参数或在请求的消息正文中的查询来进行搜索。所有的搜索API都是多索引,多类型。 多索引 Elasticsearch允许我们搜索存在于所有索引或一些特定索引中的文档。 例如,如果我们需要搜索名称包含的所有文档。 响应 或者,同样地我们可以在,索引中搜索 - 多类型 还可以在所有类型或某种指定类型的索引中

  • 问题内容: 我尝试在elasticsearchJava API上使用正则表达式运行全文搜索。我的过滤器是这样的: 但是它只与一个单词匹配,而没有短语匹配。我的意思是,例如: 如果soruce中有一个字符串,例如:“ ”,而当我的文本字符串如下:“ ”,“ ”,“ ” …时,它就起作用了。 但是,当我的realTimeTextIn字符串为“ ”时,全文搜索将不起作用。我搜索的单词不能超过一个。 我在

  • 问题内容: 我有一个很大的名字数据库,主要来自苏格兰。我们目前正在生产一个原型,以替换执行搜索的现有软件。这仍在生产中,我们的目标是使我们的结果尽可能接近同一搜索的当前结果。 我希望有人可以帮助我,我正在对Elastic Search进行搜索,查询是“ Michael Heaney”,我得到了一些疯狂的结果。当前搜索返回两个主要的姓,分别是“ Heaney”和“ Heavey”,都以“ Micha

  • 我尝试在弹性搜索java api上使用正则表达式运行全文搜索。我的过滤器是这样的: 但是它只与一个单词匹配,而不是与短语匹配。我的意思是,例如: 如果soruce中有一个字符串,如:“

  • 更改历史 * 2018-05-07 胡小根 初始化文档 1 历史、现状和发展 1.1 历史 1.2 现状 1.3 发展 难点:预测发展方向。 2 安装和使用 2.1 安装 2.2 使用 创建index和type 上传单条数据 批量上传数据 查询 2.3 示例 2.4 最佳实践 难点:最佳实践,超出于示例,应该归纳总结出积累的技巧。 3 同类技术对比 难点:归纳比对项 参考资料 El

  • 我通过扩展ElasticsearchIntegrationTest为ElasticSearch编写了一个集成测试。测试顶部如下: 在尝试通过maven运行测试时,我从JUnit中看到了这个错误 JAVAlang.NoSuchMethodError:com。胡萝卜搜索。随机测试。随机化上下文。运行Privaterandomness(Lcom/carrotsearch/randomizedtestin