elasticsearch-mapping字段重要属性

来源:互联网 发布:淘宝网首页官网十字绣 编辑:程序博客网 时间:2024/06/11 09:32

1、index定义字段的分析类型以及检索方式,控制字段值是否被索引.他可以设置成 true 或者 false。没有被索引的字段将无法搜索

    如果是no,则无法通过检索查询到该字段;
    如果设置为not_analyzed则会将整个字段存储为关键词,常用于汉字短语、邮箱等复杂的字符串;
    如果设置为analyzed则将会通过默认的standard分析器进行分析

2、enabled 设置只可以应用于映射类型和 object 字段,导致 Elasticsearch 完全跳过字段内容的解析.这个 JSON 仍然可以从 _source 字段中检索,但是不能以任何其他方式搜索或存储
    Elasticsearch 尝试着索引所有你提供的字段,但是有时候你只想要存储这个字段而不需要索引.例如,假设你正在使用 Elasticsearch 作为 web session 的存储.你可能想要索引 session ID 和最后一次更新时间,但不需要在 session 数据本身上查询或运行聚合。

3、内存的数据结构 fielddata.这个数据结构是第一次将字段用于聚合,排序,或者脚本时基于需求构建的。它是通过读取磁盘上的每个 segment(片段)的整个反向索引来构建的,将 term(词条)和 document(文档)关系反转,并将结果存储在内存中,在JVM的堆中.
    所有字段是默认被 indexed(被索引的),这使得它们是可搜索的.可以在脚本中排序,聚合和获取字段值,但是需要不同的搜索模式.
搜索需要回答一个问题 “哪个 document(文档) 包含这个 term(词条)”,然而排序和聚合需要回答一个不同的问题 " 这个字段在这个 document(文档)中的值是多少?".
    text 字段默认关闭 Fielddata 
Fielddata 会消耗很多堆空间,尤其是加载高基数的 text 字段的时候.一旦 fielddata 加载到堆中,它在  segment(片段)中的生命周期还是存在的.此外,加载  fielddata 是一件非常昂贵的过程,会导致用户体验到延迟的感觉.这就是为什么 fielddata 默认关闭.
如果你尝试对文本字段上的脚本进行排序,访问值,你会看到此异常:
Field data 在 text 字段上默认是关闭的.在 [your_field_name] 上设置 fielddata = true,以便通过反转反向索引来加载内存中的 fielddata。 请注意,这可能会使用显着的内存。
在开启fielddata之前
在你开启 fielddata  之前,考虑一下为什么你要在脚本中使用  text 来聚合,排序.通常这么做是没有意义的.
在索引之前分析 text 字段,以至于像 New York 这样的值可以通过 new 或者  york 来搜索.当你可能想要一个称作  New York  的单一bucket(桶), term(词条)在这个字段上聚合会返回一个 new bucket和一个 york bucket(桶).
相反,你应该使用 text 字段进行全文搜索,以及一个开启 doc_values 的 unanalyzed(未分析) keyword  字段用于聚合,mapping设置如下:
{    "mf":{      "_all":{        "enabled":false      },      "properties": {          "host": {            "type": "text",            "analyzer":"ik_max_word",            "fields": {              "keyword": {                "type": "keyword",                "ignore_above":256              }            }          },      }    }  }
  如上图,host字段既可以用于全文检索也可以用于聚合
查询每个省去重的host
{  "size":0,  "aggs":{    "group_by_province":{      "terms": {        "field": "province"      },      "aggs":{        "distinct_hosts":{          "cardinality": {            "field": "host.keyword"          }        }      }    } }}
安装了es-sql插件 sql语句:
select province,count(distinct host.keyword) from index group by province

4、fields将同一个字段用不同的方式索引。这就相当于实现了 multi-fields
例如,一个 string 类型字段可以被映射成 text 字段作为 full-text 进行搜索,同时也可以作为 keyword 字段用于排序和聚合:
curl -XPUT 'localhost:9200/my_index?pretty' -H 'Content-Type: application/json' -d'{  "mappings": {    "my_type": {      "properties": {        "city": {          "type": "text",          "fields": {            "raw": { #1              "type":  "keyword"            }          }        }      }    }  }}' 
text 字段作为 full-text 进行搜索,同时也可以作为 keyword 字段用于排序和聚合:

city.raw 字段是 city 字段的 keyword 类型字段
city 字段将被当做 full text 进行搜索
city.raw 可用于排序和聚合
Multi_fields 不会改变原始的 _source 字段。

Multi-fields with multiple analyzers(多分析器处理多字段)
multi-fields 的另一种使用情况是同一字段使用不同的解析方式,使其能更好的检索。例如,我们可以用标准分析器对字段进行索引,它将文本分解为单词,再用英文分析器将单词分成词根:
curl -XPUT 'localhost:9200/my_index?pretty' -H 'Content-Type: application/json' -d'{  "mappings": {    "my_type": {      "properties": {        "text": { #1          "type": "text",          "fields": {            "english": { #2              "type":     "text",              "analyzer": "english"            }          }        }      }    }  }}'curl -XPUT 'localhost:9200/my_index/my_type/1?pretty' -H 'Content-Type: application/json' -d'{ "text": "quick brown fox" } #3'curl -XPUT 'localhost:9200/my_index/my_type/2?pretty' -H 'Content-Type: application/json' -d'{ "text": "quick brown foxes" } #4'curl -XGET 'localhost:9200/my_index/_search?pretty' -H 'Content-Type: application/json' -d'{  "query": {    "multi_match": {      "query": "quick brown foxes",      "fields": [ #5        "text",        "text.english"      ],      "type": "most_fields" #6    }  }}'
text 字段使用标准分析器。
text.english 字段使用英文分析器。
同时索引两个文档,一个使用 fox,另一个使用 foxes。
同时搜索 text 和 text.english 字段,并合并其评分。
text 字段在第一个文档中包含词根 fox,在第二个文档中包含词根 foxes。text.english 字段在两个文档同时包含词根 fox,因为 foxes 是 fox 的衍生词。
字符串搜索会为 text 字段使用标准分析器解析,为 text.english 字段使用英文分析器解析。衍生字段将会使搜索 foxes 的同时匹配到 fox。这使我们能尽可能多的匹配到文档。同时,搜索没有衍生的 text 字段时,我们会在文档精确匹配 foxes 的时候提高其检索评分。

5、store定义了字段是否存储意思是,在ES中原始的文本会存储在_source里面(除非你关闭了它)。默认情况下其他提取出来的字段都不是独立存储的,是从_source里面提取出来的。当然你也可以独立的存储某个字段,只要设置store:true即可。
独立存储某个字段,在频繁使用某个特殊字段时很常用。而且获取独立存储的字段要比从_source中解析快得多,而且额外你还需要从_source中解析出来这个字段,尤其是_source特别大的时候。
不过需要注意的是,独立存储的字段越多,那么索引就越大;索引越大,索引和检索的过程就会越慢....

6、Doc values 是在 document 索引时间内构建在磁盘上的数据结构,这使得上面所说的数据访问模式成为可能.它们存储与 _source 相同的值,但是以列为主的方式存储.这使得排序和聚合效率更高.几乎所有字段类型都支持 Doc values ,除了 the notable exception of analyzed string fields.
    在默认情况下许多字段都是 indexed(被索引的),这使得它们可以被搜索.反向索引允许查询通过唯一性排序的 term(词根)列表来查询 term(词根),并且可以立即访问包含该 term(词根)的文档.
脚本中的排序,聚合和对字段值的访问需要一种不同的数据访问模式.我们不需要先查找 term(词根),再寻找对应的 documents(文档),而是可以先查找 document(文档),再查找它在一个字段中的 terms(词根).
默认情况下,支持 doc values 的所有字段都是开启的.如果你确定不需要在字段上进行排序和聚合,活从脚本中访问字段值,则可以禁用 doc values 来节省磁盘空间. 

7、个别字段可以自动  boost (提升)权重 – 通过相关性分数来进行计数 - 在查询的时候, boost(提升)
curl -XPUT 'localhost:9200/my_index?pretty' -H 'Content-Type: application/json' -d'{  "mappings": {    "my_type": {      "properties": {        "title": {          "type": "text",          "boost": 2  (1)        },        "content": {          "type": "text"        }      }    }  }}'

8、copy_to 参数允许你创建自定义的 _all 字段.换句换来说,可以将多个字段的值复制到 group field(组字段),然后可以作为单个字段进行查询.