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引擎。
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请求,向搜索引擎服务器提交一定格式的文件,生成索引;也可以通过提出查找请求,并得到返回结果。
ElasticSearch vs Solr 总结
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数据存储,但缺少分布式事务。
物理设计:
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的排序机制:权重
什么叫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为最细粒度划分!穷尽词库的可能!字典!
这种方式会按照词典库中的匹配信息穷举一切可能组合的有意义的词。
词典库可自定义因为默认的词典库有可能没有相关的特殊词汇
一种软件架构风格,而不是标准,只是提供了一组设计原则和约束条件。它主要用于客户端和服务器交互类的软件。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。
基本Rest命令说明:
在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集群。
如果想创建两个以上的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集群为绿色,以及三个节点的信息。
1、创建一个索引
PUT /索引名/~类型名~/文档id
{请求体}
2.指定字段的类型
返回规则信息:
3.关于修改操作一般有两种:
4.关于搜索
GET 索引/类型/_search?q=字段名:匹配信息
还可以做更复杂的查询:
后面还有布尔查询,排序,过滤器,分词器,跨集群搜索,近实时搜索(缓存),长期搜索,匹配,正则表达式等等可参考官方文档:https://www.elastic.co/guide/en/elasticsearch/reference/7.x/query-dsl.html
跟着官方文档学习是最香的!
不写了不写太多骚操作了。。。。后面用到哪个再补充到文章后面。
原文:https://www.cnblogs.com/xhj928675426/p/13176302.html