es mapping 参数

analyzers 

  定义使用的分词器。分词不仅发生在数据被索引存入数据时,也发生在查询。所以,查询和索引时最好使用同样的分词器。

   Es在索引时寻找分词器的顺序:

  • The analyzer defined in the field mapping.
  • An analyzer named default in the index settings.
  • The standard analyzer.

 

 

Es 查询时学找分词器的顺序:

  • The analyzer defined in a full-text query.
  • The search_analyzer defined in the field mapping.
  • The analyzer defined in the field mapping.
  • An analyzer named default_search in the index settings.
  • An analyzer named default in the index settings.
  • The standard analyzer.

  search_quote_analyzer: 设置允许您为短语指定分析器,这在处理禁用短语查询的停用词时特别有用。

Normalizer: 是keyword的属性,和分词器类似吗,就是对keywrod的值在进一步做处理。这个是属性在索引keyword和查询keyword都会使用。

官网个的例子就是对单词进行大小写转化和还有词根。

 

 

PUT index

{

  "settings": {

    "analysis": {

      "normalizer": {

        "my_normalizer": {

          "type": "custom",

          "char_filter": [],

          "filter": ["lowercase", "asciifolding"]

        }

      }

    }

  },

  "mappings": {

    "_doc": {

      "properties": {

        "foo": {

          "type": "keyword",

          "normalizer": "my_normalizer"

        }

      }

    }

  }

}

 

 

PUT index/_doc/1

{

  "foo": "BÀR"

}

 

PUT index/_doc/2

{

  "foo": "bar"

}

 

PUT index/_doc/3

{

  "foo": "baz"

}

 

POST index/_refresh

 

GET index/_search

{

  "query": {

    "term": {

      "foo": "BAR"

    }

  }

}

 

GET index/_search

{

  "query": {

    "match": {

      "foo": "BAR"

    }

  }

}

 

 

 返回结果:

    "hits" : [

      {

        "_index" : "index",

        "_type" : "_doc",

        "_id" : "2",

        "_score" : 0.2876821,

        "_source" : {

          "foo" : "bar"

        }

      },

      {

        "_index" : "index",

        "_type" : "_doc",

        "_id" : "1",

        "_score" : 0.2876821,

        "_source" : {

          "foo" : "BÀR"

        }

      }

]

可以看出 bar 和 BÀR 都被查询出来了。

 

Boost:

      根据boost的值查询时得到的分数也不一样。 默认值是1

PUT my_index

{

  "mappings": {

    "_doc": {

      "properties": {

        "title": {

          "type": "text",

          "boost": 2  

        },

        "content": {

          "type": "text"

        }

      }

    }

  }

 

}

这个参数值适用于trems 查询, prefix, range and fuzzy queries are not boosted 是不适用的

 

Coerce

数据并不总是干净的。 根据它的生成方式,可以在JSON体中将数字呈现为真正的JSON数,例如 5,但它也可以呈现为字符串,例如“5”。 或者,应该是整数的数字可以替代地呈现为浮点,例如, 5.0,甚至“5.0”.

 

PUT my_index

{

  "mappings": {

    "_doc": {

      "properties": {

        "number_one": {

          "type": "integer"

        },

        "number_two": {

          "type": "integer",

          "coerce": false

        }

      }

    }

  }

}

 

 

PUT my_index/_doc/1

{

  "number_one": "10.2"

}

 

PUT my_index/_doc/2

{

  "number_two": "10"

}

第二跳数据插入失败,因为coerce = false.

 

 

copy_to:

   允许把多个字段合并成一个字段,然后进行查询。和_all 类型,能进行索引,但是没有被存储。

注意: copy_to 只是复制字段并不会修改_source字段。可以将同样的值赋值到多个字段像这样"copy_to": [ "field_1", "field_2" ] 。不能进行递归赋值。

 

 

 

 

 

 

  PUT my_index

{

  "mappings": {

    "_doc": {

      "properties": {

        "first_name": {

          "type": "text",

          "copy_to": "full_name"

        },

        "last_name": {

          "type": "text",

          "copy_to": "full_name"

        },

        "full_name": {

          "type": "text"

        }

      }

    }

  }

}

 

PUT my_index/_doc/1

{

  "first_name": "John",

  "last_name": "Smith"

}

 

GET my_index/_search

{

  "query": {

    "match": {

      "full_name": {

        "query": "John Smith",

        "operator": "and"

      }

    }

  }

}

 

 

返回结果:

  "hits" : [

      {

        "_index" : "my_index",

        "_type" : "_doc",

        "_id" : "1",

        "_score" : 0.5753642,

        "_source" : {

          "first_name" : "John",

          "last_name" : "Smith"

        }

      }

    ]

 

doc_values:  开启后会以面向列的方式进行存储数据,这样更有利于排序和集合。如果字段不需要排序和集合可以关掉,节省磁盘空间。默认情况下支付doc的值默认都是开启的。

 

 

   

   Dynamic

 默认情况下字段可以被动态添加,如果索引没有字段类型,会根据字段值添加创建字段类型。

Dynamic :

    True: 新检测到的字段将添加到映射中

     False:   新检测到的字段将被忽略。 这些字段不会被编入索引,因此无法搜索,但仍会出现在返回的匹配的_source字段中。 这些字段不会添加到映射中,必须显式添加新字段。

 

Strict: 如果检测到新字段,则抛出异常并拒绝该文档。 必须将新字段显式添加到映射中。

 

PUT my_index

{

  "mappings": {

    "_doc": {

      "dynamic": "false",

      "properties": {

        "user": {

          "properties": {

            "name": {

              "type": "text"

            },

            "social_networks": {

              "dynamic": true,

              "properties": {}

            }

          }

        }

      }

    }

  }

}

 

 

PUT my_index/_doc/1

{

  "aa": "aa"

}

插入成功。

 

GET my_index/_search

{

  "query": {

    "match": {

      "aa": "aa"

    }

  }

}

返回结果:

"hits" : {

    "total" : 0,

    "max_score" : null,

    "hits" : [ ]

  }

 

搜索不到。

 

就算后面显示加字段,因为之前的数据没有被索引,索引之前已经插入的数据也索引不到。

 

Enabled 

   Elasticsearch尝试索引您提供的所有字段,但有时您只想存储字段而不对其进行索引。 例如,假设您使用Elasticsearch作为Web会话存储。 您可能希望索引会话ID和上次更新时间,但不需要在会话数据本身上查询或运行聚合。

 

启用的设置(仅适用于映射类型和对象字段)会导致Elasticsearch完全跳过对字段内容的解析。 仍然可以从_source字段检索JSON,但它不可搜索或以任何其他方式存储。

 

就是就把字段值存储到_source里面,但是不会对字段索引解析。

 

eager_global_ordinals:

   全局序数是doc值之上的数据结构,它维护词典顺序中每个唯一术语的增量编号。每个术语都有一个唯一的数字,术语A的数量低于术语B的数量。全局序数仅受关键字和文本字段的支持。在关键字字段中,默认情况下它们可用,但文本字段只能在具有所有相关行李的fielddata启用时使用。

 

Doc值(和fielddata)也有序数,这是特定段和字段中所有术语的唯一编号。通过提供段序数和全局序数之间的映射,全局序数构建在此之上,后者在整个分片中是唯一的。鉴于特定字段的全局序数与分片的所有分段相关联,只要一个新分段变得可见,就需要完全重建它们。

 

全局序数用于使用段序数的功能,例如术语聚合,以缩短执行时间。术语聚合完全依赖于全局序数来在分片级别执行聚合,然后仅将最终减少阶段的全局序数转换为实际术语,其结合来自不同分片的结果。

 

全局序数的加载时间取决于字段中的术语数,但通常它很低,因为它已经加载了源字段数据。全局序数的内存开销很小,因为它被非常有效地压缩。

 

默认情况下,全局序数在搜索时加载,如果您正在优化索引速度,这是正确的权衡。但是,如果您对搜索速度更感兴趣,那么在您计划在聚合术语中使用的字段上设置eager_global_ordinals:true会很有趣:

 

 

这会将成本从搜索时间转移到刷新时间。 Elasticsearch将确保在发布索引内容的更新之前构建全局序数。

 

Fielddata: 解决text 字段做聚合。文本字段使用名为fielddata的查询时内存数据结构。 第一次将字段用于聚合,排序或脚本时,此数据结构是根据需要构建的。 它是通过从磁盘读取每个段的整个反向索引,反转术语↔︎文档关系,并将结果存储在内存中的JVM堆中构建的。

Fielddata可能会消耗大量的堆空间,尤其是在加载高基数文本字段时。 一旦fielddata已加载到堆中,它将在该段的生命周期内保留。 此外,加载fielddata是一个昂贵的过程,可能会导致用户遇到延迟命中。 这就是默认情况下禁用fielddata的原因。

 

如果您尝试对文本字段上的脚本进行排序,聚合或访问,您将看到以下异常:

 

默认情况下,在文本字段上禁用Fielddata。 在[your_field_name]上设置fielddata = true,以便通过反转索引来加载内存中的fielddata。 请注意,这可能会占用大量内存。

 

 

 

PUT my_index

{

  "mappings": {

    "_doc": {

      "properties": {

        "my_field": {

          "type": "text",

          "fields": {

            "keyword": {

              "type": "keyword"

            }

          }

        }

      }

    }

  }

}

 

PUT my_index/_mapping/_doc

{

  "properties": {

    "my_field": {

      "type":     "text",

      "fielddata": true

    }

  }

}

 

 

PUT my_index/_doc/1

{

  "my_field": "hello word"

}

 

 

PUT my_index/_doc/2

{

  "my_field": "hello hi"

}

 

 

 

GET my_index/_search

{

  "aggs": {

    "group": {

      "terms": {

        "field": "my_field",

        "size": 10

      }

    }

  }

}

返回结果

  "aggregations" : {

    "group" : {

      "doc_count_error_upper_bound" : 0,

      "sum_other_doc_count" : 0,

      "buckets" : [

        {

          "key" : "hello",

          "doc_count" : 2

        },

        {

          "key" : "hi",

          "doc_count" : 1

        },

        {

          "key" : "word",

          "doc_count" : 1

        }

      ]

    }

  }

可以看出 对数据的中所有的term 进行了聚合。

 

fielddata_frequency_filter 

Fielddata过滤可用于减少加载到内存中的术语数量,从而减少内存使用量。 条款可按频率过滤:

 

频率过滤器允许您仅加载文档频率介于最小值和最大值之间的术语,可以表示为绝对数字(当数字大于1.0时)或百分比(例如0.01为1%,1.0为100)%)。 每段计算频率。 百分比基于具有该字段值的文档数,而不是该段中的所有文档。

 

通过使用min_segment_size指定段应包含的最小文档数,可以完全排除小段:

PUT my_index

{

  "mappings": {

    "_doc": {

      "properties": {

        "tag": {

          "type": "text",

          "fielddata": true,

          "fielddata_frequency_filter": {

            "min": 0.001,

            "max": 0.1,

            "min_segment_size": 500

          }

        }

      }

    }

  }

}

一般情况下   Fielddata 不会被使用。

 

 

Format 用于date类型,根据需要定义自己的时间格式。默认的格式是

"strict_date_optional_time||epoch_millis"

 

ignore_above

长度超过ignore_above设置的字符串将不会被索引或存储。 对于字符串数组,ignore_above将分别应用于每个数组元素,并且不会索引或存储比ignore_above更长的字符串元素。

 

 如果启用了后者,那么所有字符串/数组元素仍将出现在_source字段中,这是Elasticsearch中的默认值。

 

 

ignore_malformed

有时您无法控制所收到的数据。 一个用户可以发送作为日期的登录字段,另一个用户发送作为电子邮件地址的登录字段。

 

尝试将错误的数据类型索引到字段中默认情况下会抛出异常,并拒绝整个文档。 ignore_malformed参数(如果设置为true)允许忽略该异常。 格式错误的字段未编入索引,但文档中的其他字段正常处理。

 

Index:

 index选项控制是否索引字段值。 它接受true或false,默认为true。 未编制索引的字段不可查询。

 

index_options :

index_options参数控制将哪些信息添加到反向索引,以用于搜索和突出显示。 它接受以下设置:

docs

仅索引文档编号

 

freqs

Doc编号和术语频率被编入索引。 术语频率用于对重复术语进行高于单个术语的评分。

Positions

文档编号,术语频率和术语位置(或顺序)被编入索引。 位置可用于邻近或短语查询

 

Offsets

文档编号,术语频率,位置以及开始和结束字符偏移(将术语映射回原始字符串)都被编入索引。 统一荧光笔使用偏移来加速突出显示。

 

 

Fields

  这个通常被用来以不同的方式索引同一个字段。比如一个string字符串 text用来全文检索,keyword 用来聚合。

 PUT my_index

{

  "mappings": {

    "_doc": {

      "properties": {

        "city": {

          "type": "text",

          "fields": {

            "raw": {

              "type":  "keyword"

            }

          }

        }

      }

    }

  }

}

 

Norms规范存储稍后在查询时使用的各种归一化因子,以便相对于查询计算文档的分数。

尽管对评分很有用,但规范也需要相当多的磁盘(通常在索引中每个字段的每个文档大约一个字节的顺序,即使对于没有此特定字段的文档也是如此)。 因此,如果您不需要对特定字段进行评分,则应禁用该字段上的规范。 特别是,对于仅用于过滤或聚合的字段就是这种情况。

null_value 

  无法索引或搜索空值。 当一个字段设置为null(或一个空数组或一个空值数组)时,它被视为该字段没有值。

 

null_value参数允许您使用指定的值替换显式空值,以便可以对其进行索引和搜索。

null_value需要与字段的数据类型相同。 例如,long字段不能包含字符串null_value

null_value仅影响数据的索引方式,不会修改_source文档

 

position_increment_gap 

  分析的文本字段将术语位置考虑在内,以便能够支持邻近或短语查询。 使用多个值索引文本字段时,会在值之间添加“假”间隙,以防止大多数短语查询在值之间进行匹配。 使用position_increment_gap配置此间隙的大小,默认为100。

  就是字段是数组时,每个数组之间的间隔是100.

  

   PUT my_index/_doc/1

{

    "names": [ "John Abraham", "Lincoln Smith"]

}

 

GET my_index/_search

{

    "query": {

        "match_phrase": {

            "names": {

                "query": "Abraham Lincoln"  

            }

        }

    }

}

 

这个返回的空结果

 

GET my_index/_search

{

    "query": {

        "match_phrase": {

            "names": {

                "query": "Abraham Lincoln",

                "slop": 101  

            }

        }

    }

}

这个会返回结果 因为 slop position_increment_gap

 

 

PUT my_index

{

  "mappings": {

    "_doc": {

      "properties": {

        "names": {

          "type": "text",

          "position_increment_gap": 0  

        }

      }

    }

  }

}

 

PUT my_index/_doc/1

{

    "names": [ "John Abraham", "Lincoln Smith"]

}

 

GET my_index/_search

{

    "query": {

        "match_phrase": {

            "names": "Abraham Lincoln"  

        }

    }

}
这个会返回结果 因为position_increment_gap 为0。

 

properties 设置索引属性。

 

search_analyzer 通常,应在索引时和搜索时应用相同的分析器,以确保查询中的术语与反向索引中的术语具有相同的格式。

 

但有时,在搜索时使用不同的分析器是有意义的,例如在使用edge_ngram标记生成器进行自动完成时。

 

默认情况下,查询将使用字段映射中定义的分析器,但可以使用search_analyzer设置覆盖此设置:

     

 

  similarity 

 Elasticsearch允许您为每个字段配置评分算法或相似性。相似性设置提供了一种选择除默认BM25之外的相似性算法的简单方法,例如TF / IDF。

 

相似性主要用于文本字段,但也可以应用于其他字段类型。

 

可以通过调整内置相似性的参数来配置自定义相似性。有关此专家选项的更多详细信息,请参阅相似性模块。

 

开箱即用的唯一相似之处是没有任何进一步配置:

 

BM25

Okapi BM25算法。默认情况下在Elasticsearch和Lucene中使用的算法。有关详细信息,请参阅可插入相似度算法。

经典

TF / IDF算法曾经是Elasticsearch和Lucene的默认算法。有关更多信息,请参阅Lucene的实用评分函数。

布尔

一个简单的布尔相似性,在不需要全文排名时使用,分数应仅基于查询词是否匹配。布尔相似度为术语提供与其查询提升相等的分数。

 

PUT my_index

{

  "mappings": {

    "_doc": {

      "properties": {

        "default_field": {  

          "type": "text"

        },

        "boolean_sim_field": {

          "type": "text",

          "similarity": "boolean"  

        }

      }

    }

  }

}

 

store 

  默认情况下,字段值会被索引以使其可搜索,但不会存储它们。 这意味着可以查询该字段,但无法检索原始字段值。

 

通常这没关系。 字段值已经是_source字段的一部分,默认情况下存储该字段。 如果您只想检索单个字段或几个字段的值,而不是整个_source,则可以使用源过滤来实现。

 

在某些情况下,存储字段是有意义的。 例如,如果您有一个包含标题,日期和非常大的内容字段的文档,您可能只想检索标题和日期,而无需从大型_source字段中提取这些字段:

存储字段的另一种情况是那些没有出现在_source字段中的字段(例如copy_to字段)。

term_vector 

   设置trems被分词器处理的过程产生的属性。

no

No term vectors are stored. (default)

yes

Just the terms in the field are stored.

with_positions

Terms and positions are stored.

with_offsets

Terms and character offsets are stored.

with_positions_offsets

Terms, positions, and character offsets are stored.

 

 The fast vector highlighter requires with_positions_offsets. The term vectors API can retrieve whatever is stored.

设置with_positions_offsets会使字段索引的大小加倍。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ES(Elasticsearch)是一种开源的分布式搜索引擎,可以帮助我们高效地存储和检索大量的数据。在使用ES进行数据的索引和搜索之前,我们需要定义数据的映射(mapping)。ES mapping生成工具是用来辅助我们生成ES mapping的工具。 ES mapping定义了索引中每个字段的数据类型和分析器等信息。它可以帮助ES正确地解析和处理我们存储在索引中的数据。但是,对于有大量字段的复杂数据结构,手动编写mapping会非常繁琐且容易出错。因此,ES mapping生成工具可以根据数据的结构、类型和需求,自动生成合适的mapping。 使用ES mapping生成工具可以大大简化mapping的创建过程。我们只需要提供一些参数,如数据类型、分析器、字段的关系等,工具就会根据这些参数生成对应的mapping。这样不仅减少了手动编写mapping的工作量,还可以提高工作效率和准确性。 除了生成基本的字段映射外,ES mapping生成工具还可以根据需求添加额外的设置。例如,我们可以定义分词器、过滤器、搜索建议等功能。工具可以根据我们的需求,自动添加相应的设置,确保我们的数据能够被ES正确处理和搜索。 总之,ES mapping生成工具是用来辅助生成ES mapping的工具。它可以根据数据的结构和需求,自动生成合适的mapping,并提供额外的设置功能。使用工具可以简化mapping的创建过程,提高工作效率和准确性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值