第二章索引
有点像流水账,但是读着《es服务器开发》真的学到很多东西
特别是向我这样已经有服务已经挂到线上需要维护,但是对es不是太了解的程序员。
es索引
分片和副本。有就是说有2*分片数个lucen实例在服务器上
分片创建后无法修改
规避索引名称错误的问题,禁止自动创建索引
action.auto_create_index: false
你也可以通过正则去匹配
action.auto_create_index: -an*,+a*,-*
调整索引配置举个栗子
curl -XPUT http://localhost:9200/blog/ -d '{
"settings" : {
"number_of_shards" : 1,
"number_of_replicas" : 2
}
}'
映射配置
举个栗子
curl -XPUT 'http://localhost:9200/blog/' -d '{
"mappings" : {
"article" : {
"dynamic_date_formats" : ["yyyy-MM-dd hh:mm"]
} }
}'
自动关闭类型推测”dynamic” : “false”
curl -XPUT 'http://localhost:9200/blog/' -d '{
"mappings" : {
"article" : {
"dynamic" : "false",
"properties" : {
"id" : { "type" : "string" },
"content" : { "type" : "string" },
"author" : { "type" : "string" }
} }
} }'
书上的栗子
总的来说,建立一个mapping需要
字段名
类型
其他属性
{
"mappings": {
"post": {
"properties": {
"id": { "type":"long", "store":"yes",
"precision_step":"0" },
"name": { "type":"string", "store":"yes",
"index":"analyzed" },
"published": { "type":"date", "store":"yes",
"precision_step":"0" },
"contents": { "type":"string", "store":"no",
"index":"analyzed" }
} },
"user": {
"properties": {
"id": { "type":"long", "store":"yes",
"precision_step":"0" },
"name": { "type":"string", "store":"yes",
"index":"analyzed" }
} }
} }
es支持的类型
string:字符串;
number:数字;
date:日期;
boolean:布尔型;
binary:二进制。
字段的公共属性说明
(1) 公共属性 在继续描述所有核心类型之前,先讨论一些可用来描述所有类型(二进制除外)的公共属性。
index_name:该属性定义将存储在索引中的字段名称。若未定义,字段将以对象的名字 来命名。
index:可设置值为analyzed和no。另外,对基于字符串的字段,也可以设置为 not_analyzed。如果设置为analyzed,该字段将被编入索引以供搜索。如果设置为no, 将无法搜索该字段。默认值为analyzed。在基于字符串的字段中,还有一个额外的选项 not_analyzed。此设置意味着字段将不经分析而编入索引,使用原始值被编入索引,在 搜索的过程中必须全部匹配。索引属性设置为no将使include_in_all属性失效。
store:这个属性的值可以是yes或no,指定了该字段的原始值是否被写入索引中。默认 值设置为no,这意味着在结果中不能返回该字段(然而,如果你使用_source字段,即 使没有存储也可返回这个值),但是如果该值编入索引,仍可以基于它来搜索数据。
boost:该属性的默认值是1。基本上,它定义了在文档中该字段的重要性。boost的值 越高,字段中值的重要性也越高。
null_value:如果该字段并非索引文档的一部分,此属性指定应写入索引的值。默认的 行为是忽略该字段。
copy_to:此属性指定一个字段,字段的所有值都将复制到该指定字段。
include_in_all:此属性指定该字段是否应包括在_all字段中。
字符串的属性
大片的抄书了,但是这些字段真的很有用
比如
"analyzer": "ik_max_word",
"search_analyzer": "ik_max_word",
"include_in_all": "true",
"boost": 8
term_vector:此属性的值可以设置为no(默认值)、yes、with_offsets、 with_positions和with_positions_offsets。它定义是否要计算该字段的Lucene词 向量(term vector)。如果你使用高亮,那就需要计算这个词向量。
omit_norms:该属性可以设置为true或false。对于经过分析的字符串字段,默认值为 false,而对于未经分析但已编入索引的字符串字段,默认值设置为true。当属性为true 时,它会禁用Lucene对该字段的加权基准计算(norms calculation),这样就无法使用索引 期间的加权,从而可以为只用于过滤器中的字段节省内存(在计算所述文件的得分时不 会被考虑在内)。
analyzer:该属性定义用于索引和搜索的分析器名称。它默认为全局定义的分析器名称。
index_analyzer:该属性定义了用于建立索引的分析器名称。
search_analyzer:该属性定义了的分析器,用于处理发送到特定字段的那部分查询字
符串。
norms.enabled:此属性指定是否为字段加载加权基准(norms)。默认情况下,为已分
析字段设置为true(这意味着字段可加载加权基准),而未经分析字段则设置为false。
norms.loading:该属性可设置eager和lazy。第一个属性值表示此字段总是载入加权
基准。第二个属性值是指只在需要时才载入。
position_offset_gap:此属性的默认值为0,它指定索引中在不同实例中具有相同名
称的字段的差距。若想让基于位置的查询(如短语查询)只与一个字段实例相匹配,可
将该属性值设为较高值。
index_options:该属性定义了信息列表(postings list)的索引选项(2.2.4节将详细讨
论)。可能的值是docs(仅对文档编号建立索引),freqs(对文档编号和词频建立索引), positions(对文档编号、词频和它们的位置建立索引),offsets(对文档编号、词频、 它们的位置和偏移量建立索引)。对于经分析的字段,此属性的默认值是positions,对 于未经分析的字段,默认值为docs。
ignore_above:该属性定义字段中字符的最大值。当字段的长度高于指定值时,分析器 会将其忽略。
(3) 数值 这一核心类型汇集了所有适用的数值字段类型。Elasticsearch中可使用以下类型(使用type
属性指定)。
byte:定义字节值,例如1。
short:定义短整型值,例如12。
integer:定义整型值,例如134。
long:定义长整型值,例如123456789。
float:定义浮点值,例如12.23。
double:定义双精度值,例如123.45。
bool,date 略
多个字段
有时候你希望两个字段中有相同的字段值,例如,一个字段用于搜索,一个字段用于排序; 或一个经语言分析器分析,一个只基于空白字符来分析。Elasticsearch允许加入多字段对象来拓 展字段定义,从而解决这个需求。它允许把几个核心类型映射到单个字段,并逐个分析。例如, 想计算切面并在name字段中搜索,可以定义以下字段:
"name": {
"type": "string",
"fields": {
"facet": { "type" : "string", "index": "not_analyzed" }
}
}
上述定义将创建两个字段:我们将第一个字段称为name,第二个称为name.facet。当然, 你不必在索引的过程中指定两个独立字段,指定一个name字段就足够了。Elasticsearch会处理余 下的工作,将该字段的数值复制到多字段定义的所有字段。
ip类型
"address" : { "type" : "ip", "store" : "yes" }
索引的字数信息
"address_count" : { "type" : "token_count", "store" : "yes" }
es的默认分析器-各种抄书
Elasticsearch允许我们使用众多默认定义的分析器中的一种。如下分析器可以开箱即用。
standard:方便大多数欧洲语言的标准分析器(关于参数的完整列表,请参阅http://www. lasticsearch.org/guide/en/elasticsearch/reference/current/analysis-standard-analyzer.html)。
simple:这个分析器基于非字母字符来分离所提供的值,并将其转换为小写形式。
whitespace:这个分析器基于空格字符来分离所提供的值。
stop:这个分析器类似于simple分析器,但除了simple分析器的功能,它还能基于所
提供的停用词(stop word)过滤数据(参数的完整列表,请参阅http://www.elasticsearch.
rg/guide/en/elasticsearch/reference/current/analysis-stop-analyzer.html)。
keyword:这是一个非常简单的分析器,只传入提供的值。你可以通过指定字段为
not_analyzed来达到相同的目的。
pattern:这个分析器通过使用正则表达式灵活地分离文本(参数的完整列表,请参阅
http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/analysis-pattern-analyzer.
html)。
language:这个分析器旨在特定的语言环境下工作。该分析器所支持语言的完整列表可参
考http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/analysis-lang-analyzer. tml
自定义分析器设置
"settings" : {
"index" : {
"analysis": {
"analyzer": {
"en": {
"tokenizer": "standard",
"filter": [
"asciifolding",
"lowercase",
"ourEnglishFilter"
] }
},
"filter": {
"ourEnglishFilter": {
"type": "kstem"
} }
} }
}
常用的相似度模型
现有如下三种相似度模型。
Okapi BM25模型:这种相似度模型基于概率模型,概率模型估算根据指定查询找到指定 文档的概率。为了在Elasticsearch中使用这种相似度模型,需要将BM25作为名称。据说 Okapi BM25相似度模型在处理简短的文本文档时表现最佳,在这种文档中词条的重复严 重有损整体文档的得分。要使用此相似度模型,需要设置字段的similarity属性为 BM25。这种相似度模型在定义后立即可用,不需要设置附加属性。
随机性偏差(divergence from randomness)模型:这种相似度模型基于具有相同名称的概 率模型。为了在Elasticsearch中使用这种相似度模型,需要使用DFR作为名称。随机性偏 差模型在处理类自然语言文本时表现良好。
信息基础(information-based)模型:这是新推出的最后一个相似度模型,与随机性偏差 模型非常相似。为了在Elasticsearch中使用这种相似度模型,需要使用IB作为名称。类似 于DFR相似度模型,信息基础模型在处理类自然语言文本时表现良好。
批量索引提高索引速度
重要的是提供了一种思路,es是支持批量更新的举个栗子
{ "index": { "_index": "addr", "_type": "contact", "_id": 1 }}
{ "name": "Fyodor Dostoevsky", "country": "RU" }
{ "create": { "_index": "addr", "_type": "contact", "_id": 2 }}
{ "name": "Erich Maria Remarque", "country": "DE" }
{ "create": { "_index": "addr", "_type": "contact", "_id": 2 }}
{ "name": "Joseph Heller", "country": "US" }
{ "delete": { "_index": "addr", "_type": "contact", "_id": 4 }}
{ "delete": { "_index": "addr", "_type": "contact", "_id": 1 }}
用附加的内部信息扩展索引
第一个是_uid字段,它是索引中文档的唯一标识符,由该文档的标识符和文档类型构成。
_id id
_type 字段
_all字段存储其他字段中的数据以便于搜索。当要执行简单的搜索功能, 搜索所有数据(或复制到_all字段的所有字段),但又不想去考虑字段名称之类的事情时,这个 字段很有用。_all支持一下属性,store,term_vector,analyzer,index_analyzer,search_analyzer
_source字段可以在生成索引过程中存储发送到Elasticsearch的原始JSON文档。
_index Elasticsearch允许我们存储文档相关索引的信息。可以通过使用内部_index字段做到这一 点。
_size 如果需要启用_size字段,则需添加_size属性并设置enabled属性值为true。此 外,还可以通过使用通常的store属性设置_size字段使其被存储。
_timestamp 默认情况下,禁用的_timestamp字段允许文档在被索引时存储
_ttl字段表示time to live(生存时间),它允许定义文档的生命周期,周期结束之后文档会 被自动删除。
段合并介绍
主要是关于删除文档的管理问题。
主要是针对逻辑删除数据,而物理上并没有删除数据的情况
段合并的处理过程是:底层的Lucene库获取若干段,并在这些段信息的基础上创建一个新的 段。由此产生的段拥有所有存储在原始段中的文档,除了被标记为删除的那些之外。合并操作之 后,源段将从磁盘上删除。这是因为段合并在CPU和I/O的使用方面代价是相当高的,关键是要 适当地控制这个过程被调用的时机和频率。
合并策略
tiered:这是默认合并策略,合并尺寸大致相似的段,并考虑到每个层(tier)允许的最 大段数量;
log_byte_size:这个合并策略下,随着时间推移,将产生由索引大小的对数构成的索 引,其中存在着一些较大的段以及一些合并因子较小的段等;
log_doc:这个策略类似于log_byte_size合并策略,但根据索引中的文档数而非段的 实际字节数来操作。
合并调度去
并发合并调度器:这是默认的合并过程,在独立的线程中执行,定义好的线程数量可以 6 并行合并。
串行合并调度器:这一合并过程在调用线程(即执行索引的线程)中执行。合并进程会 一直阻塞线程直到合并完成。
合并因子
它指定了索引过程中段合并的频率。合并因子较小时,搜索的速度更快,占用的内存也更少,但 索引的速度会减慢;合并因子较大时,则索引速度加快,这是因为发生的合并较少,但搜索的速 度变慢,占用的内存也会变大。
对于log_byte_size和 log_doc合并策略,可以通过index. merge.policy.merge_factor参数来设置合并因子。
index.merge.policy.merge_factor: 10
调节合并
,设置indices.store.throttle.type
none:该值定义不打开调节。
merge:该值定义调节仅在合并过程中有效。
all:该值定义调节在所有数据存储活动中有效。
路由介绍
一般是采取默认路由
指定路由
curl -XPUT 'http://localhost:9200/posts/post/1?routing=12' -d '{ "id": "1",
"name": "Test document",
"contents": "Test document",
"userId": "12"
}'
验证上述的结果
curl -XGET 'http://localhost:9200/posts/_search?routing=12&q=userId:12'
请求中设置路由值
"_routing" : {
"required" : true,
"path" : "userId"
}