数据输入: 文档和索引 edit
Elasticsearch 是一个分布式文档存储,它并不是将数据存储为行或者列,而是将复杂数据序列化为json文档进行存储。当你在集群中配置了多个Elasticsearch 节点时,存储的文档通过集群进行存储,并且可以通过任何一个节点实时访问。
当一个文档被存储以后,它将在1秒内被索引和实现完全的查询(?)。Elasticsearch 使用一种倒排索引的数据结构支持快速的全文检索。倒排索引列出在任何文档中出现的每个唯一单词,并标识每个单词出现的所有文档。
索引可以被视为一种优化的文档的集合,并且每个文档都是字段(field)的集合,是一种包含了你的数据的键值对。默认情况下,Elasticsearch会为field中的所有数据制作索引,并且每个索引话的字段都有自己独特的,优化过的数据结构。例如:文本数据被存储为倒排索引,数字和地理信息字段被存储为 BKD 树形结构(?)。这种使用per-field数据结构的来组装(?)和返回搜索结果的能力让Elasticsearch 超级快。
This default behavior makes it easy to index and explore your data—just start indexing documents and Elasticsearch will detect and map booleans, floating point and integer values, dates, and strings to the appropriate Elasticsearch datatypes.
Elasticsearch也有无模式的能力,这就意味着无需配置如何处理文档中出现的所有可能出现的field(这个好像是专有名词一类的东西),文档就可以被索引化。当动态映射被开启之后,Elasticsearch可以自动检测并添加新的field到索引中。这种默认行为让Elasticsearch 可以非常容易的索引和浏览你的数据——只需开始索引文档,Elasticsearch就可以将检测并将Boolean, Float, Integer, Date和String映射到相应的Elasticsearch中合适的数据类型。
但是,最终还是你本人比ElasticSearch更了解你的数据和如何正确的使用。你可以自己定义规则来控制动态映射,明确的定义映射(?)来控制field如何被存储和索引。
定义你自己的映射规则可以让你
- 区分full-text字符串字段和精确值字符串字段
- 执行特定语言的文本分析(中英文的区分,中文使用IK分词器??)
- 优化字段用于部分匹配
- 使用自定义的日期格式
- Use data types such as
geo_point
andgeo_shape
that cannot be automatically detected - 使用类似
geo_point
andgeo_shape
的这种无法被西东检测的数据类型
通常相同的字段,为了不同的目的,使用不同的方式进行索引是非常有用的。例如,您可能希望将字符串field索引为全文搜索的文本字段和用于排序或聚合数据的关键字字段。或者,你也可以选择使用不止一种语言分析器来处理包含用户输入的字符串字段的内容。
The analysis chain that is applied to a full-text field during indexing is also used at search time. When you query a full-text field, the query text undergoes the same analysis before the terms are looked up in the index.
在索引的时候应用于全文字段(full-text field)的分析链,在搜索的时候也被使用。当你查询全文字段时,查询文本会在索引中查找之前进行相同的分析。
【就是说查询文本 和 文档建立的索引 执行的是相同的规则,完全匹配,提高命中率高,这么理解我觉得没毛病?】