• ElasticSearch


    前言

    1.Lucene简介

    Lucene是apache软件基金会4 jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,但它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引。
    引擎,部分文本分析引擎(英文与德文两种西方语言)。Lucene的目的是为软件开发人员提供一个简单易用的工具包,以方便的在目标系统中实现全文检索的功能,或者是以此为基础建立起完整的全文检索引擎。Lucene是一套用于全文检索和搜寻的开源程式库,由Apache软件基金会支持和提供。Lucene提供了一个简单却强大的应用程式接口,能够做全文索引和搜寻。在Java开发环境里Lucene是一个成熟的免费开源工具。就其本身而言,Lucene是当前以及最近几年最受欢迎的免费Java信息检索程序库。人们经常提到信息检索程序库,虽然与搜索引擎有关,但不应该将信息检索程序库与搜索引擎相混淆。Lucene是一个全文检索引擎的架构。那什么是全文搜索引擎?全文搜索引擎是名副其实的搜索引擎,国外具代表性的有Google、Fast/AllTheWeb、AltaVista、Inktomi、Teoma、WiseNut等,国内著名的有百度(Baidu)。它们都是通过从互联网上提取的各个网
    站的信息(以网页文字为主)而建立的数据库中,检索与用户查询条件匹配的相关记录,然后按一定的排列顺序将结果返回给用户,因此他们是真正的搜索引擎。从搜索结果来源的角度,全文搜索引擎又可细分为两种,一种是拥有自己的检索程序(Indexer),俗称“蜘蛛”(Spider)程序或“机器人”(Robot)程序,并自建网页数据库,搜索结果直接从自身的数据库中调用,如上面提到的7家引擎;另一种则是租用其他引擎的数据库,并按自定的格式排列搜索结果,如Lycos引擎。

    2.Solr简介

    Solr 是Apache下的一个顶级开源项目,采用Java开发,它是基于Lucene的全文搜索服务器。Solr提供了比Lucene更为丰富的查询语言,同时实现了可配置、可扩展,并对索引、搜索性能进行了优化Solr可以独立运行,运行在Jetty、Tomcat等这些Servlet容器中,Solr 索引的实现方法很简单,用 POST方法向 Solr 服务器发送一个描述 Field 及其内容的 XML 文档,Solr根据xml文档添加、删除、更新索引。Solr 搜索只需要发送 HTTP GET 请求,然后对 Solr 返回Xml、json等格式的查询结果进行解析,组织页面布局。Solr不提供构建UI的功能,Solr提供了一个管理界面,通过管理界面可以查询Solr的配置和运行情况。solr是基于lucene开发企业级搜索服务器,实际上就是封装了lucene。Solr是一个独立的企业级搜索应用服务器,它对外提供类似于Web-service的API接口。用户可以通过http请求,向搜索引擎服务器提交一定格式的文件,生成索引;也可以通过提出查找请求,并得到返回结果。

    3.Elasticsearch和Solr比较





    ElasticSearch vs Solr 总结

    • es基本是开箱即用(解压就可以用 ! ),非常简单。Solr安装略微复杂一丢丢!
    • Solr 利用 Zookeeper 进行分布式管理,而 Elasticsearch 自身带有分布式协调管理功能。
    • Solr 支持更多格式的数据,比如JSON、XML、CSV,而 Elasticsearch 仅支持json文件格式。
    • Solr 官方提供的功能更多,而 Elasticsearch 本身更注重于核心功能,高级功能多有第三方插件提
      供,例如图形化界面需要kibana友好支撑~!
    • Solr 查询快,但更新索引时慢(即插入删除慢),用于电商等查询多的应用;
      ES建立索引快(即查询慢),即实时性查询快,用于facebook新浪等搜索。
      Solr 是传统搜索应用的有力解决方案,但 Elasticsearch 更适用于新兴的实时搜索应用。
    • Solr比较成熟,有一个更大,更成熟的用户、开发和贡献者社区,而 Elasticsearch相对开发维护者
      较少,更新太快,学习使用成本较高。(趋势!)

    1.1 ElasticSearch是什么?

    Elasticsearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java语言开发的,并作为Apache许可条款下的开放源码发布,是一种流行的企业级搜索引擎。Elasticsearch用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。官方客户端在Java、.NET(C#)、PHP、Python、Apache Groovy、Ruby和许多其他语言中都是可用的。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr,也是基于Lucene。
    Elasticsearch 是一个分布式、高扩展、高实时的搜索与数据分析引擎。它能很方便的使大量数据具有搜索、分析和探索的能力。充分利用Elasticsearch的水平伸缩性,能使数据在生产环境变得更有价值。Elasticsearch 的实现原理主要分为以下几个步骤,首先用户将数据提交到Elasticsearch 数据库中,再通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据,当用户搜索数据时候,再根据权重将结果排名,打分,再将返回结果呈现给用户。
    Elasticsearch是与名为Logstash的数据收集和日志解析引擎以及名为Kibana的分析和可视化平台一起开发的。这三个产品被设计成一个集成解决方案,称为“Elastic Stack”(以前称为“ELK stack”)。
    Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。”Elasticsearch是分布式的,这意味着索引可以被分成分片,每个分片可以有0个或多个副本。每个节点托管一个或多个分片,并充当协调器将操作委托给正确的分片。再平衡和路由是自动完成的。“相关数据通常存储在同一个索引中,该索引由一个或多个主分片和零个或多个复制分片组成。一旦创建了索引,就不能更改主分片的数量。
    Elasticsearch使用Lucene,并试图通过JSON和Java API提供其所有特性。它支持facetting和percolating,如果新文档与注册查询匹配,这对于通知非常有用。另一个特性称为“网关”,处理索引的长期持久性;例如,在服务器崩溃的情况下,可以从网关恢复索引。Elasticsearch支持实时GET请求,适合作为NoSQL数据存储,但缺少分布式事务。

    1.1.1 ElasticSearch核心概念

    • cluster:代表一个集群,集群中有多个节点,其中有一个为主节点,这个主节点是可以通过选举产生的,主从节点是对于集群内部来说的。es的一个概念就是去中心化,字面上理解就是无中心节点,这是对于集群外部来说的,因为从外部来看es集群,在逻辑上是个整体,你与任何一个节点的通信和与整个es集群通信是等价的。
    • shards:代表索引分片,es可以把一个完整的索引分成多个分片,这样的好处是可以把一个大的索引拆分成多个,分布到不同的节点上。构成分布式搜索。分片的数量只能在索引创建前指定,并且索引创建后不能更改。
    • replicas:代表索引副本,es可以设置多个索引的副本,副本的作用一是提高系统的容错性,当某个节点某个分片损坏或丢失时可以从副本中恢复。二是提高es的查询效率,es会自动对搜索请求进行负载均衡。
    • recovery:代表数据恢复或叫数据重新分布,es在有节点加入或退出时会根据机器的负载对索引分片进行重新分配,挂掉的节点重新启动时也会进行数据恢复。
    • river:代表es的一个数据源,也是其它存储方式(如:数据库)同步数据到es的一个方法。它是以插件方式存在的一个es服务,通过读取river中的数据并把它索引到es中,官方的river有couchDB的,RabbitMQ的,Twitter的,Wikipedia的。
    • gateway:代表es索引快照的存储方式,es默认是先把索引存放到内存中,当内存满了时再持久化到本地硬盘。gateway对索引快照进行存储,当这个es集群关闭再重新启动时就会从gateway中读取索引备份数据。es支持多种类型的gateway,有本地文件系统(默认),分布式文件系统,Hadoop的HDFS和amazon的s3云存储服务。
    • discovery.zen:代表es的自动发现节点机制,es是一个基于p2p的系统,它先通过广播寻找存在的节点,再通过多播协议来进行节点之间的通信,同时也支持点对点的交互。
    • Transport:代表es内部节点或集群与客户端的交互方式,默认内部是使用tcp协议进行交互,同时它支持http协议(json格式)、thrift、servlet、memcached、zeroMQ等的传输协议(通过插件方式集成)。

    物理设计:
    elasticsearch在后台会把一个索引分成多个分片,每份分片可以在集群中的各个服务器之间迁移。

    elasticsearch默认启动就是一个集群,集群名就叫elasticsearch

    逻辑设计:
    我们在索引一篇文档的时候一般是按照这样的顺序来的:
    索引》类型》文档ID

    7.X版本的elasticsearch已建议用默认的文档类型:_doc,而不去使用具体的文档类型,通过后面的学习我感觉“类型”可以直接用索引指定完相关的属性,所以"类型"的所处位置有点尴尬,也不知道未来版本会不会废除这一属性。

    倒排索引

    elasticsearch使用的是一种称为倒排索引的结构,采用Lucene倒排索作为底层。这种结构适用于快速的全文搜索, 一个索引由文档中所有不重复的列表构成,对于每一个词,都有一个包含它的文档列表。 例如,现在有两个文档, 每个文档包含如下内容:

    Study every day, good good up to forever # 文档1包含的内容
    To forever, study every day, good good up # 文档2包含的内容
    

    为了创建倒排索引,我们首先要将每个文档拆分成独立的词(或称为词条或者tokens),然后创建一个包含所有不重 复的词条的排序列表,然后列出每个词条出现在哪个文档 :

    现在,我们试图搜索 to forever,只需要查看包含每个词条的文档 score

    两个文档都匹配,但是第一个文档比第二个匹配程度更高。如果没有别的条件,现在,这两个包含关键
    字的文档都将返回。

    个人感觉有点像redis中zset的排序机制:权重

    1.1.2 IK分词器

    什么叫IK分词器?

    所谓分词器就是将一句话按照词典库中的匹配信息进行分割。如果要使用中文,建议使用ik分词器!因为elasticsearch默认的分词器没有中文词典库。
    IK提供了两个分词算法:ik_smart 和 ik_max_word,其中 ik_smart 为最少切分,ik_max_word为最细粒度划分

    安装 https://github.com/medcl/elasticsearch-analysis-ik
    下载完毕之后,放入到我们的elasticsearch 插件即可!

    重启观察ES,可以看到ik分词器被加载了。

    elasticsearch-plugin 可以通过这个命令来查看加载进来的插件:

    查看不同的分词效果

    其中 ik_smart 为最少切分

    也就是说尽最大可能少分割,“xxxxx”(我吐了本来第一次发表被博客园拒绝说该词是敏感词汇)本身就可以是一个词,所以用ik_smart这种分割方式只返回一种结果。

    ik_max_word为最细粒度划分!穷尽词库的可能!字典!

    这种方式会按照词典库中的匹配信息穷举一切可能组合的有意义的词。

    词典库可自定义因为默认的词典库有可能没有相关的特殊词汇

    1.1.3 Rest风格说明

    一种软件架构风格,而不是标准,只是提供了一组设计原则和约束条件。它主要用于客户端和服务器交互类的软件。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。
    基本Rest命令说明:

    2.1 安装运行ElasticSearch

    在Elasticsearch Service上创建部署时,将自动设置一个主节点和两个数据节点。通过从tar或zip存档进行安装,您可以在本地启动Elasticsearch的多个实例,以查看多节点集群的行为。
    Linux下:

    curl -L -O https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.9.0-linux-x86_64.tar.gz
    tar -xvf elasticsearch-7.9.0-linux-x86_64.tar.gz
    cd elasticsearch-7.9.0/bin
    ./elasticsearch
    

    ElasticSearch解压即可使用,现在,您已经建立并运行了一个单节点Elasticsearch集群。

    2.1.1 如何创建多个实例

    如果想创建两个以上的ElasticSearch实例,你需要为各个节点配置唯一的数据源和日志。

    ./elasticsearch -Epath.data=data2 -Epath.logs=log2
    ./elasticsearch -Epath.data=data3 -Epath.logs=log3
    

    每一个节点都会被自动分配一个唯一的ID,这样你本地的三个节点会与第一个节点一起加入到集群里。一个集群至少有一个节点,而一个节点就是一个elasricsearch进程,节点可以有多个索引默认的,如果
    你创建索引,那么索引将会有个5个分片 ( primary shard ,又称主分片 ) 构成的,每一个主分片会有一个副本 ( replica shard ,又称复制分片 )

    使用cat health API验证三节点集群是否正在运行。cat API以比原始JSON更易于阅读的格式返回有关集群和索引的信息。
    您可以通过向Elasticsearch REST API提交HTTP请求来直接与集群交互。如果已安装并正在运行Kibana,则也可以打开Kibana并通过开发控制台提交请求。

    GET /_cat/health?v
    
    

    如果使用Kibana的话页面会显示elasticsearch集群为绿色,以及三个节点的信息。

    2.1.2 基本使用

    1、创建一个索引

    PUT /索引名/~类型名~/文档id
    {请求体}
    

    2.指定字段的类型

    返回规则信息:

    3.关于修改操作一般有两种:

    • 直接发put请求覆盖原来的请求
    • 发update请求只更新想要更新的字段信息(推荐使用这种信息)

    4.关于搜索

    GET 索引/类型/_search?q=字段名:匹配信息
    
    

    还可以做更复杂的查询:

    后面还有布尔查询,排序,过滤器,分词器,跨集群搜索,近实时搜索(缓存),长期搜索,匹配,正则表达式等等可参考官方文档:https://www.elastic.co/guide/en/elasticsearch/reference/7.x/query-dsl.html

    跟着官方文档学习是最香的!

    不写了不写太多骚操作了。。。。后面用到哪个再补充到文章后面。

  • 相关阅读:
    冒泡排序
    快速排序
    玩转git版本控制软件
    django内容总结
    ajax图片上传功能
    随机验证码
    制作博客系统
    django自带的用户认证和form表单功能
    COOKIE 与 SESSION
    Ajax知识
  • 原文地址:https://www.cnblogs.com/xhj928675426/p/13176302.html
Copyright © 2020-2023  润新知