1、ES逻辑结构
     索引-index:相当于db中的数据库名。索引命名规则:小写字母。
     类型-type:相当于数据库中的表名,为具有相同字段的文档定义的一个类型。
     字段-field:相当于表字段名,文档数据的属性命名
     映射-mapping:可以设置字段的数据类型、默认值、分析器、是否被索引等规则,是对文档的约束。常见的mapping属性包括:
         type:字段数据类型,常见的简单类型有:
             字符串:text(可分词的文本,与analyzer搭配使用)、keyword(精确值,不可分词,例如:国家名称、ip地址)
             数值:long、integer、short、byte、double、float
             布尔:boolean
             日期:date
             对象:object,嵌套子对象
         index:是否创建索引,默认为true。当设置为false时,该字段不参与搜索
         analyzer:分词器类型,ik_smart 粗粒度分词   ik_max_word 细粒度分词
         properties:嵌套对象的字段定义
     文档-document:相当于表中的一行数据,存在于index/type下面。文档以JSON格式存储,能够被索引
 2、拓展ik分词器的词库,只需要修改ik分词器目录中的config/IKAnalyzer.cfg.xml文件:
     去掉无效分词、新增词典设置、
     ik_smart 粗粒度分词   ik_max_word 细粒度分词
 3、DSL语法
     创建索引库: PUT /索引库名
         PUT /heima
         {
           "mappings": {
             "properties": {
               "info":{
                 "type": "text",
                 "index": true,
                 "analyzer": "ik_max_word"      //创建分词,建立倒排索引(词根 -> 文档编号)
                 "search_analyzer": "pinyin" //搜索分词器,例如按照拼音分词做搜索
               },
               "email":{
                 "type": "keyword",
                 "index": false
               },
               "name":{
                 "type": "object",
                 "properties": {
                   "firstName":{
                     "type":"keyword"
                   },
                   "lastName":{
                     "type":"keyword"
                   }
                 }
               }
             }
           }
         }
     查询索引库: GET /索引库名
         GET /heima
     删除索引库: 
         DELETE /索引库名
     修改索引库: ES禁止修改索引库原有字段(原有字段可能会带有倒排索引),可以添加新的字段
         PUT /索引库名/_mapping
         {
             "properties" :{
                 "新字段名" : {
                     type
                     index
                 }
             }
         }
     添加文档:
         POST /索引库名/_doc/文档ID
             POST /heima/_doc/2
             {
               "info": "黑马程序员",
               "email": "1256012967@qq.com",
               "name": {
                 "firstName": "maoshun",
                 "lastName": "leng"
               }
             }
     
     查询文档:
         GET /索引库名/_doc/文档ID
     删除文档:
         DELETE /索引库名/_doc/文档ID
     修改文档:
         方式一:全量修改文档, PUT /索引名/_doc/文档ID,先删除旧文档,再新增文档。如果旧文档不存在,直接新增
         方式二:增量修改-局部修改文档字段,POST /索引名/_update/文档ID,
             POST /heima/_update/2
             {
               "doc": {
                 "email":"lengmaoshun@esunny.cc"
               }
             }
 批量导入
数据查询基本语法:
     GET /索引名称/_search
     {
         "query":{
             "查询类型":{
                 "查询字段":"条件值"
             }
         }
     }
     查询类型有:
         match_all:查询所有数据,查询条件为空
         full text:全文检索查询,利用分词器对用户输入内容分词,然后去倒排索引库中匹配。查询类型有:
             match:只能对一个字段进行查询
             multi_match:可以对多个字段进行查询,只要有一个字段包含查询值,文档就能被查到。查询查询的字段越多,查询性能越差。可以把多个字段合并到一个字段做查询
         精确查询:根据精确词条值查找数据,一般是查找keyword、数值、日期等类型字段,不会对搜索条件分词,精确查询。查询类型有:
             ids
             range:根据值范围查询
             term:根据词条精确值查询
         布尔查询是一个或多个查询子句的组合,子查询的组合方式有:
             must:必须匹配每个子查询,类似 与
             should:选择性匹配子查询,类似 或
             must_node:必须不匹配,不参与算分,类似 非。不参与算分,查询速度快
             filter:必须匹配,不参与算分,过滤出
             
             查询:城市是上海,品种是皇冠假日、华美达,价格大于500,评分大于45的酒店
             GET /hotel/_search
             {
               "query":
               {
                "bool":{
                  "must":[{"term":{"city":"上海"}}],
                  "should":[{"term":{"brand":"皇冠假日"}},{"term":{"brand":"华美达"}}],
                  "must_not":[{ "range":{"price":{ "lte":500 } }}],
                  "filter":[{ "range":{"score":{ "gte":45 } }} 
                 }
               }
             }
         分页查询:ES最多只能查询10000条数据
             GET /hotel/_search
             {
                 "query" {
                     "查询类型":{
                         "查询字段":"查询值"
                     }
                 }
                 "from": 0, //分页开始的下标,默认是0
                 "size": 10, //每页显示的个数
                 "sort":[
                     {"price","asc"}
                 ]
             }
         高亮查询:把搜索中的关键字给高亮突出显示出来,不能用match_all。默认搜索字段与高亮字段必须一致才能高亮
             GET /heima/_search
             {
               "query":
               {
                "match": {
                  "info": "黑马"
                }
               },
               "highlight": {
                 "fields": {
                   "info": {
                     "pre_tags": "<em>",
                     "post_tags": "</em>"
                   },
                   // 搜索字段与高亮字段不一致也能高亮设置
                   "name.firstName": {
                     "require_field_match": "false"
                   }
                 }
               }
             }
         聚合可以实现对文档数据的统计、分析、运算。聚合常见的有三类
             桶(bucket)聚合:对文档分组
             度量(metric)聚合:最大值、最小值、平均值
             管道(pipeline)聚合:对其它聚合的结果再聚合
        分词器分词执行三步骤:
             character filters:在tokenizer之前对文本进行处理。例如删除字符、替换字符
             tokenizer:将文本按照一定的规则切割成词条(term)。例如keyword,就是不分词;还有ik smarttokenizer 
             filter:将tokenizer输出的词条做进一步处理。例如大小写转换、同义词处理、拼音处理等
        同义词分词器:
             PUT /testsyno
             {
               "settings": {
                 "analysis": {
                   "analyzer": {
                     "ik_syno_search_analyzer":{  // ik_syno_search_analyzer为自定义分词器名
                       "tokenizer":"ik_max_word",
                       "filter":[
                         "lowercase", //内置filter
                         "ik_syno_filer" //自定义filter
                       ]
                     }
                   },
                   "filter": {
                     "ik_syno_filer":{
                       "type":"synonym_graph",
                       "updateable":true, //开启热加载同义词,当配置文件发生变化时,需要执行POST /testsyno/_reload_search_analyzers加载最新同义词
                       "synonyms_path":"analysis/synonyms.txt"
                     }
                   }
                 }
               },
               "mappings": {
                 "properties": {
                   "content":{
                     "type": "text",
                     "analyzer": "ik_max_word", //添加文档创建倒排索引时使用到的分词器
                     "search_analyzer": "ik_syno_search_analyzer" // 关键词搜索使用的分词器
                   }
                 }
               }
             }
POST /testsyno/_reload_search_analyzers
            POST /testsyno/_analyze 
             {
               "analyzer": "ik_syno_search_analyzer",
               "text": "HELLO,china"
             }
            POST /testsyno/_doc/1 
             {
               "content":"hello,我的小宝贝"
             }
            POST /testsyno/_doc/2
             {
               "content":"我爱你,中国"
             }
            GET /testsyno/_search 
             {
               "query": {
                 "match": {
                   "content": "china"
                 }
               }
             }
        
         自动补全分词器: 查询出以用户输入内容开头的词条
             安装拼音分词器:
             自定义分词器: