文章目录
ElasticSearch 第一部分总结及测试
第一部分总结与回顾:
产品与使用场景
- ElasticSearch 是一个开源的分布式搜索与分析引擎,提供了
近实时搜索
和聚合
两大功能 - Elastic Stack 包括 ElasticSearch,Kibana,Logstash,Beats 等一系列产品
- ElasticSearch 是核心引擎,提供了海量数据的存储,搜索和聚合的能力。
- Logstash 是用来做数据转换
- Kibana 是提供了丰富的可视化展现于分析的功能
- Beats 是轻量级的数据采集器
- Elastic Stack 主要被广泛应用于:搜索,日志管理,安全分析,指标分析,业务分析,应用性能监控等多个领域
- Elastic Stack 开源了 X-Pack 在内的相关代码。
- 作为商业解决方案,X-Pack 的部分功能需要收费。7.1后,Security 功能可以免费使用
- 相比关系型数据库,ElasticSearch 提供了如 模糊查询、搜索条件的算分等 关系型数据库不擅长的功能,但在事务性等方面,也不如关系型数据库的强大。因此,在实际生产环境中,需要考虑具体业务要求,综合使用
基本概念
-
一个 ElasticSearch 集群可以运行在单节点上,也支持运行在多个服务器上,实现数据和服务的水平扩展
-
从逻辑角度看,索引是一些具有相似结构的文档的集合
-
物理角度看,分片是一个 Lucene 的实例。
- 分片存储了索引的具体数据
- 分片可以分布在不同节点上
- 副本分片除了提高数据的可靠性,还能一定程度提升集群的查询性能
-
ElasticSearch 的文档可以试任意的 JSON 格式的数据
-
将文档写入 ElasticSearch 的过程叫做索引(indexing)
-
ElasticSearch 提供了REST API 和 Transport API 两种方式,建议用 REST API
ElasticSearch 的两大基本功能:搜索和聚合
-
Precosion 指除了相关的结果,还返回了多少不想关的结果
-
Recall 衡量有多少相关的结果,实际上并没有返回
-
精确值包括:数字、日期、和某些具体的字符串、keyword,精确词不需要被分词
-
全文本:是需要被检索的非结构文本
-
Analyis 是将文本转换成倒排索引的 Terms 的过程
-
ElasticSearch 的 Analyzer 是 Char_filter -> Tokenizer -> Token Filter 的过程
-
要善于用 _analyze API 去测试 Analyzer
-
ElasticSearch 提供了 Bucket / Pipeline / Matrix 四种方式的聚合
文档的CRUD 与 文档 Index Mapping
- 除了CRUD 操作外,ElasticSearch 还提供了 bulk,mget,msearch 等操作
- 从新能的角度上说,建议使用,以提升性能。但是单词操作的数据量不要过大,一面引发性能问题
- 每个索引都有一个 Mapping 定义
- 包括文档的字段及类型,字段的 Analyzer 的相关配置
- Mapping 可以被动态的创建,为了避免一些错误类型的推算或者满足你的特定需求,可以显式的定义Mapping
- 可以在 Mapping 中定制 Analyzer ,可以为字段指定定制化的 Analyzer ,也可以在查询字符串指定 search_analyzer
- Index Template 可以定义 Mappings 和 Settings,并自动的应用到新创建的索引之上,建议要合理的使用 Index Template
- Dynamic Template 支持在具体的索引上定制规则,为新增加的字段指定相应的 Mappings
小测试
-
ES 支持使用HTTP PUT 写入新文档,并通过 ElasticSearch 自动生成文档 ID
错误。
ES 支持使用HTTP PUT 写入新文档(index/create),但是不能自动生成文档 ID,POST 写入新文档时可以自动生成 ID
-
Update 一个文档,需要使用 HTTP PUT
错误。
PUT 只支持create、index 创建文档
Update 文档需要用 POST
-
Index 一个已存在的文档,旧的文档会仙贝删除,新的文档再被写入,同时版本号加一
正确
-
尝试描述创建一个新的文档到一个不存在的索引中,背后会发生一些什么?
默认情况下,会自动创建相应的索引,并自己设置 Mapping,当然,实际情况还要看是否有合适的 Index Template
-
ES7 中合法的 type 是什么?
ES7 中,一个索引只能有一个 type,是 _doc
-
精确值和全文本的本质区别是什么?
精确值指的是 :数值、日子、整体的字符串、keyword
全文本指的是:非结构化的字符串
精确值不需要被 Analyzer 分词,全文本会
-
Analyzer 由哪几部分组成?
Character Filters :去除一些字符串,如:html标签、自定义正则替换等
Tokenizer : 切分词的规则,如:按空格、中文词语等
Token Filter : Tokenizer 分词后的结果进行再加工,包括字符处理,过滤,删除等操作,如 :转小写、去除停用词、添加同义词等
-
尝试描述 match 和 match_phrase 的区别
match 中的terms 之间是 OR 的关系,
match_phrase 的terms 之间是 AND 的关系,并且 term 之间的位置关系也会影响搜索的结果
-
如果你希望 match_phrase 匹配到更多结果,你应该配置查询中的什么参数?
slop
slop参数告诉match_phrase查询词条能够相隔多远时仍然将文档视为匹配。
GET /my_index/_search { "query": { "match_phrase": { "title": { "query": "abc ccc", "slop": 1 } } } }
-
如果 Mapping 的 dynamic 设置为 “strict” ,索引一个包含新正字段的文档会发生什么?设置为 ”false“ 呢?
如果 Mapping 的 dynamic 为 “strict”,会直接报错
如果为 false,整个文档是可以被索引的,新的字段在 _source 可见,但该字段不能被搜索
-
可以把一个字段的类型从 ”integer“ 改成 ”long“ ,因为这两个类型是兼容的
错误。
字段类型修改,需要 reindex
-
你可以在 Mapping 文件中为 indexing 和 searching 指定不同的 analyzer
可以
PUT products { "mappings": { "properties": { "content": { "type": "text", "analyzer": "ik_max_word", "search_analyzer": "ik" } } } }
-
字段类型为 Text 的字段,一定可以被全文搜索
不一定,如果字段的 index 设置为 false,则不会被索引
PUT myindex/ { "mappings": { "properties": { "name":{ "type": "text", "index": false } } } }