当前位置: 首页 > 知识库问答 >
问题:

理解弹性搜索

闻人吕恭
2023-03-14

很抱歉,但是ES的文档(http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/index.html)让我感到困惑。

多亏了术语表,我理解了数据库、表和行的术语,但我阅读了文档的大部分部分,但我找不到答案:

  • 为什么需要在索引创建中添加number_of_shardsnumber_of_replicas?我确实在这里查看了http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/index-modules.html,但具有讽刺意味的是,它把这两个设置都遗漏了
  • 怎么用2个副本才能有3个碎片?如果术语表是可以使用的,那么考虑到碎片是“是单个Lucene实例”,难道这不是不可能的吗?
  • 如果以后添加更多节点,如何更改这些值以跨越新节点?
  • 分片在ES中如何工作?
  • 副本集在ES中如何工作?
  • 如何管理分片?我知道它是自动连接(http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/setup-configuration.html#cluster-name),但如何定义副本和碎片之间的区别?
  • 如何管理副本集?即。如何添加副本、提升初级等?

为了参考,我先阅读以下链接:

  • http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/glossary.html
  • http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/index.html

如果该信息存在于文件中,那么我将非常感激,如果你能给我指出它。

编辑:

我也不确定自动发现是如何在分布式网络上工作的。短,如果ping每一个公共网络周围,它如何连接到正确的一个,可能在世界的另一边?


共有3个答案

杜俭
2023-03-14

在Shay Banon(ElastiSearch的创建者)的视频演示中,你大约80%的问题都得到了回答,这是一个相当偶然的事件。虽然这个演示文稿比你在其他任何地方都能找到更多的内容。希望这有帮助。

  http://www.infoq.com/presentations/ElasticSearch  

这段视频的分辨率有点低,所以如果你想要在演示文稿中显示代码,请按照下面的操作

  https://github.com/kimchy/talks/tree/master/2011/wsnparis 
陶成济
2023-03-14

简而言之,索引被分割成碎片。碎片可以复制,这意味着同一集群中可以存在同一碎片的多个副本。因此,如果一个索引有3个碎片和2个副本,这意味着您总共有9个碎片,其中6个是三个主碎片的副本。

ES将尝试平衡集群中的分片和副本分片,这样,如果某个节点发生故障,它可以从该节点上的主分片故障转移到副本。这可以让一些人感到困惑:弹性搜索中的一个master指的是碎片,而不是实际的节点。因此单个节点可以混合使用副本碎片和主碎片。

如果您来自lucene世界,那么lucene索引与弹性搜索索引不是一回事。弹性搜索索引是具有类型、映射和文档的索引文档的逻辑组。与数据库模式大致相同。另一方面,lucene索引是一组包含索引数据的多个文件。当弹性搜索创建索引时,它所做的是创建几个lucene索引(每个字段和碎片一个),当它复制时,它基本上是复制这些lucene索引的文件。

不能更改索引的碎片数,但可以更改副本数。通常,当需要更多碎片时,您所做的是创建一个新索引并重新索引数据。

就分片管理而言,除了决定分片的数量之外,默认情况下没有太多需要管理的东西,并且ES本身可以很好地协调事情,一旦您对它的工作方式有了一点更好的理解,您可以使用很多选项。默认值对大多数人来说都是很好的。在集群管理方面,您可以通过API做很多事情,比如以受控的方式关闭节点、使用索引别名、更改副本的数量等。

至于自动发现,ES默认使用本地网络组播。您可以切换到单播,并且您可能想要更改默认的集群名以防止意外(在coffeeshops中有一些有趣的意外集群形成)。您可能不想全局群集。我觉得结局不好。

施飞雨
2023-03-14

请看下面的答案你的观点。

  • 为什么需要将number_of_shards和number_of_replicas添加到索引创建中?我确实在这里查看了http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/index-modules.html,但具有讽刺意味的是,它遗漏了这两个设置:/

你没有“不得不”到,但你可能应该在生产中特别会想要。默认值是五个分片和一个复制。

定义的复制数就是在elasticsearch集群中的所有节点中复制整个索引的次数。将其视为一个RDBMS数据库的多个读副本(但在本例中,我们读写所有副本)。

分片是我拆分索引的次数,或分片索引。所以,我可以有一个包含单个碎片的索引,也可以有一个包含多个碎片的索引。这与按主键对RDBMS数据库进行分片在概念上类似,但并不相同。

因此,索引中的碎片总数是number_of_shards和number_of_replicas的乘积。

当您进行搜索时,elasticsearch会将您的搜索分发到包含索引中碎片的所有可能的节点,并为您聚合结果。您可以将其视为map/reduce,其中map将搜索发送到每个碎片,而reduce将收集结果。

此外,您可以随时更改复制number_of_replicas,但永远不能更改number_of_shards。这必须在创建索引时设置。

  • 怎么用2个副本才能有3个碎片?如果术语表是可以使用的,那么考虑到碎片是“是单个Lucene实例”,难道这不是不可能的吗?

我认为上面的内容基本上回答了这个问题,但是记住elasticsearch主要是搜索的分布式计算解决方案,这一点很重要。我们正在把工作分成多个碎片,可能还有机器。

  • 如果以后添加更多节点,如何更改这些值以跨越新节点?

一旦集群知道集群中的另一个节点,您就不需要其他操作。这些设置会自行在整个集群中传播。在上面的三个分片和两个副本的示例中,如果最初有两个节点,然后添加第三个节点,每个节点将平均有两个分片,这种分片移动不需要您的干预(同样,前提是集群知道新节点)

  • 分片在ES中如何工作?

见上文

  • 副本集在ES中如何工作?

见上文

  • 如何管理分片?我知道它是自动连接(http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/setup-configuration.html#cluster-name),但如何定义副本和碎片之间的区别?

你不必主动“管理”它。如前所述,在创建索引时定义的分片和其他所有内容都会传播到集群中的新节点。

您可以这样定义副本和碎片:

{
    "settings": {
        "index": {
            "number_of_shards": 20,
            "number_of_replicas": 1
        }
    },
    "mappings": {
        "some_type": {
            "properties": {
                "some_field": {
                    "type": "long"
                }
            }
        }
    }
}
  • 如何管理副本集?即。如何添加副本、提升初级等?

您可以通过update Indexs API完成此操作,此特定案例的文档可在以下站点找到:

http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/indexes-update-settings.html

我刚刚注意到你的编辑,请看下面:

  • 我也不确定自动发现在分布式网络上如何工作。

在YML配置文件中设置单播,如下所示:

discovery.zen.ping.multicast.enabled: false
#discovery.zen.minimum_master_nodes: 3
discovery.zen.ping.unicast.hosts: ["ip.add.r.ess", "ip.add.r.ess"]

中间的设置是一个重要的设置,但我在这里把它注释了出来。该数字应始终为(主节点数/2)+1。这是为了避免大脑分裂的情况。通常,我将所有节点设置为master calified。

这些设置是用于单播的,这也是我认为你想问的问题,而不是多播。

 类似资料:
  • 当我执行ps-aef grep elasticsearch HeapDumpOnOutOfMemoryError时看到了这一点 501 373 47 1 0 2:29pm ttys004 0:04.14/usr/bin/Java-xms4g-xmx4g-xss256k-djava.awt.headless=true-xx:+useparnewgc-xx:+useparnewgc-xx:+usepa

  • 我从ElasticSearch得到以下错误。 我在Ubuntu上运行Elasticsearch 1.7.2。 我做错了什么?

  • 我使用Elasticsearch允许用户输入要搜索的术语。例如,我要搜索以下属性'name': 如果使用以下代码搜索或,我希望返回此文档。 我尝试过做一个bool must和做多个术语,但它似乎只有在整个字符串都匹配的情况下才起作用。 所以我真正想做的是,这个词是否以任何顺序包含两个词。 有人能帮我走上正轨吗?我已经在这上面砸了一段时间了。

  • 我尝试使用https://www.elastic.co/guide/en/elasticsearch/client/java-api/current/java-docs-get.html弹性搜索文档,从我刚刚创建的索引中获取文档 我的整个代码是: 给出集群的名称(如果在ElasticSearch.yml中更改)Java ElasticSearch没有配置的节点可用NoNodeAvailableEx

  • 我正在LDAP服务器上工作。它有弹性搜索。我必须用一些Javascript代码(JSON格式)发送查询。 这是我的查询: 我试图打印所有结果,其中“server”=“server\u name”(该字段是server:server\u name…)。我认为关于弹性搜索的文档太小了。我找到了一些文档,但都是一样的,对新用户没有帮助。这个例子太简单了。 此查询返回所有结果,包括任何筛选器。 Ps:这就

  • 我知道这里提到的弹性搜索和Lucene的区别。 Lucene和Elasticsearch有什么不同 弹性搜索除了可扩展性、容错性和分布性之外,两者的核心区别是什么。 弹性搜索提供了比Lucene更好的搜索功能吗?