elasticsearch

    xiaoxiao2021-03-25  157

    主要内容主要内容 什么是Elasticsearch ES的基本概念和原理 安装和配置 Rest api 定义 ElasticSearch是一个开源的基于Lucene构建的,分布式的,RESTful搜索引擎。 Lucene 是一个基于 Java 的全文信息检索工具包,它不是一个完整的搜索应用程序,而是为你的应用程序提供索引和搜索功能。Lucene 目前是 Apache Jakarta 家族中的一个开源项目。也是目前最为流行的基于 Java 开源全文检索工具包。 Lucene只是一个java库,想要使用它,你必须使用Java来作为开发语言并将其直接集成到你的应用中。更糟糕的是,Lucene非常复杂,你需要深入了解检索的相关知识来理解它是如何工作的。 Elasticsearch也使用Java开发并使用Lucene作为其核心来实现所有索引和搜索的功能,但是它的目的是通过简单的 RESTful API 来隐藏Lucene的复杂性,从而让全文搜索变得简单。 分布式: 分布式的实时文件存储,每个字段都被索引并可被搜索 可以扩展到上百台服务器,处理PB级的数据量 应用实例 GitHub 使用Elasticsearch搜索20TB数据,包括13亿文件和1300亿行代码。 维基百科使用 Elasticsearch 来进行全文搜索并高亮显示关键词,以及提供search-as-you-type、did-you-mean等搜索建议功能 基本概念 准实时(NRT) 集群和节点 文档 索引 分片和副本 准实时(NRT) Elasticsearch 是一个准实时的搜索平台。这意味着,从索引一个文档直到这个文档能够被搜索到有一个轻微的延迟(通常是1 秒)。 集群和节点 Elasticsearch可以作为一个独立的单个搜索服务器。不过,可以运行在许多互相合作为了能够处理大型数据集,实现容错和高可用性,Elasticsearch的服务器上。这些服务器称为集群(cluster),形成集群的每个服务器称为节点(node) 集群名称默认为:elasticsearch,节点名称没有设置则由es产生。 文档(document) 存储在Elasticsearch中的主要实体叫文档(document)。 JSON格式 例: { "id": "1", "title": "New version of Elasticsearch released!", "content": "Version 1.0 released today!", "tags": ["announce", "elasticsearch", "release"] } 唯一标识符 索引/类型/唯一标识符 文档类型 在Elasticsearch中,一个索引对象可以存储很多不同类型的文档。 每一个类型都拥有自己的映射(mapping)或者结构定义,它们定义了当前类型下的数据结构。 索引index(正排索引和倒排索引) 由于从字符串到文件的映射是文件到字符 串映射的反向过程,于是保存这种信息的 索引称为倒排索引 假设我的文档集合里面有100篇文档,为了 方便表示,我们为文档编号从1到100,得

    到下面的结构

    我们要寻找既包含字符串“lucene”又包含 字符串“solr”的文档,我们只需要以下几 步: 1. 取出包含字符串“lucene”的文档链表。 2. 取出包含字符串“solr”的文档链表。 3. 通过合并链表,找出既包含“lucene”又 包含“solr”的文件。

    分片和副本(shards & replicas)

    一个索引可以存储超出单个结点硬件限制的大量数据。比如,一个具有10 亿文档的索引占据1TB 的磁盘空间,而任一节点都没有这样大的磁盘空间;或者单个节点的计算能力达不到期望的复杂功能的要求。这种情况下,可以将数据切分,每部分是一个单独的apachelucene索引,称为分片。每个分片可以被存储在集群的不同节点上。        当你创建一个索引的时候,你可以指定你想要的分片的数量。每个分片本身也是一个功能完善并且独立的“索引”,这个“索引”可以被放置到集群中的任何节点上。 分片之所以重要,主要有两方面的原因:     - 允许你水平分割/扩展你的内容容量     - 允许你在分片(潜在地,位于多个节点上)之上进行分布式的、并行的操作,进而提高性能/吞吐量     至于一个分片怎样分布,它的文档怎样聚合回搜索请求,是完全由Elasticsearch 管理的,对于作为用户的你来说,这些都是透明的。 在一个网络/云的环境里,失败随时都可能发生,在某个分片/节点不知怎么的就处于离线状态,或者由于任何原因消失了,这种情况下,有一个故障转移机制是非常有用并且是强烈推荐的。为此目的,Elasticsearch允许你创建分片的一份或多份拷贝,这些拷贝叫做复制分片,或者直接叫副本。 副本之所以重要,有两个主要原因:[高可用与高吞吐]       - 在分片/节点失败的情况下,提供了高可用性。因为这个原因,注意到副本从不与原/主要(original/primary)分片置于同一节点上是非常重要的。     - 扩展你的搜索量/吞吐量,因为搜索可以在所有的复制上并行运行     总之,每个索引可以被分成多个分片。一个索引也可以被复制0 次(意思是没有复制)或多次。一旦复制了,每个索引就有了主分片(作为复制源的原来的分片)和复制分片(主分片的拷贝)之别。分片和复制的数量可以在索引创建的时候指定。在索引创建之后,你可以在任何时候动态地改变复制的数量,但是你事后不能改变分片的数量。     ž默认情况下,Elasticsearch中的每个索引被分片5 个主分片和1 个复制,这意味着,如果你的集群中至少有两个节点,你的索引将会有5 个主分片和另外5 个复制分片(1 个完全拷贝),这样的话每个索引总共就有10 个分片。 ž 构建索引 Elasticsearch使用文档的唯一标识符来计算文档应该被放到哪个分片中。索引请求发送到一个节点后,该节点会转发文档 到持有相关分片的目标节点中。 shard = hash(routing) %number_of_primary_shards

    搜索

    ž查询发送到Elasticsearch的其中一个节点,这时发生的是一个所谓的发散阶段。查询分布到建立过索引的所有分片上。如果它建立在5个分片和1个副本基础上,那么,这5个实体分片都会被查询(不需要同时查询分片及其副本,因为它们包含相同的数据)。每个查询的分片将只返回文档的标识符和得分。发送分散查询的节点将等待所有的分片完成它们的任务,收集结果并适当排序(在这种情况下,按得分从低到高)。 ž之后,将发送一个新的请求来生成搜索结果。然而,这次请求将只发送到那些持有响应所需文档的分片上。在大多数情况下,Elasticsearch不会把请求发送到所有的分片,而只是发送给其中的一部分。这是因为通常不需要整个查询结果,只要一部分。这一阶段被称为收集阶段(gather phase)。收集完所有文档,将建立最终响应,并返回查询结果。

    安装和行安

    安装java Download zip文件 配置 Cdbin 运行./elasticsearch.bat 配置 cluster.name:skynet node.name:es160-1 path.data:/path/to/data http.port: 9200 discovery.zen.ping.unicast.hosts:["host1", "host2"] discovery.zen.ping.multicast.group: 用于多播请求的群组地址, 默认224.2.2.4

    PUT http://localhost:9200/blog/article/123

     {

      "id":"1",

      "title":"New version of  released!",

      "content":"Version 1.0 released today!",

      "author": “李意文",

      "priority":10,

      "tags":["announce", ", "release"]

    }

    检索文档

    GEThttp://localhost:9200/blog/article/123 更新文档 POST http://localhost:9200/blog/article/123/_update

    {

    "script":"ctx._source.content = \"new content\""

    }

    删除文档 DELETEhttp://localhost:9200/blog/article/123

    GET http://localhost:9200/blog/_mapping?pretty

    获取索引下的所有类型

    GET http://localhost:9200/_cat/indices?v

    列出所有的索引

    GET http://localhost:9200/blog/_search?pretty

    列出索引blog下的所有文档

    GET http://localhost:9200/blog/article/_search?pretty

    列出索引blog下article类型所有文档

    GET http://localhost:9200/_search?pretty

    列出集群中所有的文档

    GET http://localhost:9200/blog/_search?pretty&q=title:elasticsearch

                搜索blog索引中title字段包含elasticsearch一词的所有文档

    高亮显示:

    POST http://localhost:9200/blog/_search

    {

     "query": {

       "term": {

          "title":"elasticsearch"

       }

     },

     "highlight": {

       "fields": {

          "title": {

            "pre_tags": "<strong>",

            "post_tags": "</strong>"

          }

       }

     }

    }

    转载请注明原文地址: https://ju.6miu.com/read-13399.html

    最新回复(0)