Index Template
- Index Templates -帮助你设定Mappings和Settings, 并按照一-定的规则,自动匹配到新创建的索引之上
- 模版仅在一个索引被新创建时,才会产生作用。修改模版不会影响已创建的索引
- 你可以设定多个索引模版,这些设置会被“merge"在一 起
- 你可以指定 “order”的数值,控制“merging’ 的过程
PUT _template/template_default
{
"index_ patterns": ["*"],
"order" : 0,
"version": 1,
settings": {
//主分片
"number_ of_ shards": 1,
副本分片
"number_ of_ replicas":1
}
}
PUT _template/template_test
{
"index_ patterns" : ["test*"],
"order" : 1,
"settings" : {
"number_ of .shards": 1,
"number_ of replicas" : 2
},
"mappings"{
"date_ detection": false,
"numeric_ detection": true
}
}
Index Template的工作方式
- 当一个索 引被新创建时
- 应用Elasticsearch默认的settings和mappings
- 应用order数值低的Index Template中的设定
- 应用order高的Index Template中的设定,之前的设定会被覆盖
- 应用创建 索引时,用户所指定的Settings和Mappings,并覆盖之前模版中的设定
Aggregation
- Elasticsearch除搜索以外,提供的针对ES数据进行统计分析的功能
- 实时性高
- Hadoop (T+1)
- 通过聚合, 我们会得到一个数据的概览,是分析和总结全套的数据,而不是寻找单个文档
- 尖沙咀和香港岛的客房数量
- 不同的价格区间,可预定的经济型酒店和五星级酒店的数量
- 高性能, 只需要一-条语句,就可以从Elasticsearch得到分析结果
- 无需在客户端自己去实现分析逻辑
集合的分类
- Bucket Aggregation -一些列满足特定条件的文档的集合
- Metric Aggregation-一些数学运算,可以对文档字段进行统计分析
- Pipeline Aggregation -对其他的聚合结果进行二次聚合
- Matrix Aggregration-支持对多个字段的操作并提供一个结果矩阵
测试
- 判断题: ES支持使用HTTP PUT写入新文档,并通过Elasticsearch 生成文档Id
错,写入新文档用POST命令创建 - 判断题: Update 一个文档,需要使用HTTP PUT
错,update文档,用POST,PUT只能用来做index或者Create - 判断题: Index 一个已存在的文档,旧的文档会先被删除,新的文档再被写入,同时版本号加1
对 - 尝试描述创建一 个新的文档到一个不存在的索引中,背后会发生一些什么?
默认情况下会自动创建相应的索引,并且自己设置Mapping - ES 7中的合法的type是什么?
_doc - 精确值和全文本的本质区别是什么?
精确值不会被Analyzer分词,全文本会 - Analyzer 由哪几个部分组成?
三部分,Character Filter + Tokenizer + Token Filter - 尝试描述 match和match_ phrase 的区别
match中的terms 之间是or的关系,match_ phrase的terms 之间是and的关系,并且term之间位置关系也影响搜索的结果 - 如果你希望match_phrase 匹配到更多结果,你应该配置查询中什么参数?
slop (中间可以有其他字符) - 如果 Mapping的dynamic设置成“strict", 索引一个包含新增字段的文档时会发生什么?
直接报错 - 如果Mapping的dynamic设置成“false”, 索引一个包含新增字段的文档时会发生什么?
文档被索引,新的字段在_source中可见。但是该字段无法被搜索 - 判断: 可以把一个字段的类型从“integer" 改成“long”,因为这两个类型是兼容的
错,修改字段类型,需要重新reindex - 判断: 你可以在Mapping文件中为indexing 和searching指定不同的analyzer
对 - 判断:字段类型为Text的字段,一定可以被全文搜索
错,指定为Not Indexed时,无法被搜索。
基于Term的查询
- Term 是表达语意的最小单位。搜索和利用统计语言模型进行自然语言处理都需要处理Term
- Term Level Query: Term Query / Range Query / Exists Query / Prefix Query /Wildcard Query
- 在ES 中,Term查询,对输入不做分词。会将输入作为一个整体,在倒排索引中查找准确的词项,并且使用相关度算分公式为每个包含该词项的文档进行相关度算分-例如“Apple Store”
- 可以通过Constant Score将查询转换成一个Filtering,避免算分,并利用缓存,提高性能
POST /products/_bulk
{ "index": { "_id": 1 }}
{ "productID" : "XHDK-A-1293- #fJ3","desc" :"iPhone" }
{ "index": { "_id": 2 }}
{ "productID" : "KDKE -B-9947- #kL5" , "desc":"iPad" }
{ "index": { "_id": 3 }}
{ "productID" : "JODL -X-1937-#pV7" , "desc" :"MBP" }
复合查询—Constant Score转为Filter
将Query转成Filter,忽略TF -IDF计算,避免相关性算分的开销
Filter可以有效利用缓存
POST /products/_search
{
"explain": true,
"query": {
"constant_ score": {
"filter": {
"term": {
"productID.keyword": "XHDK-A-1293-#fJ3"
}
}
}
}
}
基于全文的查询
-
基于全文本的查找
- Match Query / Match Phrase Query / Query String Query
-
特点
-
索引和搜索时都会进行分词,查询字符串先传递到一个合适的分词器,然后生成- -个供查询的词
项列表. -
查询时候,先会对输入的查询进行分词,然后每个词项逐个进行底层的查询,最终将结果进行合
并。并为每个文档生成-个算分。-例如查“Matrix reloaded",会查到包括Matrix或者reload的所有结果。
//"operator": "and"同时含有两个词
//"minimum_should_match": 2 控制查询精准度
POST movies/_search
{
"query": {
"match": {
"title": {
"query": "Matrix reloaded",
"operator": "and"
}
}
}
}
POST movies/_search
{
"query": {
"match_phrase": {
"title": {
"query": "Matrix reloaded",
"slop": 1
}
}
}
}
结构化数据
- 结构化搜索 (Structured search)是指对结构化数据的搜索
- 日期,布尔类型和数字都是结构化的
- 文本也可以是 结构化的。
- 如彩色笔可以有离散的颜色集合: 红(red) 、绿(green) 、蓝(blue)
- 一个博客可能被标记了标签,例如,分布式(distributed) 和搜索(search)
- 电商网站上的商品都有UPCs (通用产 品码Universal Product Codes)或其他的唯一
- 标识,它们都需要遵从严格规定的、结构化的格式。