实际工作中用到的ElasticSearch

es入门

概述

Elasticsearch基于Lucene(搜索引擎库)的开源搜索引擎,对外提供一系列基于Java和HTTP的API, 目的是通过简单的RESTful API来隐藏Lucene的复杂性。

具有以下特点:

  1. 支持全文检索

  2. 分布式的实时文件存储,每个字段都被索引并可被搜索

  3. 分布式的实时分析搜索引擎

可以对照数关系型据库来理解Elasticsearch的有关概念。

关系型数据库(Relational DB)Elasticsearch(搜索引擎)
数据库(Databases)Indices
表(Tables)Types
行(Rows)Documents
字段(Columns)Fields

Elasticsearch集群可以包含多个索引(indices)(数据库),每一个索引可以包含多个类型(types)(表),每一个类型包含多个文档(documents)(行),然后每个文档包含多个字段(Fields)(列)。

索引

索引只是一个把一个或多个分片分组在一起的逻辑空间。可以把索引看成关系型数据库的表。 然而,索引的结构是为快速有效的全文索引准备的,特别是它不存储原始值。

Elasticsearch 可以把索引存放在一台机器或者分散在多台服务器上,每个索引有一或多个分片(shard),每个分片可以有多个副本(replica)。发送一个新的文档给集群时,你指定一个目标索引并发送给它的任意一个节点。这个节点知道目标索引有多少分片,并且能够确定哪个分片应该用来存储你的文档。可以更改Elasticsearch的这个行为。现在你需要记住的重要信息是,Elasticsearch使用文档的唯一标识符来计算文档应该被放到哪个分片中。索引请求发送到一个节点后,该节点会转发文档到持有相关分片的目标节点中。

一次索引操作

img

img

检索

尝试用文档标识符来获取文档时,发送查询到一个节点,该节点使用同样的路由算法来决定持有文档的节点和分片,然后转发查询,获取结果,并把结果发送给你。另一方面,查询过程更为复杂。除非使用了路由,查询将直接转发到单个分片,否则,收到查询请求的节点会把查询转发给保存了属于给定索引的分片的所有节点,并要求获取查询匹配的文档的最少信息(默认情况下是标识符和得分)。这个过程称为发散阶段(scatter phase)。收到这些信息后,该聚合节点(收到客户端请求的节点)对结果排序,并发送第2个请求来获取结果列表所需的文档(除了标识符和得分以外的所有信息)。这个阶段称为收集阶段(gather phase)。这个阶段执行完毕后,结果返回到客户端。

一次查询请求:

curl -X GET http://localhost:9200/megacorp/employee/1?

img

img

文档

存储在Elasticsearch中的主要实体叫文档(document)。用关系型数据库来类比的话,一个文档相当于数据库表中的一行记录。相同字段必须有相同类型,文档由多个字段组成,每个字段可能多次出现在一个文档里,这样的字段叫多值字段(multivalued)。每个字段有类型,如文本、数值、日期等。字段类型也可以是复杂类型,一个字段包含其他子文档或者数组。字段类型在Elasticsearch中很重要,因为它给出了各种操作(如分析或排序)如何被执行的信息。幸好,这可以自动确定,然而,我们仍然建议使用映射。与关系型数据库不同,文档不需要有固定的结构,每个文档可以有不同的字段,此外,在程序开发期间,不必确定有哪些字段。当然,可以用模式强行规定文档结构。 从客户端的角度看,文档是一个JSON对象(关于JSON格式的更多内容,参见http://en.wikipedia.org/wiki/JSON)。每个文档存储在一个索引中并有一个Elasticsearch自动生成的唯一标识符和文档类型。文档需要有对应文档类型的唯一标识符,这意味着在一个索引中,两个不同类型的文档可以有相同的唯一标识符。

文档类型

在Elasticsearch中,一个索引对象可以存储很多不同用途的对象。例如,一个博客应用程序可以保存文章和评论。 文档类型让我们轻易地区分单个索引中的不同对象。每个文档可以有不同的结构,但在实际部署中,将文件按类型区分对数据操作有很大帮助。当然,需要记住一个限制,不同的文档类型不能为相同的属性设置不同的类型。例如,在同一索引中的所有文档类型中,一个叫title的字段必须具有相同的类型

映射

模式映射(schema mapping,或简称映射)用于定义索引结构。Elasticsearch在映射中存储有关字段的信息。每一个文档类型都有自己的映射,即使我们没有明确定义。映射在文件中以JSON对象传送。所以,创建一个映射文件来匹配上述需求,称之为mapping.json。其内容如下:

{
    "mappings": {
        "post": {
            "properties": {
                "id": {"type":"long", "store":"yes",
                            "precision_step":"0" },
                "name": {"type":"string", "store":"yes",
                            "index":"analyzed" },
                "published": {"type":"date", 
                                "store":"yes", 
                                 precision_step":"0" },
                "contents": {"type":"string", 
                                "store":"no",
                                "index":"analyzed" }
            }
        }
    }
}

使用上述文件创建posts索引,运行命令:

curl -XPOST 'http://localhost:9200/posts' -d @mapping.json

分片

当有大量的文档时,由于内存的限制、硬盘能力、处理能力不足、无法足够快地响应客户端请求等,一个节点可能不够。在这种情况下,数据可以分为较小的称为分片(shard)的部分(其中每个分片都是一个独立的Apache Lucene索引)。每个分片可以放在不同的服务器上,因此,数据可以在集群的节点中传播。 当你查询的索引分布在多个分片上时,Elasticsearch会把查询发送给每个相关的分片,并将结果合并在一起,而应用程序并不知道分片的存在。此外,多个分片可以加快索引。

副本

为了提高查询吞吐量或实现高可用性,可以使用分片副本。副本(replica)只是一个分片的精确复制,每个分片可以有零个或多个副本。换句话说,Elasticsearch可以有许多相同的分片,其中之一被自动选择去更改索引操作。这种特殊的分片称为主分片(primary shard),其余称为副本分片(replica shard)。在主分片丢失时,例如该分片数据所在服务器不可用,集群将副本提升为新的主分片。

es-head简介

elasticsearch有很多的插件来丰富它的功能。此处,我们推荐使用elasticsearch-head。

elasticsearch-head是一个界面化的集群操作和管理工具,可以对集群进行傻瓜式操作。你可以通过插件把它集成到es(首选方式),也可以安装成一个独立webapp。

操作

  1. 显示集群的拓扑,并且能够执行索引和节点级别操作
  2. 搜索接口能够查询集群中原始json或表格格式的检索数据
  3. 能够快速访问并显示集群的状态
  4. 有一个输入窗口,允许任意调用RESTful API。
    这个接口包含几个选项,可以组合在一起以产生有趣的结果;
     1. 请求方法(get、put、post、delete),查询json数据,节点和路径
     2. 支持JSON验证器
     3. 支持重复请求计时器
     4. 支持使用javascript表达式变换结果
     5. 收集结果的能力随着时间的推移(使用定时器),或比较的结果
     6. 能力图表转换后的结果在一个简单的条形图(包括时间序列)

github

https://github.com/mobz/elasticsearch-head

es-head查看

在浏览器打开127.0.0.1:9200/_plugin/head/,查看到界面表示安装成功。

寄语

es在我上家公司的应用,是搭建了一个单节点的es服务,用于实现全站搜索功能,他可以按照自定义的查询条件和匹配程度给我数据集合,安装简单,有es-head,使用方便,使用restful方式。

es在各大互联网公司还是很常见的一门技术,所以推荐大家学习下,我个人的es实战积累不多。所以列下清单,一起成长。

web开发者知识体系

干货 | BAT等一线大厂 Elasticsearch面试题解读

elasticsearch面试必考(亲身经历的问题)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Java 使用 Elasticsearch,需要引入 Elasticsearch 的 Java 客户端库,官方提供了一个 Java 客户端库,称为 Elasticsearch Java High Level REST Client。以下是 Elasticsearch Java 客户端的使用步骤: 1. 添加依赖:在 Maven 项目,需要在 pom.xml 文件添加 Elasticsearch Java 客户端的依赖: ``` <dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>elasticsearch-rest-high-level-client</artifactId> <version>7.15.0</version> </dependency> ``` 2. 创建客户端:在 Java 代码,首先需要创建一个 Elasticsearch 客户端对象,该对象是与 Elasticsearch 进行交互的入口: ``` RestClientBuilder builder = RestClient.builder(new HttpHost("localhost", 9200)); RestHighLevelClient client = new RestHighLevelClient(builder); ``` 3. 执行操作:创建客户端对象后,就可以执行各种 Elasticsearch 操作了。以下是一些 Elasticsearch Java 客户端的常用操作: - 创建索引 ``` CreateIndexRequest request = new CreateIndexRequest("my_index"); CreateIndexResponse response = client.indices().create(request, RequestOptions.DEFAULT); ``` - 插入文档 ``` IndexRequest request = new IndexRequest("my_index").id("1").source("{\"name\":\"John\", \"age\":30}", XContentType.JSON); IndexResponse response = client.index(request, RequestOptions.DEFAULT); ``` - 搜索文档 ``` SearchRequest request = new SearchRequest("my_index"); SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); sourceBuilder.query(QueryBuilders.matchQuery("name", "John")); request.source(sourceBuilder); SearchResponse response = client.search(request, RequestOptions.DEFAULT); ``` - 删除索引 ``` DeleteIndexRequest request = new DeleteIndexRequest("my_index"); AcknowledgedResponse response = client.indices().delete(request, RequestOptions.DEFAULT); ``` 这些只是 Elasticsearch Java 客户端的一部分操作,Elasticsearch Java 客户端还提供了很多其他功能,例如聚合、过滤、分词等,可以根据实际需求进行使用。 4. 关闭客户端:在程序结束时,需要关闭 Elasticsearch 客户端对象,释放资源: ``` client.close(); ``` 总之,Elasticsearch Java 客户端提供了非常方便和灵活的 Elasticsearch 操作方式,可以在 Java 应用程序方便地使用 Elasticsearch 进行搜索和分析操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值