大家好,我是北君。我们在做电商网站的时候,如果直接用传统的数据库来搜索数据,在数据库内容比较少的时候勉强能做到及时搜索,但是如果数据库里面有几十万条数据,你还是用传统的方式搜索数据库需要等待很长时间,影响用户体验,所以一般的数据搜索引擎都是使用Elasticsearch来搜索。一、Elasticsearch简介全文搜索是最常见的需求,开源的Elasticsearch是目前全文搜索引擎的首选。它可以快速存储、搜索和分析海量数据。维基百科、StackOverflow、Github都在使用它。Elasticsearch是一个分布式、可扩展的实时搜索和分析引擎,是一个基于全文搜索引擎ApacheLucene?的搜索引擎。Lucene只是一个框架。要充分利用它的功能,需要使用JAVA,在程序中集成Lucene,学习成本高,而且Lucene确实很复杂。文档:官方文档:https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html官方中文(很老的版本,2.x):https://www.elastic.co/guide/cn/elasticsearch/guide/current/foreword_id.html2.基本概念2.1索引(index)ES将数据存储在一个或多个索引中。与传统的关系数据库领域相比,索引相当于一个数据库或者SQL中的一种数据存储方案(schema)。索引由其名称标识,名称必须全部为小写字符。ES集群中可以按需创建任意数量的索引。2.2类型类型是索引内部的逻辑分区(category/partition),一个索引内部可以定义一种或多种类型(type)。类比传统的关系数据库领域,一个类型就相当于一张“表”。ElasticSearch7—去掉了类型的概念:关系型数据库中的两种数据表示是独立的,即使有同名的列也不影响使用,但在ES中却不是这样。Elasticsearch是基于Lucene开发的搜索引擎,ES中不同类型的同名文件最终在Lucene中以相同的方式处理。两个不同类型下的两个user_name实际上被认为是ES的同一个index下的同一个filed。您必须以两种不同的类型定义相同的字段映射。否则在处理过程中会突然出现不同类型的相同字段名,导致Lucene处理效率下降。去除类型的目的是提高ES处理数据的效率。ES7.xURL中的类型参数是可选的。例如,索引文档不再需要文档类型。ES8.X不再支持URL中的类型参数。解决方案:将索引从多类型迁移到单类型,每种类型的文档一个独立的索引,可以将现有索引下所有类型的数据迁移到指定位置。详见数据迁移2.3文档(Document)文档是索引和查找的原子单位。),每个域都有一个名称和一个或多个值,具有多个值的域通常称为“多值域”,文档基于JSON格式表示。每个文档可以存储一组不同的域,但相同类型的文档应该有一定程度的相似性。简单的说就是:某种类型(Type)的数据(Document)存储在某个索引(index)下。文档是JSON格式的,Document就像MySQL中Table中的内容。2.4Cluster(集群)由一个或多个具有相同cluster.name配置的节点组成,它们分担数据和负载的压力。2.5节点(Node)一个运行中的Elasticsearch实例称为节点。ES集群中有三种不同类型的节点:Master节点:负责管理集群内的所有变更,比如增删索引,或者增删节点等,Master节点不需要参与操作例如文档级更改和搜索。可以通过属性node.master进行设置。数据节点:存储数据及其对应的倒排索引。默认情况下,每个节点都是一个数据节点(包括主节点),可以通过node.data属性进行设置。Coordinator节点:如果node.master和node.data属性都为false,则该节点称为协调节点,用于响应客户请求,均衡各节点负载。3.倒排索引Invertedindex:倒排索引也叫反向索引。一般来说,正向索引通过key找到value,反向索引通过value找到key。将每个要存储的文档切分,然后存储每个词和它所在的记录。搜索时,首先搜索包含其关键字的记录,然后计算记录的相关分数,得到最终的搜索结果。4.Docker安装Elasticsearch4.1并下载镜像文件dockerpullelasticsearch:7.4.2#存储和检索数据dockerpullkibana:7.4.2#可视化检索数据4.2创建实例①Elasticsearch配置:mkdir-p/mydata/elasticsearch/config#用来存放配置文件mkdir-p/mydata/elasticsearch/data#Dataecho"http.host:0.0.0.0">/mydata/elasticsearch/config/elasticsearch.yml#允许任何机器访问chmod-R777/mydata/elasticsearch/##设置elasticsearch文件读写权限启动:dockerrun--nameelasticsearch-p9200:9200-p9300:9300\-e"discovery.type=single-node"\-eES_JAVA_OPTS="-Xms64m-Xmx512m"\-v/mydata/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml\-v/mydata/elasticsearch/data:/usr/share/elasticsearch/data\-v/mydata/elasticsearch/plugins:/usr/share/elasticsearch/plugins\-delasticsearch:7.4.2设置开启自启动:dockerupdateelasticsearch--restart=alwaysSpec特别注意:-eES_JAVA_OPTS="-Xms64m-Xmx128m"\在测试环境中,设置ES的初始内存和最大内存,否则会太大而无法启动ES测试:②Kibanadockerrun--namekibana-eELASTICSEARCH_HOSTS=http://192.168.88.14:9200-p5601:5601-dkibana:7.4.2上面的ip地址:http://192.168.88.14:9200改成自己Elasticsearch上测试的地址:
