http://127.0.0.1:9200/ ElasticSearch
http://127.0.0.1:5601/app/kibana#/dev_tools/console Kibana
注意:因为type已经过时,不建议添加_doc
ElasticSearch和Solr的联系和区别 背景:他们都是基于lucene搜索服务器基础上开发的,一款优秀的,高性能的企业级搜索服务器。【是因为他们都是基于分词技术构建的倒排索引的方式进行查询】 开发语言:java 诞生时间:solar:2004,Es:2010 Es更新一些,功能更强大 区别: 1、当实时建立索引的时候,solr会建立io阻塞,而es则不会,es查询性能要高于solr。 2、在不断动态添加数据的时候,solr的检索效率会变得低下,而Es则没什么变化 3、solr是利用zookeeper进行分布式管理,而es自身带有分布式系统管理功能。solar一般部署在web服务器上,比如tomcat,启动tomcat时候需要配置tomcat与solr的关联。solr的本质是一个动态的web项目。 4、solr支持更多的格式数据【xml,json,csv等】,而es只支持json文件格式。 5、solar是传统搜索应用的传统搜索应用的有力解决方案,但是es更适用与新兴的实时搜索应用。 单纯的对已有的数据进行检索的时候,solar效率更好,高于es。 6、solr官网提供的功能更多,而es本身更加注重于核心功能,高级功能多有第三方插件。
1.elasticsearch常见的概念
关系型数据库(比如MySql) | 非关系型数据库(比如ElasticSearch) |
---|---|
数据库(Database) | 索引(Index) |
表(Table) | 索引(Index)类型(原为Type) |
数据行(Row) | 文档(Document) |
数据列(Cloumn) | 字段(Field) |
约束(Schema) | 映射(Mapping) |
1.1.索引词(term)
在Elasticsearch中索引词(term)是一个能够被索引的精确值。foo、Foo、FOO几个单词是不同的索引词。索引词(term)是可以通过term查询进行准确的搜索。在lucene中就有索引词的概念,lucene在经过语言分析器之后就得到了索引词。
1.2.文本(text)
文本是一段普通的非结构化文字。通常,文本会被分析成一个个的索引词,存储在Elasticsearch的索引库中。为了让文本能够进行搜索,文本字段需要事先进行分析;当对文本中的关键词进行查询的时候,搜索引擎应该根据搜索条件搜索出原文本。在lucene中就有String Field域,String类型的Field域不支持分词,支持索引和存储。
1.3.节点(node)
节点是组成Elasticsearch集群的基本服务单元,集群中的每个运行中的Elasticsearch服务器都可称之为节点。
1.4.集群(cluster)
集群由一个或多个节点组成,对外提供服务,对外提供索引和搜索功能。
Elasticsearch的集群是由具有相同cluster.name (默认值为elasticsearch)。此名称是很重要的,因为每个节点只能是集群的一部分,当该节点被设置为相同的集群名称时,就会自动加入集群。当需要有多个集群的时候,要确保每个集群的名称不能重复,否则,节点可能会加入错误的集群。
请注意,一个节点只能加入一个集群。
在Elasticsearch集群中,节点的状态有Green、Yellow和Red三种,分别如下所述。
① Green:绿色,表示节点运行状态为健康状态。所有的主分片和副本分片都可以正常工作,集群100%健康。
② Yellow:黄色,表示节点的运行状态为预警状态。所有的主分片都可以正常工作,但至少有一个副本分片是不能正常工作的。此时集群依然可以正常工作,但集群的高可用性在某种程度上被弱化。
③ Red:红色,表示集群无法正常使用。此时,集群中至少有一个分片的主分片及它的全部副本分片都不可正常工作。虽然集群的查询操作还可以进行,但是也只能返回部分数据(其他正常分片的数据可以返回),而分配到这个有问题分片上的写入请求将会报错,最终导致数据丢失。
1.5.分片(shard)
分片。当索引的数据量太大时,受限于单个节点的内存、磁盘处理能力等,节点无法足够快地响应客户端的请求,此时需要将一个索引上的数据进行水平拆分。拆分出来的每个数据部分称之为一个分片。一般来说,每个分片都会放到不同的服务器上。进行分片操作之后,索引在规模上进行扩大,性能上也随之水涨船高的有了提升。Elasticsearch依赖Lucene,Elasticsearch中的每个分片其实都是Lucene中的一个索引文件,因此每个分片必须有一个主分片和零到多个副本分片。
当一个设置有多分片的索引中写入数据时,是通过路由来确定具体写入哪个分片中的,因此在创建索引时需要指定分片的数量,并且分片的数量一旦确定就不能更改。当查询索引时,需要在索引对应的多个分片上进行查询。Elasticsearch会把查询发送给每个相关的分片,并汇总各个分片的查询结果。对上层的应用程序而言,分片是透明的,即应用程序并不知道分片的存在。
在Elasticsearch中,默认为一个索引创建5个主分片,并分别为每个主分片创建一个副本。
1.6.复制(replica)
即备份,也可称之为副本。副本指的是对主分片的备份,这种备份是精确复制模式。
每个主分片可以有零个或多个副本,主分片和备份分片都可以对外提供数据查询服务。
当构建索引进行写入操作时,首先在主分片上完成数据的索引,然后数据会从主分片分发到备份分片上进行索引。
当主分片不可用时,Elasticsearch会在备份分片中选举出一个分片作为主分片,从而避免数据丢失。一方面,备份分片既可以提升Elasticsearch系统的高可用性能,又可以提升搜索时的并发性能;另一方面,备份分片也是一把双刃剑,即如果备份分片数量设置得太多,则在写操作时会增加数据同步的负担。
1.7.路由(routing)
当存储一个文档的时候,它会存储在唯一的主分片中,具体哪个分片是通过散列值进行选择。(所以路由就是计算散列值计算需要路由到哪个分片)
默认情况下,这个值是由文档的ID生成。如果文档有一个指定的父文档,则从父文档ID中生成,该值可以在存储文档的时候进行修改。
注意:每个Elasticsearch分片是一个Lucene的索引。有文档存储数量限制,你可以在一个单一的Lucene索引中存储的最大值为lucene-5843,极限是2147483519(=integer.max_value-128)个文档。你可以使用_cat/shards API监控分片的大小。
1.8.索引(index)
索引是具有相同结构的文档集合。类似的数据放在一个索引,非类似的数据放不同索引, 一个索引也可以理解成一个关系型数据 库。
lucene中就有document文档的操作,其实就是对索引的操作。
例如,可以有一个客户信息的索引,包括一个产品目录的索引,一个订单数据的索引。
在系统上索引的名字全部小写,通过这个名字可以用来执行索引、搜索、更新和删除操作等。在单个集群中,可以定义多个你想要的索引。
1.9.类型(type)
在索引中,可以定义一个或多个类型,类型是索引的逻辑分区。在一般情况下,一种类型被定义为具有一组公共字段的文档。
代表document属于index中的哪个类别(type)也有一种说法一种type就像是数据库的表,
比如 dept 表, user 表。 在查询时如果没有该值,则表示需要在整个索引中查询。
例如,让我们假设你运行一个博客平台,并把所有的数据存储在一个索引中。在这个索引中,你可以定义一种类型为用户数据,一种类型为博客数据,另一种类型为评论数据。
ES 5.x 中一个 index 可以有多种 type 。 ES 6.x 中一个 index 只能有一种 type 。 ES 7.x 以后 要逐渐移除 type 这个概念。默认索引的类型都是_doc
1.10.文档(document)
文档是存储在Elasticsearch中的一个JSON格式的字符串。它就像在关系数据库中表的一行。
每个存储在索引中的一个文档都有一个类型和一个ID,每个文档都是一个JSON对象,存储了零个或者多个字段,或者键值对。
原始的JSON文档被存储在一个叫作_source的字段中。当搜索文档的时候默认返回的就是这个字段。
1.11.设置(Settings)
Settings是对集群中索引的定义信息,比如一个索引默认的分片数、副本数等。
1.12.映射(mapping)
映射像关系数据库中的表结构,每一个索引都有一个映射,它定义了索引中的每一个字段类型,以及一个索引范围内的设置。
mapping定义了每个字段的类型等信息。相当于关系型数据库中的表结构。
常用数据类型: text 、 keyword 、 number 、 array 、 range 、 boolean 、 date 、 geo_point 、 ip 、 nested 、 object Mapping表示中保存了定义索引中字段(Field)的存储类型、分词方式、是否存储等信息,其实就是底层对lucene中Field域的配置。也有点类似于关系数据库(如MySQL)中的表结构信息。
在Elasticsearch中,Mapping是可以动态识别的。如果没有特殊需求,则不需要手动创建Mapping,因为Elasticsearch会根据数据格式自动识别它的类型。
当需要对某些字段添加特殊属性时,如定义使用其他分词器、是否分词、是否存储等,就需要手动设置Mapping了。
一个索引的Mapping一旦创建,若已经存储了数据,就不可修改了。
1.13.分析(analysis)
Analyzer表示的是字段分词方式的定义。一个Analyzer通常由一个Tokenizer和零到多个Filter组成。在Elasticsearch中,默认的标准Analyzer包含一个标准的Tokenizer和三个Filter,即Standard Token Filter、Lower CaseToken Filter和Stop Token Filter。
1.14.字段(field)
文档中包含零个或者多个字段,字段可以是一个简单的值(例如字符串、整数、日期),也可以是一个数组或对象的嵌套结构。字段类似于关系数据库中表的列。每个字段都对应一个字段类型,例如整数、字符串、对象等。字段还可以指定如何分析该字段的值。
lucene中,一个document就是有多个Field组成的。Field由3大属性组成存储类型、分词方式、是否存储等信息
1.15.来源字段(source field)
默认情况下,你的原文档将被存储在_source这个字段中,当你查询的时候也是返回这个字段。这允许你可以从搜索结果中访问原始的对象,这个对象返回一个精确的JSON字符串,这个对象不显示索引分析后的其他任何数据。
1.16.主键(ID)
ID是一个文件的唯一标识,如果在存库的时候没有提供ID,系统会自动生成一个ID,文档的index/type/id必须是唯一的。
2.操作ES
2.1创建索引
语法:
PUT /索引名称 { "mappings":{ "properties":{ "列名":{ "type":"数据类型" }, "列名":{ "type":"数据类型" },... } } } ---支持的数据类型: text: 文本类型 integer: float,double,long......数字类型 date: 时间类型
2.2删除索引
2.3查看ES中所有的索引
GET /_cat/indices?v
2.4查看ES中指定索引的结构
GET /索引名
2.5添加文档---记录
2.5.1添加时制定了id的值
PUT /索引名/_doc/id
{json数据}
2.5.2添加时没有指定id的值
POST /索引名/_doc
{json数据}
2.6查询文档--根据id查询
GET /索引名/_doc/id
2.7删除文档--根据id删除
DELETE /索引名/_doc/id
2.8修改文档
2.8.1第一种修改 全列修改
PUT /索引名/_doc/id
{"列名":"值"} ------列全部指明,否则未指明列会丢失
2.8.2第二种修改 部分列修改
POST /索引名/doc/id/update ------可修改部分列
2.9详细查询文档
GET /funain-es01/doc/search { "query": { "match_all": {} } }
查询全部数据
2.9.1理解为传递参数,在地址栏?传参
GET /funain-es01/doc/search?q=name:OPSLIO&q=age:25
2.9.2查询时传递json参数
单条件查询 match匹配查询 range范围查询
GET /索引名/doc/search
{
"query":{
"match":{
"name":"孔"
}
}
}
多条件查询,也可单条件
GET /索引名/doc/search
{
"query":{
"range":{
"age":{
"gt":20,
"lt":25
}
}
}
}
2.9.3查询部分列(指定列名)
GET /索引名/doc/search
{"query":{"range":{"gt":20,"lt":28}},"_source":["name","age"]}
2.9.4查询并排序
GET /索引名/doc/search
{"query":{"range":{"gt":20,"lt":28}},"_source":["name","age"],"sort":[{"age":{"order":"asc"}}]}
text类型不能排序
2.9.5查询并分页
GET /索引名/doc/search
{"query":{"range":{"gt":20,"lt":28}},"_source":["name","age"],"sort":[{"age":{"order":"asc"}}],"from":1,"size":0}
2.9.6多条件查询
-
must 相当于 and
-
should 相当于 or
-
must_not 相当于 not(... and ...)
2.9.10高亮查询
如果是汉字,默认拆分为一个一个字符
如果是拼音不会拆分