1. mapping
  2. ==
  3.  
  4. Mapping是指定义如何将document映射到搜索引擎的过程,比如一个字段是否可以查询以及如何分词等,一个索引可以存储含有不同"mapping types"documentsES允许每个mapping type关联多个mapping定义。
  5.  
  6. 显式声明的mapping是定义在index/type级别, 默认不需要显式的定义mapping 当新的type或者field引入时,ES会自动创建并且注册有合理的默认值的mapping(毫无性能压力), 只有要覆盖默认值时才必须要提供mapping定义。
  7.  
  8. mapping types
  9.  
  10. Mapping types是将索引里的documents按逻辑分组的方式, 类似数据中的表, 虽然不同的types之间有些区别, 但他们并不是完全分开的(说到底还是存在相同的Lucene索引里)。
  11.  
  12. 强烈建议跨types的同名field有相同的类型定义以及相同的mapping特征(比如analysis的设置), 这在通过type前缀(`my_type.my_field`)来选择字段时非常有效, 但这也不一定, 有些地方就不起作用(比如字段的聚合faceting)。
  13.  
  14. 实际上在实践中这个限制从来不是问题, field名通常表明了该field的类型(例如"first_name"总是一个字符串)。 还要注意, 这不适用于跨索引的情况。
  15.  
  16. mapping api
  17.  
  18. 要创建mapping 需要用到Put Mapping接口, 或者可以在调用create index接口时附带mapping的定义。
  19.  
  20. global settings
  21.  
  22. 全局设置`index.mapping.ignore_malformed`可以在索引级别上设置是否忽略异常内容(异常内容的一个例子是尝试将字符串类型的值作为数字类型索引), 这个设置是跨mapping types的全局设置。
  23.  
  24. fields
  25. ===
  26.  
  27. 每一个ampping都有一些关联的字段来控制如何索引的document的元数据(例如_all)。
  28.  
  29. _uid
  30. ===
  31.  
  32. 每个索引的document会关联一个id和一个type, 内部的`_uid`字段将typeid组合起来作为document的唯一标示(这意味着不同的type可以有相同的id 组合起来仍然是唯一的)。
  33.  
  34. 在执行基于type的过滤时, 如果`_type`字段没有被索引,会自动使用`_uid`字段, 并且不需要`_id`字段被索引。
  35.  
  36. ```
  37. 附_uid的java源代码
  38.  
  39. public static final byte DELIMITER_BYTE = 0x23;
  40.  
  41. public static void createUidAsBytes(BytesRef type, BytesRef id, BytesRef spare) {
  42. spare.copyBytes(type);
  43. spare.append(DELIMITER_BYTES);
  44. spare.append(id);
  45. }
  46. ```
  47.  
  48. _id
  49. ===
  50.  
  51. 每个索引的document会关联一个id和一个type, `_id`字段就是用来索引并且存储(可能)id的,默认是不索引(not indexed)并且不存储的(not stored)。
  52.  
  53. 注意, 即使`_id`是不索引的, 相关的接口仍然起作用(他们会用`_uid`字段), 比如用`term`, `terms`或者`prefix`来根据ids过滤(包括用`ids`来查询/过滤)。
  54.  
  55. `_id`字段也可以启用索引或者存储, 配置如下:
  56.  
  57. ```
  58. {
  59. "tweet" : {
  60. "_id" : {"index": "not_analyzed", "store" : "yes"}
  61. }
  62. }
  63. ```
  64.  
  65. 为了维护向后兼容性, 当升级到0.16时可以在节点级别设置`index.mapping._id.indexed`true来确保id能被索引, 尽管不建议索引id
  66.  
  67. 可以设置`_id``path`属性来从源文档中提取id 例如下面的mapping:
  68.  
  69. ```
  70. {
  71. "tweet" : {
  72. "_id" : {
  73. "path" : "post_id"
  74. }
  75. }
  76. }
  77. ```
  78.  
  79. 如果提交下面的数据
  80.  
  81. ```
  82. {
  83. "message" : "You know, for Search",
  84. "post_id" : "1"
  85. }
  86. ```
  87.  
  88. `1`会提取出来作为id
  89.  
  90. 因为要提取id来决定在哪一个shard执行索引,需要在索引时做额外的解析。
  91.  
  92. _type
  93. ===
  94.  
  95. 每个索引的document会关联一个id和一个type, type在索引时会自动赋给`_type`字段, 默认`_type`字段是需要索引的(但不analyzed)并且不存储的, 这就意味着`_type`字段是可查询的。
  96.  
  97. `_type`字段也可以设置为stored, 例如:
  98.  
  99. ```
  100. {
  101. "tweet" : {
  102. "_type" : {"store" : "yes"}
  103. }
  104. }
  105. ```
  106.  
  107. `_type`字段也可以设置为不索引, 并且此时所有用到`_type`字段的接口仍然能用。
  108.  
  109. ```
  110. {
  111. "tweet" : {
  112. "_type" : {"index" : "no"}
  113. }
  114. }
  115. ```
  116.  
  117. _source
  118. ===
  119.  
  120. `_source`是一个自动生成的字段, 用来存储实际提交的JSON数据, 他是不索引的(不可搜索), 只是用来存储。 在执行"fetch"类的请求时, 比如get或者search, `_source`字段默认也会返回。
  121.  
  122. 尽管`_source`非常有用, 但它确实会占用索引的存储空间, 所以也可以禁用。 比如:
  123.  
  124. ```
  125. {
  126. "tweet" : {
  127. "_source" : {"enabled" : false}
  128. }
  129. }
  130. ```
  131.  
  132. compression
  133.  
  134. 0.90开始, 所有存储的字段(包括`_source`)总是被压缩的。
  135.  
  136. 0.90之前:
  137.  
  138. 如果要将source字段存储在索引中的话,启用压缩(LZF)会显著减少索引的大小, 还可能提升性能(解压缩比从磁盘上加载一个比较大的source的性能要好)。 代码需要特别注意,只有需要的时候才执行解压缩, 例如直接将数据解压缩到REST的结果流。
  139.  
  140. 要启用压缩的话, 需要将`compress`选项设置为true 默认设置是false 注意可以在已经存在的索引上修改,ES支持压缩和未压缩的数据混合存放。
  141.  
  142. 另外,`compress_threshold`可以控制压缩source的时机,可以设置为表示字节大小的值(比如100b, 10kb)。 注意`compress`应该设置为true
  143.  
  144. includes / excludes
  145.  
  146. 可以用path属性来包含/排除source中要存储的字段,支持*通配符,例如:
  147.  
  148. ```
  149. {
  150. "my_type" : {
  151. "_source" : {
  152. "includes" : ["path1.*", "path2.*"],
  153. "excludes" : ["pat3.*"]
  154. }
  155. }
  156. }
  157. ```
  158.  
  159. _all
  160. ===
  161.  
  162. `_all`字段的设计目的是用来包罗文档的一个或多个字段, 这对一些特定的查询非常有用, 比如我们要查询文档的内容, 但是不确定要具体查询哪一个字段, 这会占用额外的cpu和索引容量。
  163.  
  164. `_all`字段可以完全禁止掉, field mappingobject mapping可以声明这个字段是否放到`_all`中。 默认所有的字段都包含在`_all`中。
  165.  
  166. 禁用`_all`字段时, 推荐为`index.query.default_field`设置一个值(例如, 你的数据有一个"message"字段来存储主要的内容, 就设置为`message`)。
  167.  
  168. `_all`字段一个很有用的特征是可以把字段的boost等级考虑进去, 假设title字段的boost等级比content字段高, `_all`中的title值也比`_all`中的content值等级高。
  169.  
  170. 以下是一个配置的例子:
  171. ```
  172. {
  173. "person" : {
  174. "_all" : {"enabled" : true},
  175. "properties" : {
  176. "name" : {
  177. "type" : "object",
  178. "dynamic" : false,
  179. "properties" : {
  180. "first" : {"type" : "string", "store" : "yes", "include_in_all" : false},
  181. "last" : {"type" : "string", "index" : "not_analyzed"}
  182. }
  183. },
  184. "address" : {
  185. "type" : "object",
  186. "include_in_all" : false,
  187. "properties" : {
  188. "first" : {
  189. "properties" : {
  190. "location" : {"type" : "string", "store" : "yes", "index_name" : "firstLocation"}
  191. }
  192. },
  193. "last" : {
  194. "properties" : {
  195. "location" : {"type" : "string"}
  196. }
  197. }
  198. }
  199. },
  200. "simple1" : {"type" : "long", "include_in_all" : true},
  201. "simple2" : {"type" : "long", "include_in_all" : false}
  202. }
  203. }
  204. }
  205. ```
  206.  
  207. 在这个例子里, `_all`字段设置了`store`, `term_vector``analyzer`(指定`index_analyzer``search_analyzer`)。
  208.  
  209. highlighting
  210.  
  211. 任何可以highlighting的字段必须既是stored的,又是`_source`的一部分,默认`_all`字段不符合这个条件, 所以它的highlighting不会返回任何数据。
  212.  
  213. 尽管可以设置`_all`stored `_all`从根本上说是所有字段的集合, 也就是说会存储多余的数据,它做highlighting可能产生怪怪的结果。
  214.  
  215. _analyzer
  216. ===
  217.  
  218. `_analyzer` mapping可以将document某个字段的值作为索引时所用analyzer的名字,如果一个字段没有显式指定`analyzer`或者`index_analyzer`, 索引时就会用这个analyzer
  219.  
  220. 下面是配置的例子:
  221.  
  222. ```
  223. {
  224. "type1" : {
  225. "_analyzer" : {
  226. "path" : "my_field"
  227. }
  228. }
  229. }
  230. ```
  231.  
  232. 上面的配置用`my_field`字段的值作为analyzer 比如下面的文档:
  233.  
  234. ```
  235. {
  236. "my_field" : "whitespace"
  237. }
  238. ```
  239.  
  240. 会让所有没有指定analyzer的字段用`whitespace`做索引的analyzer
  241.  
  242. path的默认值是`_analyzer`, 所以可以给`_analyzer`字段赋值来指定一个analyzer 如果需要自定义为别的json字段, 需要通过path属性来明确指定。
  243.  
  244. 默认`_analyzer`字段是可索引的, 可以在mapping中将`index`设置为`no`来禁用。
  245.  
  246. _boost
  247. ===
  248.  
  249. Boosting是增强文档或者字段关联性的过程,字段级别的mapping可以将boost指定为某个字段。 `_boost`(应用在root object上)可以指定一个字段,这个字段的内容控制文档的boost级别。 例如下面的mapping:
  250.  
  251. ```
  252. {
  253. "tweet" : {
  254. "_boost" : {"name" : "my_boost", "null_value" : 1.0}
  255. }
  256. }
  257. ```
  258.  
  259. 上面的定义指定了一个名为字段`my_boost`的字段, 如果要索引的JSON文档包括my_boost字段, 字段的值就作为文档的boost值, 比如下面的JSON文档的boost值为2.2:
  260.  
  261. ```
  262. {
  263. "my_boost" : 2.2,
  264. "message" : "This is a tweet!"
  265. }
  266. ```
  267.  
  268. (注:name属性默认是`_boost`)
  269.  
  270. _parent
  271. ===
  272.  
  273. `_parent`用来定义子类型所关联的父类型, 比如有一个`blog`类型和一个`blog_tag`子类型, `blog_tag`mapping应该是:
  274.  
  275. ```
  276. {
  277. "blog_tag" : {
  278. "_parent" : {
  279. "type" : "blog"
  280. }
  281. }
  282. }
  283. ```
  284.  
  285. `_parent`默认是stored以及indexed的, 也就是说可以用`_parent`来查询。
  286.  
  287. _routing
  288. ===
  289.  
  290. `routing`是索引数据或者需要明确指定路由时routing的设置。
  291.  
  292. store / index
  293.  
  294. `_routing`mapping默认会存储routing的值(`store`设置为`yes`), 之所以这么做是为了可以在routing值来自外部而不是document一部分时仍然可以重建索引。
  295.  
  296. required
  297.  
  298. 另一方面, 可以在`_routing`mapping中设置`required`属性为`true`来将它设置为必需的,这在使用routing功能是非常重要, 因为很多接口会用到它。 如果没有提供routing值(或者不能从document获取)的话,索引操作就不会执行,再比如如果`_routing`是必须的但是没有提供routing值的话,删除操作就会广播到所有的分片(shards)上。
  299.  
  300. path
  301.  
  302. routing的值可以在索引时额外提供(并且作为document的一部分存储, `_source`字段存储方式很像), 也可以根据`path`自动从要索引的document提取, 例如下面的mapping:
  303.  
  304. ```
  305. {
  306. "comment" : {
  307. "_routing" : {
  308. "required" : true,
  309. "path" : "blog.post_id"
  310. }
  311. }
  312. }
  313. ```
  314.  
  315. 会使下面的document基于值`111222`来路由:
  316.  
  317. ```
  318. {
  319. "text" : "the comment text"
  320. "blog" : {
  321. "post_id" : "111222"
  322. }
  323. }
  324. ```
  325.  
  326. 注意, 使用`path`而不是明确提供routing值的话, 索引时需要额外的解析过程(尽管相当快)。
  327.  
  328. id uniqueness
  329.  
  330. 如果自定义`_routing`的话, 不保证`_id`在所有分片(shards)的唯一性。 事实上, 如果document`_id`相同而`_routing`值不同的话, 会被分配到不同分片上。
  331.  
  332. _index
  333. ===
  334.  
  335. `_index`存储一个document属于哪一个索引(index), 该字段默认是禁用的, 如果要启用的话, mapping的定义如下:
  336.  
  337. ```
  338. {
  339. "tweet" : {
  340. "_index" : { "enabled" : true }
  341. }
  342. }
  343. ```
  344.  
  345. _size
  346. ===
  347.  
  348. `_size`字段自动存储原始`_source`的大小, 默认是禁用的, 要启用的话mapping定义如下:
  349.  
  350. ```
  351. {
  352. "tweet" : {
  353. "_size" : {"enabled" : true}
  354. }
  355. }
  356. ```
  357.  
  358. 如果还要存储的话, 定义如下:
  359.  
  360. ```
  361. {
  362. "tweet" : {
  363. "_size" : {"enabled" : true, "store" : "yes"}
  364. }
  365. }
  366. ```
  367.  
  368. _timestamp
  369. ===
  370.  
  371. `_timestamp`字段允许自动索引一个document的时间戳, 它可以在索引请求时提供, 也可以从`_source`提取,如果没有提供的话会自动设置为document被处理的时间。
  372.  
  373. enabled
  374.  
  375. `_timestamp`默认是禁用的, 如果要启用, mapping的定义如下所示:
  376.  
  377. ```
  378. {
  379. "tweet" : {
  380. "_timestamp" : { "enabled" : true }
  381. }
  382. }
  383. ```
  384.  
  385. store / index
  386.  
  387. 默认`_timestamp`字段的`store`设置为`no` `index`设置为`not_analyzed` 它可以当做一个标准的日期字段来查询。
  388.  
  389. path
  390.  
  391. `_timestamp`的值可以在索引请求时额外提供, 也可以根据`path`自动从document中提取, 例如下面的mapping定义:
  392.  
  393. ```
  394. {
  395. "tweet" : {
  396. "_timestamp" : {
  397. "enabled" : true,
  398. "path" : "post_date"
  399. }
  400. }
  401. }
  402. ```
  403.  
  404. 提交的数据为
  405.  
  406. ```
  407. {
  408. "message" : "You know, for Search",
  409. "post_date" : "2009-11-15T14:12:12"
  410. }
  411. ```
  412.  
  413. 时间戳的值就是`2009-11-15T14:12:12`
  414.  
  415. 注意, 如果用`path`方式而没有明确提供时间戳的值的话, 索引时需要额外的解析操作(尽管相当快)。
  416.  
  417. format
  418.  
  419. 你可以定义时间戳的格式, 例如:
  420.  
  421. ```
  422. {
  423. "tweet" : {
  424. "_timestamp" : {
  425. "enabled" : true,
  426. "path" : "post_date",
  427. "format" : "YYYY-MM-dd"
  428. }
  429. }
  430. }
  431. ```
  432.  
  433. 注意, 默认的格式是`dateOptionalTime` 时间戳的值首先作为数字解析, 如果解析失败的话会尝试用定义的格式解析。
  434.  
  435. _ttl
  436. ===
  437.  
  438. 很多documents有过期时间, 可以设置`_ttl`(time to live)来自动删除过期的documents
  439.  
  440. enabled
  441.  
  442. `_ttl`默认是禁用的, 要启用的话, mapping定义如下:
  443.  
  444. ```
  445. {
  446. "tweet" : {
  447. "_ttl" : { "enabled" : true }
  448. }
  449. }
  450. ```
  451.  
  452. store / index
  453.  
  454. 默认`_ttl`字段的`store`设置为`yes` `index`设置为`not_analyzed` 注意`index`必须设置为`not_analyzed`
  455.  
  456. default
  457.  
  458. 可以为index/type设置默认的`_ttl` 比如:
  459.  
  460. ```
  461. {
  462. "tweet" : {
  463. "_ttl" : { "enabled" : true, "default" : "1d" }
  464. }
  465. }
  466. ```
  467.  
  468. 这种情况下, 如果你没有明确提供`_ttl`的值, `_source`里也没有`_ttl`的话, 所有的tweets`_ttl`会被设置为一天。
  469.  
  470. 如果你没有指定时间的单位,比如d (days), m (minutes), h (hours), ms (milliseconds), (weeks), 默认把毫秒(milliseconds)作为单位。
  471.  
  472. 如果没有设置默认值, 也没有提供`_ttl`的值, document会有无限的`_ttl`,即永不过期。
  473.  
  474. 可以用put mapping接口动态更新`default`的值, 这不会改变已有documents`_ttl` 只会影响新的documents
  475.  
  476. note on documents expiration
  477.  
  478. 过期的documents会自动定期删除, 可以根据你的需要来设置`indices.ttl.interval` 默认是60s
  479.  
  480. 删除命令是批量处理的, 可以根据你的需要来设置`indices.ttl.bulk_size` 默认是10000
  481.  
  482. 注意, 删除是根据版本来的, 如果document在收集过期的documents和执行删除操作的时间间隔之间被修改了, document是不会被删除的。

elasticsearch文档-字段的mapping的更多相关文章

  1. elasticsearch文档-modules

    elasticsearch文档-modules modules 模块 cluster 原文 基本概念 cluster: 集群,一个集群通常由很多节点(node)组成 node: 节点,比如集群中的每台 ...

  2. ElasticSearch 文档及操作

    公号:码农充电站pro 主页:https://codeshellme.github.io 本节介绍 ES 文档,索引及其基本操作. 1,ES 中的文档 在 ES 中,文档(Document)是可搜索数 ...

  3. elasticsearch 文档

    elasticsearch 文档 文档格式 索引中最基本的单元叫做文档 document. 在es中文档的示例如下: { "_index": "questions&quo ...

  4. elasticsearch文档-analysis

    elasticsearch文档-analysis   analysis 基本概念 全文搜索引擎会用某种算法对要建索引的文档进行分析, 从文档中提取出若干Token(词元), 这些算法称为Tokeniz ...

  5. Elasticsearch文档查询

    简单数据集 到目前为止,已经了解了基本知识,现在我们尝试用更逼真的数据集,这儿已经准备好了一份虚构的JSON,关于客户银行账户信息的.每个文档的结构如下: { , , "firstname& ...

  6. ElasticSearch文档操作介绍三

    ElasticSearch文档的操作 文档存储位置的计算公式: shard = hash(routing) % number_of_primary_shards 上面公式中,routing 是一个可变 ...

  7. Elasticsearch入门教程(四):Elasticsearch文档CURD

    原文:Elasticsearch入门教程(四):Elasticsearch文档CURD 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接: ...

  8. ElasticSearch文档

    1.什么是文档? 程序中大多的实体或对象能够被序列化为包含键值对的JSON对象,键(key)是字段(field)或属性(property)的名字,值(value)可以是字符串.数字.布尔类型.另一个对 ...

  9. ElasticStack学习(四):ElasticSearch文档使用与操作

    一.文档的CRUD介绍 ElasticSearch中存在五种操作,分别如下: 1.Index 该操作表示:如果文档的ID不存在,则创建新的文档.若有相同的ID,先删除现有文档,然后再创建新的文档,同时 ...

随机推荐

  1. Maven Java项目添加Scala语言支持

    为了在一个普通的使用Maven构建的Java项目中,增加对Scala语言的支持.使得其能够同时编译Java和Scala语言的文件.其实很简单的一件事情,只需要在pom.xml文件中的build部分中的 ...

  2. pg_stat_statements源代码分析

    磨砺技术珠矶,践行数据之道,追求卓越价值 回到上一级页面:PostgreSQL内部结构与源代码研究索引页    回到顶级页面:PostgreSQL索引页 pg_stat_statement的源代码,非 ...

  3. [Deep-Learning-with-Python]神经网络的数学基础

    理解深度学习需要熟悉一些简单的数学概念:Tensors(张量).Tensor operations 张量操作.differentiation微分.gradient descent 梯度下降等等. &q ...

  4. 23-[模块]-logging

    1.日志级别 很多程序都有记录日志的需求,并且日志中包含的信息即有正常的程序访问日志,还可能有错误.警告等信息输出,python的logging模块提供了标准的日志接口,你可以通过它存储各种格式的日志 ...

  5. 25-[jQuery]-ajax

    1.什么是AJAX AJAX = 异步的javascript和XML(Asynchronous Javascript and XML) 简言之,在不重载整个网页的情况下,AJAX通过后台加载数据,并在 ...

  6. SSISDB1:使用SSISDB管理Package

    SSISDB 系列随笔汇总: SSISDB1:使用SSISDB管理Package SSISDB2:SSIS工程的操作实例 SSISDB3:Package的执行实例 SSISDB4:当前正在运行的Pac ...

  7. Famous框架系列一:famous/core/Surface

    famous/core/Surface 既然是Famous的第一篇文章,就先给Famous打个广告:http://periodic.famo.us  Famous12年的作品,点击右下角Fun thi ...

  8. $.ready和onload 区别

    1.jq ready()的方法就是Dom Ready 他的作用或者意义就是:在DOM加载完成后就可以可以对DOM进行操作. 一般情况先一个页面响应加载的顺序是,域名解析-加载html-加载js和css ...

  9. [Lua] 尾调用消除(tail-call elimination)

    <Lua程序设计(第2版)> 6.3 正确的尾调用(proper tail call) Lua是支持尾调用消除(tail-call elimination)的,如下面对函数g的调用就是尾调 ...

  10. 【SIKIA计划】_06_Unity2D游戏开发-拾荒者笔记

    [新增分类]Animations 动画——Animation——AnimatorControllerPrefabs 预制 [素材导入]unitypackage 素材包Sprites Editor 编辑 ...