JAVA问答13

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介: JAVA问答13

13、详细描述一下 Elasticsearch 更新和删除文档的过程。

1、删除和更新也都是写操作,但是 Elasticsearch 中的文档是不可变的,因此不

能被删除或者改动以展示其变更;

2、磁盘上的每个段都有一个相应的.del 文件。当删除请求发送后,文档并没有真

的被删除,而是在.del 文件中被标记为删除。该文档依然能匹配查询,但是会在

结果中被过滤掉。当段合并时,在.del 文件中被标记为删除的文档将不会被写入

新段。

3、在新的文档被创建时,Elasticsearch 会为该文档指定一个版本号,当执行更新

时,旧版本的文档在.del 文件中被标记为删除,新版本的文档被索引到一个新段。

旧版本的文档依然能匹配查询,但是会在结果中被过滤掉。

14、详细描述一下 Elasticsearch 搜索的过程。

第 92 页 共 485 页1、搜索被执行成一个两阶段过程,我们称之为 Query Then Fetch;

2、在初始查询阶段时,查询会广播到索引中每一个分片拷贝(主分片或者副本分

片)。 每个分片在本地执行搜索并构建一个匹配文档的大小为 from + size 的

优先队列。

PS:在搜索的时候是会查询 Filesystem Cache 的,但是有部分数据还在 Memory

Buffer,所以搜索是近实时的。

3、每个分片返回各自优先队列中 所有文档的 ID 和排序值 给协调节点,它合并

这些值到自己的优先队列中来产生一个全局排序后的结果列表。

4、接下来就是 取回阶段,协调节点辨别出哪些文档需要被取回并向相关的分片

提交多个 GET 请求。每个分片加载并 丰富 文档,如果有需要的话,接着返回

文档给协调节点。一旦所有的文档都被取回了,协调节点返回结果给客户端。

5、补充:Query Then Fetch 的搜索类型在文档相关性打分的时候参考的是本分

片的数据,这样在文档数量较少的时候可能不够准确,DFS Query Then Fetch 增

加了一个预查询的处理,询问 Term 和 Document frequency,这个评分更准确,

但是性能会变差。*

第 93 页 共 485 页第 94 页 共 485 页

15、在 Elasticsearch 中,是怎么根据一个词找到对应的倒排索

引的?

SEE:

Lucene 的索引文件格式(1)

Lucene 的索引文件格式(2)

16、Elasticsearch 在部署时,对 Linux 的设置有哪些优化方

法?

1、64 GB 内存的机器是非常理想的, 但是 32 GB 和 16 GB 机器也是很常见的。

少于 8 GB 会适得其反。

2、如果你要在更快的 CPUs 和更多的核心之间选择,选择更多的核心更好。多

个内核提供的额外并发远胜过稍微快一点点的时钟频率。

3、如果你负担得起 SSD,它将远远超出任何旋转介质。 基于 SSD 的节点,查

询和索引性能都有提升。如果你负担得起,SSD 是一个好的选择。

4、即使数据中心们近在咫尺,也要避免集群跨越多个数据中心。绝对要避免集群

跨越大的地理距离。

5、请确保运行你应用程序的 JVM 和服务器的 JVM 是完全一样的。 在

Elasticsearch 的几个地方,使用 Java 的本地序列化。6、通过设置 gateway.recover_after_nodes、gateway.expected_nodes、

gateway.recover_after_time 可以在集群重启的时候避免过多的分片交换,这可

能会让数据恢复从数个小时缩短为几秒钟。

7、Elasticsearch 默认被配置为使用单播发现,以防止节点无意中加入集群。只

有在同一台机器上运行的节点才会自动组成集群。最好使用单播代替组播。

8、不要随意修改垃圾回收器(CMS)和各个线程池的大小。

9、把你的内存的(少于)一半给 Lucene(但不要超过 32 GB!),通过

ES_HEAP_SIZE 环境变量设置。

10、内存交换到磁盘对服务器性能来说是致命的。如果内存交换到磁盘上,一个

100 微秒的操作可能变成 10 毫秒。 再想想那么多 10 微秒的操作时延累加起

来。 不难看出 swapping 对于性能是多么可怕。

11、Lucene 使用了大量 的文件。同时,Elasticsearch 在节点和 HTTP 客户端

之间进行通信也使用了大量的套接字。 所有这一切都需要足够的文件描述符。你

应该增加你的文件描述符,设置一个很大的值,如 64,000。

补充:索引阶段性能提升方法

1、使用批量请求并调整其大小:每次批量数据 5–15 MB 大是个不错的起始点。

2、存储:使用 SSD

3、段和合并:Elasticsearch 默认值是 20 MB/s,对机械磁盘应该是个不错的设

置。如果你用的是 SSD,可以考虑提高到 100–200 MB/s。如果你在做批量导入,

完全不在意搜索,你可以彻底关掉合并限流。另外还可以增加

第 95 页 共 485 页index.translog.flush_threshold_size 设置,从默认的 512 MB 到更大一些的

值,比如 1 GB,这可以在一次清空触发的时候在事务日志里积累出更大的段。

4、如果你的搜索结果不需要近实时的准确度,考虑把每个索引的

index.refresh_interval 改到 30s。

5、如果你在做大批量导入,考虑通过设置 index.number_of_replicas: 0 关闭副

相关实践学习
使用阿里云Elasticsearch体验信息检索加速
通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
目录
相关文章
|
5月前
|
存储 安全 Java
Java 集合(List、Set、Map 等)相关问答归纳再整理
HashMap 中使用键对象来计算 hashcode 值 HashSet 使用成员对象来计算 hashcode 值,对于两个对象来说hashcode 可能相同,所以 equals() 方法用来判断对象的相等性,如果两个对象不同的话,那么返回 false。 HashMap 比较快,因为是使用唯一的键来获取对象,HashSet 较 HashMap 来说比较慢。 4.1.3 HashMap 与 TreeMap
32 2
|
移动开发 小程序 Java
良心分享:基于Java+SpringBoot+Netty+WebSocket+Uniapp轻松搭建在线互动问答程序
本文将详细介绍如何基于你自己的开源项目搭建一个在线互动问答程序,包括微信小程序和H5网页版。 该项目服务端主要使用了Java + Spring Boot + Netty + WebSocket等技术栈,聊天客户端使用的是UniApp来轻松搭建微信小程序和H5网页端。
75 1
|
存储 SQL 缓存
JAVA问答17
JAVA问答17
83 0
|
存储 SQL 缓存
JAVA问答16
JAVA问答16
121 0
|
存储 搜索推荐 Java
JAVA问答15
JAVA问答15
98 0
|
缓存 自然语言处理 监控
JAVA问答14
JAVA问答14
95 0
|
存储 缓存 运维
JAVA问答12
JAVA问答12
126 0
|
存储 自然语言处理 运维
JAVA问答11
JAVA问答11
101 0
|
存储 Dubbo 固态存储
JAVA问答10
JAVA问答10
118 0
|
设计模式 缓存 Dubbo
JAVA问答9
JAVA问答9
120 0