1

ElasticSerach 7 教程

 1 year ago
source link: https://www.jansora.com/notebook/317
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

[TOC]

ElasticSerach 7 教程

一、 ElasticSerach 认识

1.1 索引 index

  • 一个索引可以理解成一个关系数据库的库

1.2 类型 type

  • 一种type就像一类表,比如user表,order表

1.3 映射 mapping

  • mapping定义了每个字段的类型等信息。相当于关系型数据库中的表结

1.4 文档 document

  • 一个document相当于关系型数据库中的一⾏行行记录

1.5 字段 field

  • 相当于关系型数据库表的字段

1.6 集群 cluster

-集群由一个或多个节点组成,一个集群有一个默认名称"elasticsearch"

1.7 节点 node

  • 集群的节点,一台机器 或者一个进程

1.8 分片和副本 node

  • 副本是分片的副本。分⽚有主分片(primary Shard)和副本分片(replica Shard)之分。Index数据在物理理上被分布在多个主分片中,每个主分片只存放部分数据。每个主分⽚可以有多个副本,叫副本分片,是主分片的复制。

1.9 核心数据类型

1.9.1 字符串:

  1. 用于全文索引,该类型的字段将通过分词器 进⾏分词
  • keyword
  1. 不分词,只能搜索该字段的完整的值

1.9.2 数值型

  1. long, integer, short, byte, double, float, half_float, scaled_float

1.9.3 数值型 boolean

  • boolean

1.9.3 二进制

  • binary
  1. 该类型的字段把值当做经过 base64 编码的字符串,默认不存储,且不可搜索

1.9.4 范围类型

  1. 范围类型表示值是一个范围,而不是⼀个具体的值
  2. integer_range, float_range, long_range, double_range, date_range
  3. 譬如 age 的类型是 integer_range,那么值可以是 {"gte" : 20, "lte" : 40};搜索 "term" : {"age": 21} 可以搜索该值

1.9.5 日期

  1. 由于Json没有date类型,所以es通过识别字符串是否符合format定义的格式来判断是否为date类型
  2. format默认为:strict_date_optional_time||epoch_millis
  3. "2022-01-01" "2022/01/01 12:10:30" 这种字符串格式

二、索引基本操作

2.1 创建索引 PUT请求

localhost:9200/nba
{
    "acknowledged": true,
    "shards_acknowledged": true,
    "index": "nba"
}

2.2 查看索引 GET请求

localhost:9200/nba
{
    "nba": {
        "aliases": {},  // 别名
        "mappings": {}, // 表结构
        "settings": {   // 索引设置
            "index": {  // 创建时间
                "creation_date": "1573278626713",
                "number_of_shards": "1",    // 分片数量
                "number_of_replicas": "1",  // 副本数量
                "uuid": "eeQmIsZ8Tl-GJ-xpFuOirg",   // UUID 索引的唯一ID
                "version": {
                    "created": "7020199"
                },
                "provided_name": "nba"
            }
        }
    }
}

2.4 删除索引 DELETE请求

localhost:9200/nba
{
    "acknowledged": true
}

2.5 批量获取索引 GET请求

localhost:9200/cba,nba
{
    "cba": {
        "aliases": {},
        "mappings": {},
        "settings": {
            "index": {
                "creation_date": "1573281458107",
                "number_of_shards": "1",
                "number_of_replicas": "1",
                "uuid": "ikxZrzk2TVqQn7zRi2_glw",
                "version": {
                    "created": "7020199"
                },
                "provided_name": "cba"
            }
        }
    },
    "nba": {
        "aliases": {},
        "mappings": {},
        "settings": {
            "index": {
                "creation_date": "1573281355145",
                "number_of_shards": "1",
                "number_of_replicas": "1",
                "uuid": "hkhv1WKSQqWil3P9UXt3Aw",
                "version": {
                    "created": "7020199"
                },
                "provided_name": "nba"
            }
        }
    }
}

2.6 获取全部索引 GET请求

localhost:9200/_all
}
    }
    "cba": {
        "aliases": {},
        "mappings": {},
        "settings": {
            "index": {
                "creation_date": "1573281458107",
                "number_of_shards": "1",
                "number_of_replicas": "1",
                "uuid": "ikxZrzk2TVqQn7zRi2_glw",
                "version": {
                    "created": "7020199"
                },
                "provided_name": "cba"
            }
        }
    },
    "nba": {
        "aliases": {},
        "mappings": {},
        "settings": {
            "index": {
                "creation_date": "1573281355145",
                "number_of_shards": "1",
                "number_of_replicas": "1",
                "uuid": "hkhv1WKSQqWil3P9UXt3Aw",
                "version": {
                    "created": "7020199"
                },
                "provided_name": "nba"
            }
        }
    }

2.7 使用_cat获取全部索引 GET请求

localhost:9200/_cat/indices?v
health status index                uuid                   pri rep docs.count docs.deleted store.size pri.store.size
green  open   .kibana_task_manager YA0slSRkRJqrE_jF0aOlFA   1   0          2            0     45.5kb         45.5kb
yellow open   cba                  ikxZrzk2TVqQn7zRi2_glw   1   1          0            0       230b           230b
yellow open   nba                  hkhv1WKSQqWil3P9UXt3Aw   1   1          0            0       283b           283b
green  open   .kibana_1            579wwXgCQJKJU1Ge7cJVXw   1   0          4            1       24kb           24kb

2.8 判断索引是否存在 HEAD请求

localhost:9200/nba
状态码"200"则为存在,不存在则为"404"

2.9 关闭索引 不删除 POST请求

localhost:9200/nba/_close
{
    "acknowledged": true,
    "shards_acknowledged": true
}

2.10 打开索引 POST请求

localhost:9200/nba/_open
{
    "acknowledged": true,
    "shards_acknowledged": true
}

三、映射的介绍与使用

  • type: text 可分词
  • type: keyword 不可分词

3.1 创建Mapping PUT请求

localhost:9200/nba/_mapping
{
   "properties":{ //字段的信息
      "name":{
         "type":"text"
      },
      "team_name":{
         "type":"text"
      },
      "position":{
         "type":"keyword"
      },
      "play_year":{
         "type":"keyword"
      },
      "jerse_no":{
         "type":"keyword"
      }
   }
}
{
    "acknowledged": true
}

3.2 查看Mapping信息 GET请求

localhost:9200/nba/_mapping
{
    "nba": {
        "mappings": {
            "properties": {
                "jerse_no": {
                    "type": "keyword"
                },
                "name": {
                    "type": "text"
                },
                "play_year": {
                    "type": "keyword"
                },
                "position": {
                    "type": "keyword"
                },
                "team_name": {
                    "type": "text"
                }
            }
        }
    }
}

3.3 批量获取Mapping信息 GET请求

localhost:9200/nba,cba/_mapping
{
    "nba": {
        "mappings": {
            "properties": {
                "jerse_no": {
                    "type": "keyword"
                },
                "name": {
                    "type": "text"
                },
                "play_year": {
                    "type": "keyword"
                },
                "position": {
                    "type": "keyword"
                },
                "team_name": {
                    "type": "text"
                }
            }
        }
    },
    "cba": {
        "mappings": {}
    }
}

3.4 获取所有Mapping信息第一种方式 GET请求

localhost:9200/_mapping
{
    "nba": {
        "mappings": {
            "properties": {
                "jerse_no": {
                    "type": "keyword"
                },
                "name": {
                    "type": "text"
                },
                "play_year": {
                    "type": "keyword"
                },
                "position": {
                    "type": "keyword"
                },
                "team_name": {
                    "type": "text"
                }
            }
        }
    },
    "cba": {
        "mappings": {}
    }
}

3.5 获取所有Mapping信息第二种方式 GET请求

localhost:9200/_all/_mapping
{
    "nba": {
        "mappings": {
            "properties": {
                "jerse_no": {
                    "type": "keyword"
                },
                "name": {
                    "type": "text"
                },
                "play_year": {
                    "type": "keyword"
                },
                "position": {
                    "type": "keyword"
                },
                "team_name": {
                    "type": "text"
                }
            }
        }
    },
    "cba": {
        "mappings": {}
    }
}

3.6 增加Mapping字段 POST请求

  • Mapping 只可增加字段不可修改字段

localhost:9200/nba/_mapping
{
   "properties":{ 
      "name":{
         "type":"text"
      },
      "team_name":{
         "type":"text"
      },
      "position":{
         "type":"keyword"
      },
      "play_year":{
         "type":"keyword"
      },
      "jerse_no":{
         "type":"keyword"
      },
      "country":{  // 增加的国家字段
         "type":"keyword"
      }
   }
}
{
    "acknowledged": true
}

四、文档的增删改查

4.1 新增文档 指定ID PUT/POST请求

localhost:9200/nba/_doc/1
{
   "name":"哈登",
   "team_name":"火箭",
   "position":"得分后卫",
   "play_year":"10",
   "jerse_no":"13"
}
{
    "_index": "nba",
    "_type": "_doc",
    "_id": "1", //文档的ID
    "_version": 1,
    "result": "created", // 响应结果
    "_shards": {
        "total": 2,
        "successful": 1,
        "failed": 0
    },
    "_seq_no": 0,
    "_primary_term": 1
}

4.2 新增文档 自动生成ID POST请求

  • 注意: 不指定IP只能使用POST请求

  • 注意: 自动生成ID开关要打开,关闭状态无法自动创建ID

localhost:9200/nba/_doc
{
   "name":"库里",
   "team_name":"勇士",
   "position":"组织后卫",
   "play_year":"10",
   "jerse_no":"30"
}
{
    "_index": "nba",
    "_type": "_doc",
    "_id": "7PkGT24BeuZ7t7g8CXe-", // 自动生成ID
    "_version": 1,
    "result": "created",
    "_shards": {
        "total": 2,
        "successful": 1,
        "failed": 0
    },
    "_seq_no": 3,
    "_primary_term": 1
}

4.3 自动创建索引 POST请求

  • 查看auto_create_index开关状态,请求http://localhost:9200/_cluster/settings

  • 注意:当索引不存在并且auto_create_index为true的时候,新增文档时会⾃动创建索引,若为false是不能自动创建索引

localhost:9200/wnba/_doc/1
{
   "name":"周琦",
   "team_name":"波兰国家队",
   "position":"中锋",
   "play_year":"3",
   "jerse_no":"9"
}
{
    "_index": "wnba", // 自动创建的索引
    "_type": "_doc",
    "_id": "1",
    "_version": 1,
    "result": "created",
    "_shards": {
        "total": 2,
        "successful": 1,
        "failed": 0
    },
    "_seq_no": 0,
    "_primary_term": 1
}

4.4 查看自动创建的索引 GET请求

localhost:9200/wnba
{
    "wnba": {
        "aliases": {},
        "mappings": {
            "properties": {
                "jerse_no": {
                    "type": "text",
                    "fields": {
                        "keyword": {
                            "type": "keyword",
                            "ignore_above": 256
                        }
                    }
                },
                "name": {
                    "type": "text",
                    "fields": {
                        "keyword": {
                            "type": "keyword",
                            "ignore_above": 256
                        }
                    }
                },
                "play_year": {
                    "type": "text",
                    "fields": {
                        "keyword": {
                            "type": "keyword",
                            "ignore_above": 256
                        }
                    }
                },
                "position": {
                    "type": "text",
                    "fields": {
                        "keyword": {
                            "type": "keyword",
                            "ignore_above": 256
                        }
                    }
                },
                "team_name": {
                    "type": "text",
                    "fields": {
                        "keyword": {
                            "type": "keyword",
                            "ignore_above": 256
                        }
                    }
                }
            }
        },
        "settings": {
            "index": {
                "creation_date": "1573284418718",
                "number_of_shards": "1",
                "number_of_replicas": "1",
                "uuid": "fKs9KZ11R3-_zgKi8WFQTQ",
                "version": {
                    "created": "7020199"
                },
                "provided_name": "wnba"
            }
        }
    }
}

4.5 指定操作类型

  • 新增或修改的时候可能会把原有文档修改掉,这里可以指定类型

  • 比如文档存在,我要新增一条文档,但是没有指定类型可能修改掉原有的文档

localhost:9200/nba/_doc/1?op_type=create
{
   "name":"周琦",
   "team_name":"波兰国家队",
   "position":"中锋",
   "play_year":"3",
   "jerse_no":"9"
}
{
    "error": {
        "root_cause": [
            {
                "type": "version_conflict_engine_exception",
                // 文档已经存在
                "reason": "[1]: version conflict, document already exists (current version [5])",
                "index_uuid": "hkhv1WKSQqWil3P9UXt3Aw",
                "shard": "0",
                "index": "nba"
            }
        ],
        "type": "version_conflict_engine_exception",
        "reason": "[1]: version conflict, document already exists (current version [5])",
        "index_uuid": "hkhv1WKSQqWil3P9UXt3Aw",
        "shard": "0",
        "index": "nba"
    },
    "status": 409
}

4.6 查看指定ID文档 GET请求

localhost:9200/nba/_doc/1
{
   "_index": "nba",
   "_type": "_doc",
   "_id": "1",
   "_version": 5,
   "_seq_no": 5,
   "_primary_term": 1,
   "found": true,
   "_source": {
      "name": "哈登",
      "team_name": "火箭",
      "position": "得分后卫",
      "play_year": "10",
      "jerse_no": "13"
   }
}

4.7 查看多条文档 第一种方式 GET/POST请求

localhost:9200/_mget
{
   "docs" : [ // 指定标签
      {
         "_index" : "nba", // 指定索引
         "_type" : "_doc", // 默认类型
         "_id" : "1"       // 指定ID
      },
      {
         "_index" : "nba",
         "_type" : "_doc",
         "_id" : "2"
      }
   ]
}

{
   "docs": [
      {
         "_index": "nba",
         "_type": "_doc",
         "_id": "1",
         "_version": 5,
         "_seq_no": 5,
         "_primary_term": 1,
         "found": true,
         "_source": {
            "name": "哈登",
            "team_name": "火箭",
            "position": "得分后卫",
            "play_year": "10",
            "jerse_no": "13"
         }
      },
      {
         "_index": "nba",
         "_type": "_doc",
         "_id": "2",
         "found": false
      }
   ]
}

4.8 查看多条文档 第二种方式 GET/POST请求

localhost:9200/nba/_mget // 先指定索引
{
   "docs" : [
      {
         "_type" : "_doc",
         "_id" : "1"
      },
      {
         "_type" : "_doc",
         "_id" : "2"
      }
   ]
}
{
   "docs": [
      {
         "_index": "nba",
         "_type": "_doc",
         "_id": "1",
         "_version": 5,
         "_seq_no": 5,
         "_primary_term": 1,
         "found": true,
         "_source": {
            "name": "哈登",
            "team_name": "火箭",
            "position": "得分后卫",
            "play_year": "10",
            "jerse_no": "13"
         }
      },
      {
         "_index": "nba",
         "_type": "_doc",
         "_id": "2",
         "found": false
      }
   ]
}

4.9 查看多条文档 第三种方式 GET/POST请求

localhost:9200/nba/_doc/_mget    //指定索引、类型
{
   "docs" : [
      {
         "_id" : "1"
      },
      {
         "_id" : "2"
      }
   ]
}
{
   "docs": [
      {
         "_index": "nba",
         "_type": "_doc",
         "_id": "1",
         "_version": 5,
         "_seq_no": 5,
         "_primary_term": 1,
         "found": true,
         "_source": {
            "name": "哈登",
            "team_name": "火箭",
            "position": "得分后卫",
            "play_year": "10",
            "jerse_no": "13"
         }
      },
      {
         "_index": "nba",
         "_type": "_doc",
         "_id": "2",
         "found": false
      }
   ]
}

4.10 查看多条文档 第四种方式 GET/POST请求

localhost:9200/nba/_doc/_mget
{
   "ids":["1","2"]
}
{
   "docs": [
      {
         "_index": "nba",
         "_type": "_doc",
         "_id": "1",
         "_version": 5,
         "_seq_no": 5,
         "_primary_term": 1,
         "found": true,
         "_source": {
            "name": "哈登",
            "team_name": "火箭",
            "position": "得分后卫",
            "play_year": "10",
            "jerse_no": "13"
         }
      },
      {
         "_index": "nba",
         "_type": "_doc",
         "_id": "2",
         "found": false
      }
   ]
}

4.11 修改文档 POST请求

  • 根据提供的文档片段更新数据

localhost:9200/nba/_update/1
{
   "doc": { // doc标签必须存在
         "name": "哈登",
         "team_name": "火箭",
         "position": "双能卫",
         "play_year": "10",
         "jerse_no": "13"
   }
}
{
    "_index": "nba",
    "_type": "_doc",
    "_id": "1",
    "_version": 7,
    "result": "updated",
    "_shards": {
        "total": 2,
        "successful": 1,
        "failed": 0
    },
    "_seq_no": 7,
    "_primary_term": 1
}

4.12 向_source增加字段 POST请求

localhost:9200/nba/_update/1
{
    // script:标签 ctx:上下文 ._source = _source
    // 语义:通过上下文拿到 _source字段,新增age为18
   "script": "ctx._source.age = 18"
}
{
    "_index": "nba",
    "_type": "_doc",
    "_id": "1",
    "_version": 8,
    "result": "updated",
    "_shards": {
        "total": 2,
        "successful": 1,
        "failed": 0
    },
    "_seq_no": 8,
    "_primary_term": 1
}

4.13 向_source删除字段 POST请求

localhost:9200/nba/_update/1
{
    // json格式无法出现多个" 所以需要转义符
   "script": "ctx._source.remove(\"age\")"
}
{
    "_index": "nba",
    "_type": "_doc",
    "_id": "1",
    "_version": 9,
    "result": "updated",
    "_shards": {
        "total": 2,
        "successful": 1,
        "failed": 0
    },
    "_seq_no": 9,
    "_primary_term": 1
}

4.14 更新指定文档的字段 POST请求

localhost:9200/nba/_update/1
{
   "script": {
        // 先获取ID为1的数据,之后进行age+4
      "source": "ctx._source.age += params.age",
        // 指定参数
      "params": {
         "age": 4
      }
   },
    // 若存在则修改,若不存在则新增
   "upsert":{
      "age": 1
   }
}
{
    "_index": "nba",
    "_type": "_doc",
    "_id": "1",
    "_version": 11,
    "result": "updated",
    "_shards": {
        "total": 2,
        "successful": 1,
        "failed": 0
    },
    "_seq_no": 11,
    "_primary_term": 1
}
  • 查询更新结果

localhost:9200/nba/_doc/1
{
    "_index": "nba",
    "_type": "_doc",
    "_id": "1",
    "_version": 11,
    "_seq_no": 11,
    "_primary_term": 1,
    "found": true,
    "_source": {
        "name": "大胡子",
        "team_name": "火箭",
        "position": "双能卫",
        "play_year": "10",
        "jerse_no": "13",
        "age": 22
    }
}

4.15 upsert介绍

  • upsert 当指定的⽂文档不不存在时,upsert参数包含的内容将会被插⼊入到索引中,作为⼀一个新⽂文档;如果指定的⽂文档存在,ElasticSearch引擎将会执⾏行行指定的更更新逻辑

localhost:9200/nba/_update/3
{
   "script": {
      "source": "ctx._source.allstar += params.allstar",
      "params": {
         "allstar": 4
      }
   },
   "upsert": {
      "allstar": 1
   }
}

{
    "_index": "nba",
    "_type": "_doc",
    "_id": "3",
    "_version": 1,
    "result": "created",
    "_shards": {
        "total": 2,
        "successful": 1,
        "failed": 0
    },
    "_seq_no": 12,
    "_primary_term": 1
}
  • 查询更新结果upsert结果

localhost:9200/nba/_doc/3
{
    "_index": "nba",
    "_type": "_doc",
    "_id": "3",
    "_version": 1,
    "_seq_no": 12,
    "_primary_term": 1,
    "found": true,
    "_source": {
        "allstar": 1
    }
}

4.16 删除文档 DELETE请求

localhost:9200/nba/_doc/3
{
    "_index": "nba",
    "_type": "_doc",
    "_id": "3",
    "_version": 2,
    "result": "deleted",
    "_shards": {
        "total": 2,
        "successful": 1,
        "failed": 0
    },
    "_seq_no": 13,
    "_primary_term": 1
}

五、文档的搜索

  • term(词条)查询和full text(全⽂文)查询

  • 词条查询:词条查询不会分析查询条件,只有当词条和查询字符串完全匹配时,才匹配搜索

  • 全⽂查询:ElasticSearch引擎会先分析查询字符串,将其拆分成多个分词,只要已分析的字段中包含词条的任意⼀个,或全部包含,就匹配查询条件,返回该⽂档;如果不包含任意一个分词,表示没有任何文档匹配查询条件

5.1 单条trem查询 GET/POST请求

  • term 关键字查询,精确查询

  • 例如Sql的where条件

localhost:9200/nba/_search
{   
    // 语义: 查询词条球号为23
   "query":{   // 查询
       "term":{    // 词条
         "jerse_no":"23" // 字段名称
      }
   }
}
{
   "took": 2,
   "timed_out": false,
   "_shards": {
      "total": 1,
      "successful": 1,
      "skipped": 0,
      "failed": 0
   },
   "hits": {
      "total": {
         "value": 1,
         "relation": "eq"
      },
      "max_score": 0.9808292,
      "hits": [
         {
            "_index": "nba",
            "_type": "_doc",
            "_id": "3",
            "_score": 0.9808292,
            "_source": {
               "name": "詹姆斯",
               "team_name": "湖人",
               "position": "小前锋",
               "play_year": "15",
               "jerse_no": "23"
            }
         }
      ]
   }
}

5.2 多条trem查询 GET/POST请求

localhost:9200/nba/_search
{
   "query":{
      "terms":{ // 这里使用terms
         "jerse_no": ["23","13"]
      }
   }
}
{
   "took": 0, // 消耗时间
   "timed_out": false, // 是否超时
   "_shards": { // 分片
      "total": 1, // 分片总体 1 
      "successful": 1, // 成功 1
      "skipped": 0,
      "failed": 0
   },
   "hits": { // 命中
      "total": { // 查询总数
         "value": 2, // 2条
         "relation": "eq"
      },
      "max_score": 1.0, // 最大分数 返回结果按照分数最大排序
      "hits": [
         {
            "_index": "nba",
            "_type": "_doc",
            "_id": "1",
            "_score": 1.0,
            "_source": {
               "name": "哈登",
               "team_name": "火箭",
               "position": "得分后卫",
               "play_year": "10",
               "jerse_no": "13"
            }
         },
         {
            "_index": "nba",
            "_type": "_doc",
            "_id": "3",
            "_score": 1.0,
            "_source": {
               "name": "詹姆斯",
               "team_name": "湖人",
               "position": "小前锋",
               "play_year": "15",
               "jerse_no": "23"
            }
         }
      ]
   }
}

5.2 match_all查询 GET/POST请求

localhost:9200/nba/_search
{
   "query":{
      "match_all":{} // 查询全部文档,默认显示10条记录
   },
   "from": 0, // 从0开始
   "size": 100 // 查询100条
}
{
   "took": 0,
   "timed_out": false,
   "_shards": {
      "total": 1,
      "successful": 1,
      "skipped": 0,
      "failed": 0
   },
   "hits": {
      "total": {
         "value": 3,
         "relation": "eq"
      },
      "max_score": 1.0,
      "hits": [
         {
            "_index": "nba",
            "_type": "_doc",
            "_id": "1",
            "_score": 1.0,
            "_source": {
               "name": "哈登",
               "team_name": "火箭",
               "position": "得分后卫",
               "play_year": "10",
               "jerse_no": "13"
            }
         },
         {
            "_index": "nba",
            "_type": "_doc",
            "_id": "2",
            "_score": 1.0,
            "_source": {
               "name": "库里",
               "team_name": "勇士",
               "position": "控球后卫",
               "play_year": "10",
               "jerse_no": "30"
            }
         },
         {
            "_index": "nba",
            "_type": "_doc",
            "_id": "3",
            "_score": 1.0,
            "_source": {
               "name": "詹姆斯",
               "team_name": "湖人",
               "position": "小前锋",
               "play_year": "15",
               "jerse_no": "23"
            }
         }
      ]
   }
}

5.3 match查询 GET/POST请求

localhost:9200/nba/_search
{
   "query":{
      "match":{ // 这里使用match
         "name": "库小里" //name:字段 会进行分词匹配
      }
   },
   "from": 0,
   "size": 100
}
{
   "took": 1,
   "timed_out": false,
   "_shards": {
      "total": 1,
      "successful": 1,
      "skipped": 0,
      "failed": 0
   },
   "hits": {
      "total": {
         "value": 1,
         "relation": "eq"
      },
      "max_score": 2.0834165,
      "hits": [
         {
            "_index": "nba",
            "_type": "_doc",
            "_id": "2",
            "_score": 2.0834165,
            "_source": {
               "name": "库里",
               "team_name": "勇士",
               "position": "控球后卫",
               "play_year": "10",
               "jerse_no": "30"
            }
         }
      ]
   }
}

5.4 multi_match 多个查询 GET/POST请求

localhost:9200/nba/_search
{
   "query":{
      "multi_match":{ // 选定多个字段所以使用multi_match
         "query": "shooter",
         "fields": ["title","name"]  // 指定字段
      }
   }
}
{
    "took": 1,
    "timed_out": false,
    "_shards": {
        "total": 1,
        "successful": 1,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": {
            "value": 1,
            "relation": "eq"
        },
        "max_score": 0.18232156,
        "hits": [
            {
                "_index": "nba",
                "_type": "_doc",
                "_id": "2",
                "_score": 0.18232156,
                "_source": {
                    "name": "库里",
                    "team_name": "勇士",
                    "position": "控球后卫",
                    "play_year": 10,
                    "jerse_no": "30",
                    "title": "the best shooter"
                }
            }
        ]
    }
}

5.4 match_phrase 多个查询 GET/POST请求

  • 准确查询 类似词条查询

localhost:9200/nba/_search
{
   "query":{
      "match_phrase":{
         "position": "得分后卫"
      }
   }
}
{
   "took": 3,
   "timed_out": false,
   "_shards": {
      "total": 1,
      "successful": 1,
      "skipped": 0,
      "failed": 0
   },
   "hits": {
      "total": {
         "value": 1,
         "relation": "eq"
      },
      "max_score": 3.277387,
      "hits": [
         {
            "_index": "nba",
            "_type": "_doc",
            "_id": "1",
            "_score": 3.277387,
            "_source": {
               "name": "哈登",
               "team_name": "火箭",
               "position": "得分后卫",
               "play_year": "10",
               "jerse_no": "13"
            }
         }
      ]
   }
}

5.5 match_phrase_profix 多个查询 GET/POST请求

  • 可以增加前缀

localhost:9200/nba/_search
{
   "query":{
      "match_phrase_prefix":{
         "title": "the" // 指定了前缀
      }
   }
}
{
    "took": 1,
    "timed_out": false,
    "_shards": {
        "total": 1,
        "successful": 1,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": {
            "value": 1,
            "relation": "eq"
        },
        "max_score": 0.2876821,
        "hits": [
            {
                "_index": "nba",
                "_type": "_doc",
                "_id": "2",
                "_score": 0.2876821,
                "_source": {
                    "name": "库里",
                    "team_name": "勇士",
                    "position": "控球后卫",
                    "play_year": 10,
                    "jerse_no": "30",
                    "title": "the best shooter"
                }
            }
        ]
    }
}

六、ElasticSerach 搜索

6.1 批量导入数据

  • Bulkl
  1. ES提供了Bulk的API 来进行批量操作
  • 数据结构类型,以换行区分
// 必须有一个索引叫book 
{"index": {"_index": "book", "_type": "_doc", "_id": 1}}
{"name": "权力的游戏"}
{"index": {"_index": "book", "_type": "_doc", "_id": 2}}
{"name": "疯狂的石头"}
 // 结尾必须有换行
curl -X POST "localhost:9200/_bulk" -H 'Content-Type: application/json' --data-binary @name // name就是文件的路径和名字
{
   "query":{
      "match_all":{} 
   },
   "from": 0, 
   "size": 100
}

6.2 trem多种查询

  • 单词级别查询
  1. 这些查询通常⽤用于结构化的数据,⽐比如:number, date, keyword等,而不是对text。
  2. 也就是说,全⽂本查询之前要先对⽂本内容进⾏分词,⽽单词级别的查询直接在相应字段的反向索引中精确查找,单词级别的查询⼀般⽤于数值、⽇期等类型的字段上
  • 准备索引 进行批量导入,数据在player中
 {
   "mappings":{
      "properties":{
         "birthDay":{
            "type":"date"
            
         },
         "birthDayStr": {
            "type":"keyword"
            
         },
         "age":{
            "type":"integer"
            
         },
         "code": {
            "type":"text"
            
         },
         "country":{
            "type":"text"
            
         },
         "countryEn": {
            "type":"text"
            
         },
         "displayAffiliation":{
            "type":"text"
            
         },
         "displayName": {
            "type":"text"
            
         },
         "displayNameEn":{
            "type":"text"
            
         },
         "draft": {
            "type":"long"
            
         },
         "heightValue":{
            "type":"float"
            
         },
         "jerseyNo": {
            "type":"text"
            
         },
         "playYear":{
            "type":"long"
         },
         "playerId": {
            "type":"keyword"
            
         },
         "position":{
            "type":"text"
            
         },
         "schoolType": {
            "type":"text"
            
         },
         "teamCity":{
            "type":"text"
            
         },
         "teamCityEn": {
            "type":"text"
            
         },
         "teamConference": {
            "type":"keyword"
            
         },
         "teamConferenceEn":{
            "type":"keyword"
            
         },
         "teamName": {
            "type":"keyword"
            
         },
         "teamNameEn":{
            "type":"keyword"
            
         },
         "weight": {
            "type":"text"
         }
      }
   }
 }

6.2.1 term query 精准匹配查询 GET/POST请求

localhost:9200/nba/_search
{   
    // 语义:精确查找球衣23号数据并分页
  "query": {
    "term": {
      "jerseyNo": 23
    }
  },
  "from": 0,
  "size": 20
}
{
    "took": 0,
    "timed_out": false,
    "_shards": {
        "total": 1,
        "successful": 1,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": {
            "value": 11,
            "relation": "eq"
        },
        "max_score": 3.6167762,
        "hits": [
            {
                "_index": "nba",
                "_type": "_doc",
                "_id": "73",
                "_score": 3.6167762,
                "_source": {
                    "countryEn": "United States",
                    "teamName": "雄鹿",
                    "birthDay": 792392400000,
                    "country": "美国",
                    "teamCityEn": "Milwaukee",
                    "code": "sterling_brown",
                    "displayAffiliation": "Southern Methodist/United States",
                    "displayName": "斯特林 布朗",
                    "schoolType": "College",
                    "teamConference": "东部",
                    "teamConferenceEn": "Eastern",
                    "weight": "105.2 公斤",
                    "teamCity": "密尔沃基",
                    "playYear": 2,
                    "jerseyNo": "23",
                    "teamNameEn": "Bucks",
                    "draft": 2017,
                    "displayNameEn": "Sterling Brown",
                    "heightValue": 1.98,
                    "birthDayStr": "1995-02-10",
                    "position": "后卫",
                    "age": 24,
                    "playerId": "1628425"
                }
            },
            {
                "_index": "nba",
                "_type": "_doc",
                "_id": "78",
                "_score": 3.6167762,
                "_source": {
                    "countryEn": "United States",
                    "teamName": "独行侠",
                    "birthDay": 721544400000,
                    "country": "美国",
                    "teamCityEn": "Dallas",
                    "code": "trey_burke",
                    "displayAffiliation": "Michigan/United States",
                    "displayName": "特雷 伯克",
                    "schoolType": "College",
                    "teamConference": "西部",
                    "teamConferenceEn": "Western",
                    "weight": "79.4 公斤",
                    "teamCity": "达拉斯",
                    "playYear": 6,
                    "jerseyNo": "23",
                    "teamNameEn": "Mavericks",
                    "draft": 2013,
                    "displayNameEn": "Trey Burke",
                    "heightValue": 1.85,
                    "birthDayStr": "1992-11-12",
                    "position": "后卫",
                    "age": 27,
                    "playerId": "203504"
                }
            },
            {
                "_index": "nba",
                "_type": "_doc",
                "_id": "167",
                "_score": 3.6167762,
                "_source": {
                    "countryEn": "United States",
                    "teamName": "雷霆",
                    "birthDay": 895377600000,
                    "country": "美国",
                    "teamCityEn": "Oklahoma City",
                    "code": "terrance_ferguson",
                    "displayAffiliation": "United States",
                    "displayName": "特伦斯 弗格森",
                    "schoolType": "",
                    "teamConference": "西部",
                    "teamConferenceEn": "Western",
                    "weight": "86.2 公斤",
                    "teamCity": "俄克拉荷马城",
                    "playYear": 2,
                    "jerseyNo": "23",
                    "teamNameEn": "Thunder",
                    "draft": 2017,
                    "displayNameEn": "Terrance Ferguson",
                    "heightValue": 2.01,
                    "birthDayStr": "1998-05-17",
                    "position": "后卫-前锋",
                    "age": 21,
                    "playerId": "1628390"
                }
            }
        ]
    }
}

6.2.2 exsit query 在特定的字段中查找非空值的文档 GET/POST请求

{
    // 语义:查找teamNameEn 不为空的数据
  "query": {
    "exists": {
      "field": "teamNameEn" 
    }
  },
  "from": 0,
  "size": 3
}
{
    "took": 0,
    "timed_out": false,
    "_shards": {
        "total": 1,
        "successful": 1,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": {
            "value": 566,
            "relation": "eq"
        },
        "max_score": 1.0,
        "hits": [
            {
                "_index": "nba",
                "_type": "_doc",
                "_id": "1",
                "_score": 1.0,
                "_source": {
                    "countryEn": "United States",
                    "teamName": "老鹰",
                    "birthDay": 831182400000,
                    "country": "美国",
                    "teamCityEn": "Atlanta",
                    "code": "jaylen_adams",
                    "displayAffiliation": "United States",
                    "displayName": "杰伦 亚当斯",
                    "schoolType": "College",
                    "teamConference": "东部",
                    "teamConferenceEn": "Eastern",
                    "weight": "86.2 公斤",
                    "teamCity": "亚特兰大",
                    "playYear": 1,
                    "jerseyNo": "10",
                    "teamNameEn": "Hawks",
                    "draft": 2018,
                    "displayNameEn": "Jaylen Adams",
                    "heightValue": 1.88,
                    "birthDayStr": "1996-05-04",
                    "position": "后卫",
                    "age": 23,
                    "playerId": "1629121"
                }
            },
            {
                "_index": "nba",
                "_type": "_doc",
                "_id": "2",
                "_score": 1.0,
                "_source": {
                    "countryEn": "New Zealand",
                    "teamName": "雷霆",
                    "birthDay": 743140800000,
                    "country": "新西兰",
                    "teamCityEn": "Oklahoma City",
                    "code": "steven_adams",
                    "displayAffiliation": "Pittsburgh/New Zealand",
                    "displayName": "斯蒂文 亚当斯",
                    "schoolType": "College",
                    "teamConference": "西部",
                    "teamConferenceEn": "Western",
                    "weight": "120.2 公斤",
                    "teamCity": "俄克拉荷马城",
                    "playYear": 6,
                    "jerseyNo": "12",
                    "teamNameEn": "Thunder",
                    "draft": 2013,
                    "displayNameEn": "Steven Adams",
                    "heightValue": 2.13,
                    "birthDayStr": "1993-07-20",
                    "position": "中锋",
                    "age": 26,
                    "playerId": "203500"
                }
            },
            {
                "_index": "nba",
                "_type": "_doc",
                "_id": "3",
                "_score": 1.0,
                "_source": {
                    "countryEn": "United States",
                    "teamName": "热火",
                    "birthDay": 869198400000,
                    "country": "美国",
                    "teamCityEn": "Miami",
                    "code": "bam_adebayo",
                    "displayAffiliation": "Kentucky/United States",
                    "displayName": "巴姆 阿德巴约",
                    "schoolType": "College",
                    "teamConference": "东部",
                    "teamConferenceEn": "Eastern",
                    "weight": "115.7 公斤",
                    "teamCity": "迈阿密",
                    "playYear": 2,
                    "jerseyNo": "13",
                    "teamNameEn": "Heat",
                    "draft": 2017,
                    "displayNameEn": "Bam Adebayo",
                    "heightValue": 2.08,
                    "birthDayStr": "1997-07-18",
                    "position": "中锋-前锋",
                    "age": 22,
                    "playerId": "1628389"
                }
            }
        ]
    }
}

6.2.3 prefix query 查找包含带有指定前缀term的文档 GET/POST请求

localhost:9200/nba/_search
{
    // 语义:查找teamNameEn 不为空的数据 teamNameEn必须为text类型
    // 使用前缀类型必须为keyword,不能为text
  "query": {
    "prefix": {
      "teamNameEn": "Rock"
    }
  },
  "from": 0,
  "size": 3
}
{
    "took": 4,
    "timed_out": false,
    "_shards": {
        "total": 1,
        "successful": 1,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": {
            "value": 21,
            "relation": "eq"
        },
        "max_score": 1.0,
        "hits": [
            {
                "_index": "nba",
                "_type": "_doc",
                "_id": "86",
                "_score": 1.0,
                "_source": {
                    "countryEn": "Switzerland",
                    "teamName": "火箭",
                    "birthDay": 769233600000,
                    "country": "瑞士",
                    "teamCityEn": "Houston",
                    "code": "clint_capela",
                    "displayAffiliation": "Switzerland/Switzerland",
                    "displayName": "克林特 卡佩拉",
                    "schoolType": "",
                    "teamConference": "西部",
                    "teamConferenceEn": "Western",
                    "weight": "108.9 公斤",
                    "teamCity": "休斯顿",
                    "playYear": 5,
                    "jerseyNo": "15",
                    "teamNameEn": "Rockets",
                    "draft": 2014,
                    "displayNameEn": "Clint Capela",
                    "heightValue": 2.08,
                    "birthDayStr": "1994-05-18",
                    "position": "中锋",
                    "age": 25,
                    "playerId": "203991"
                }
            },
            {
                "_index": "nba",
                "_type": "_doc",
                "_id": "99",
                "_score": 1.0,
                "_source": {
                    "countryEn": "United States",
                    "teamName": "火箭",
                    "birthDay": 816930000000,
                    "country": "美国",
                    "teamCityEn": "Houston",
                    "code": "chris_chiozza",
                    "displayAffiliation": "University of Florida/United States",
                    "displayName": "克里斯 Chiozza",
                    "schoolType": "",
                    "teamConference": "西部",
                    "teamConferenceEn": "Western",
                    "weight": "79.4 公斤",
                    "teamCity": "休斯顿",
                    "playYear": 1,
                    "jerseyNo": "2",
                    "teamNameEn": "Rockets",
                    "draft": 2018,
                    "displayNameEn": "Chris Chiozza",
                    "heightValue": 1.83,
                    "birthDayStr": "1995-11-21",
                    "position": "后卫",
                    "age": 24,
                    "playerId": "1629185"
                }
            },
            {
                "_index": "nba",
                "_type": "_doc",
                "_id": "101",
                "_score": 1.0,
                "_source": {
                    "countryEn": "United States",
                    "teamName": "火箭",
                    "birthDay": 784962000000,
                    "country": "美国",
                    "teamCityEn": "Houston",
                    "code": "gary_clark",
                    "displayAffiliation": "University of Cincinnati/United States",
                    "displayName": "加里 克拉克",
                    "schoolType": "",
                    "teamConference": "西部",
                    "teamConferenceEn": "Western",
                    "weight": "102.1 公斤",
                    "teamCity": "休斯顿",
                    "playYear": 1,
                    "jerseyNo": "6",
                    "teamNameEn": "Rockets",
                    "draft": 2018,
                    "displayNameEn": "Gary Clark",
                    "heightValue": 2.03,
                    "birthDayStr": "1994-11-16",
                    "position": "前锋",
                    "age": 25,
                    "playerId": "1629109"
                }
            }
        ]
    }
}

6.2.4 wildcard query 支持通配符查询 GET/POST请求

  • *表示任意字符,?表示任意单个字符,类似SQL模糊查询

localhost:9200/nba/_search
{
    // 语义: 查询teamNameEn为Ro*s *为模糊搜索
  "query": {
    "wildcard": {
      "teamNameEn": "Ro*s"
    }
  },
  "from": 0,
  "size": 3
}
{
    "took": 1,
    "timed_out": false,
    "_shards": {
        "total": 1,
        "successful": 1,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": {
            "value": 21,
            "relation": "eq"
        },
        "max_score": 1.0,
        "hits": [
            {
                "_index": "nba",
                "_type": "_doc",
                "_id": "86",
                "_score": 1.0,
                "_source": {
                    "countryEn": "Switzerland",
                    "teamName": "火箭",
                    "birthDay": 769233600000,
                    "country": "瑞士",
                    "teamCityEn": "Houston",
                    "code": "clint_capela",
                    "displayAffiliation": "Switzerland/Switzerland",
                    "displayName": "克林特 卡佩拉",
                    "schoolType": "",
                    "teamConference": "西部",
                    "teamConferenceEn": "Western",
                    "weight": "108.9 公斤",
                    "teamCity": "休斯顿",
                    "playYear": 5,
                    "jerseyNo": "15",
                    "teamNameEn": "Rockets",
                    "draft": 2014,
                    "displayNameEn": "Clint Capela",
                    "heightValue": 2.08,
                    "birthDayStr": "1994-05-18",
                    "position": "中锋",
                    "age": 25,
                    "playerId": "203991"
                }
            },
            {
                "_index": "nba",
                "_type": "_doc",
                "_id": "99",
                "_score": 1.0,
                "_source": {
                    "countryEn": "United States",
                    "teamName": "火箭",
                    "birthDay": 816930000000,
                    "country": "美国",
                    "teamCityEn": "Houston",
                    "code": "chris_chiozza",
                    "displayAffiliation": "University of Florida/United States",
                    "displayName": "克里斯 Chiozza",
                    "schoolType": "",
                    "teamConference": "西部",
                    "teamConferenceEn": "Western",
                    "weight": "79.4 公斤",
                    "teamCity": "休斯顿",
                    "playYear": 1,
                    "jerseyNo": "2",
                    "teamNameEn": "Rockets",
                    "draft": 2018,
                    "displayNameEn": "Chris Chiozza",
                    "heightValue": 1.83,
                    "birthDayStr": "1995-11-21",
                    "position": "后卫",
                    "age": 24,
                    "playerId": "1629185"
                }
            },
            {
                "_index": "nba",
                "_type": "_doc",
                "_id": "101",
                "_score": 1.0,
                "_source": {
                    "countryEn": "United States",
                    "teamName": "火箭",
                    "birthDay": 784962000000,
                    "country": "美国",
                    "teamCityEn": "Houston",
                    "code": "gary_clark",
                    "displayAffiliation": "University of Cincinnati/United States",
                    "displayName": "加里 克拉克",
                    "schoolType": "",
                    "teamConference": "西部",
                    "teamConferenceEn": "Western",
                    "weight": "102.1 公斤",
                    "teamCity": "休斯顿",
                    "playYear": 1,
                    "jerseyNo": "6",
                    "teamNameEn": "Rockets",
                    "draft": 2018,
                    "displayNameEn": "Gary Clark",
                    "heightValue": 2.03,
                    "birthDayStr": "1994-11-16",
                    "position": "前锋",
                    "age": 25,
                    "playerId": "1629109"
                }
            }
        ]
    }
}

6.2.5 regexp query 正则表达式查询 GET/POST请求

{
    // 语义: 查询teamNameEn 为Ro.*s  .表示任意 *为多个
  "query": {
    "regexp": {
      "teamNameEn": "Ro.*s"
    }
  },
  "from": 0,
  "size": 3
}
{
    "took": 0,
    "timed_out": false,
    "_shards": {
        "total": 1,
        "successful": 1,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": {
            "value": 21,
            "relation": "eq"
        },
        "max_score": 1.0,
        "hits": [
            {
                "_index": "nba",
                "_type": "_doc",
                "_id": "86",
                "_score": 1.0,
                "_source": {
                    "countryEn": "Switzerland",
                    "teamName": "火箭",
                    "birthDay": 769233600000,
                    "country": "瑞士",
                    "teamCityEn": "Houston",
                    "code": "clint_capela",
                    "displayAffiliation": "Switzerland/Switzerland",
                    "displayName": "克林特 卡佩拉",
                    "schoolType": "",
                    "teamConference": "西部",
                    "teamConferenceEn": "Western",
                    "weight": "108.9 公斤",
                    "teamCity": "休斯顿",
                    "playYear": 5,
                    "jerseyNo": "15",
                    "teamNameEn": "Rockets",
                    "draft": 2014,
                    "displayNameEn": "Clint Capela",
                    "heightValue": 2.08,
                    "birthDayStr": "1994-05-18",
                    "position": "中锋",
                    "age": 25,
                    "playerId": "203991"
                }
            },
            {
                "_index": "nba",
                "_type": "_doc",
                "_id": "99",
                "_score": 1.0,
                "_source": {
                    "countryEn": "United States",
                    "teamName": "火箭",
                    "birthDay": 816930000000,
                    "country": "美国",
                    "teamCityEn": "Houston",
                    "code": "chris_chiozza",
                    "displayAffiliation": "University of Florida/United States",
                    "displayName": "克里斯 Chiozza",
                    "schoolType": "",
                    "teamConference": "西部",
                    "teamConferenceEn": "Western",
                    "weight": "79.4 公斤",
                    "teamCity": "休斯顿",
                    "playYear": 1,
                    "jerseyNo": "2",
                    "teamNameEn": "Rockets",
                    "draft": 2018,
                    "displayNameEn": "Chris Chiozza",
                    "heightValue": 1.83,
                    "birthDayStr": "1995-11-21",
                    "position": "后卫",
                    "age": 24,
                    "playerId": "1629185"
                }
            },
            {
                "_index": "nba",
                "_type": "_doc",
                "_id": "101",
                "_score": 1.0,
                "_source": {
                    "countryEn": "United States",
                    "teamName": "火箭",
                    "birthDay": 784962000000,
                    "country": "美国",
                    "teamCityEn": "Houston",
                    "code": "gary_clark",
                    "displayAffiliation": "University of Cincinnati/United States",
                    "displayName": "加里 克拉克",
                    "schoolType": "",
                    "teamConference": "西部",
                    "teamConferenceEn": "Western",
                    "weight": "102.1 公斤",
                    "teamCity": "休斯顿",
                    "playYear": 1,
                    "jerseyNo": "6",
                    "teamNameEn": "Rockets",
                    "draft": 2018,
                    "displayNameEn": "Gary Clark",
                    "heightValue": 2.03,
                    "birthDayStr": "1994-11-16",
                    "position": "前锋",
                    "age": 25,
                    "playerId": "1629109"
                }
            }
        ]
    }
}

6.2.6 ids query 通过id批量查询 GET/POST请求

localhost:9200/nba/_search
{
  "query": {
    "ids": {
      "values": [1,2,3]
    }
  },
  "from": 0,
  "size": 3
}
{
    "took": 2,
    "timed_out": false,
    "_shards": {
        "total": 1,
        "successful": 1,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": {
            "value": 3,
            "relation": "eq"
        },
        "max_score": 1.0,
        "hits": [
            {
                "_index": "nba",
                "_type": "_doc",
                "_id": "1",
                "_score": 1.0,
                "_source": {
                    "countryEn": "United States",
                    "teamName": "老鹰",
                    "birthDay": 831182400000,
                    "country": "美国",
                    "teamCityEn": "Atlanta",
                    "code": "jaylen_adams",
                    "displayAffiliation": "United States",
                    "displayName": "杰伦 亚当斯",
                    "schoolType": "College",
                    "teamConference": "东部",
                    "teamConferenceEn": "Eastern",
                    "weight": "86.2 公斤",
                    "teamCity": "亚特兰大",
                    "playYear": 1,
                    "jerseyNo": "10",
                    "teamNameEn": "Hawks",
                    "draft": 2018,
                    "displayNameEn": "Jaylen Adams",
                    "heightValue": 1.88,
                    "birthDayStr": "1996-05-04",
                    "position": "后卫",
                    "age": 23,
                    "playerId": "1629121"
                }
            },
            {
                "_index": "nba",
                "_type": "_doc",
                "_id": "2",
                "_score": 1.0,
                "_source": {
                    "countryEn": "New Zealand",
                    "teamName": "雷霆",
                    "birthDay": 743140800000,
                    "country": "新西兰",
                    "teamCityEn": "Oklahoma City",
                    "code": "steven_adams",
                    "displayAffiliation": "Pittsburgh/New Zealand",
                    "displayName": "斯蒂文 亚当斯",
                    "schoolType": "College",
                    "teamConference": "西部",
                    "teamConferenceEn": "Western",
                    "weight": "120.2 公斤",
                    "teamCity": "俄克拉荷马城",
                    "playYear": 6,
                    "jerseyNo": "12",
                    "teamNameEn": "Thunder",
                    "draft": 2013,
                    "displayNameEn": "Steven Adams",
                    "heightValue": 2.13,
                    "birthDayStr": "1993-07-20",
                    "position": "中锋",
                    "age": 26,
                    "playerId": "203500"
                }
            },
            {
                "_index": "nba",
                "_type": "_doc",
                "_id": "3",
                "_score": 1.0,
                "_source": {
                    "countryEn": "United States",
                    "teamName": "热火",
                    "birthDay": 869198400000,
                    "country": "美国",
                    "teamCityEn": "Miami",
                    "code": "bam_adebayo",
                    "displayAffiliation": "Kentucky/United States",
                    "displayName": "巴姆 阿德巴约",
                    "schoolType": "College",
                    "teamConference": "东部",
                    "teamConferenceEn": "Eastern",
                    "weight": "115.7 公斤",
                    "teamCity": "迈阿密",
                    "playYear": 2,
                    "jerseyNo": "13",
                    "teamNameEn": "Heat",
                    "draft": 2017,
                    "displayNameEn": "Bam Adebayo",
                    "heightValue": 2.08,
                    "birthDayStr": "1997-07-18",
                    "position": "中锋-前锋",
                    "age": 22,
                    "playerId": "1628389"
                }
            }
        ]
    }
}

6.3 范围查询

6.3.1 第一种范围查询 GET/POST请求

localhost:9200/nba/_search
{
    // 语义: 查找在nba打了2年年到10年以内的球员 
  "query": {
    "range": {
      "playYear":{ //playYear 是Long类型 不要写成字符串
         "gte": 2,
         "lte" : 10
      }
    }
  },
  "from": 0,
  "size": 3
}
{
  "took" : 0,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 77,
      "relation" : "eq"
    },
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "nba",
        "_type" : "_doc",
        "_id" : "3",
        "_score" : 1.0,
        "_source" : {
          "countryEn" : "United States",
          "teamName" : "热火",
          "birthDay" : 869198400000,
          "country" : "美国",
          "teamCityEn" : "Miami",
          "code" : "bam_adebayo",
          "displayAffiliation" : "Kentucky/United States",
          "displayName" : "巴姆 阿德巴约",
          "schoolType" : "College",
          "teamConference" : "东部",
          "teamConferenceEn" : "Eastern",
          "weight" : "115.7 公斤",
          "teamCity" : "迈阿密",
          "playYear" : 2,
          "jerseyNo" : "13",
          "teamNameEn" : "Heat",
          "draft" : 2017,
          "displayNameEn" : "Bam Adebayo",
          "heightValue" : 2.08,
          "birthDayStr" : "1997-07-18",
          "position" : "中锋-前锋",
          "age" : 22,
          "playerId" : "1628389"
        }
      },
      {
        "_index" : "nba",
        "_type" : "_doc",
        "_id" : "9",
        "_score" : 1.0,
        "_source" : {
          "countryEn" : "United States",
          "teamName" : "篮网",
          "birthDay" : 893131200000,
          "country" : "美国",
          "teamCityEn" : "Brooklyn",
          "code" : "jarrett_allen",
          "displayAffiliation" : "Texas/United States",
          "displayName" : "贾瑞特 艾伦",
          "schoolType" : "College",
          "teamConference" : "东部",
          "teamConferenceEn" : "Eastern",
          "weight" : "107.5 公斤",
          "teamCity" : "布鲁克林",
          "playYear" : 2,
          "jerseyNo" : "31",
          "teamNameEn" : "Nets",
          "draft" : 2017,
          "displayNameEn" : "Jarrett Allen",
          "heightValue" : 2.11,
          "birthDayStr" : "1998-04-21",
          "position" : "中锋",
          "age" : 21,
          "playerId" : "1628386"
        }
      },
      {
        "_index" : "nba",
        "_type" : "_doc",
        "_id" : "10",
        "_score" : 1.0,
        "_source" : {
          "countryEn" : "United States",
          "teamName" : "尼克斯",
          "birthDay" : 727074000000,
          "country" : "美国",
          "teamCityEn" : "New York",
          "code" : "kadeem_allen",
          "displayAffiliation" : "Arizona/United States",
          "displayName" : "卡迪姆 艾伦",
          "schoolType" : "College",
          "teamConference" : "东部",
          "teamConferenceEn" : "Eastern",
          "weight" : "90.7 公斤",
          "teamCity" : "纽约",
          "playYear" : 2,
          "jerseyNo" : "0",
          "teamNameEn" : "Knicks",
          "draft" : 2017,
          "displayNameEn" : "Kadeem Allen",
          "heightValue" : 1.9,
          "birthDayStr" : "1993-01-15",
          "position" : "后卫",
          "age" : 26,
          "playerId" : "1628443"
        }
      }
    ]
  }
}

6.3.2 第二种范围查询 GET/POST请求

{
    // 语义: 查找1980年年到1999年年出⽣生的球员
  "query": {
    "range": {
      "birthDay":{
         "gte": "01/01/1999",
         "lte" : "1999",,
         "format": "dd/MM/yyyy||yyyy" // 日期格式要对应get lte
      }
    }
  },
  "from": 0,
  "size": 3
}
{
  "took" : 1,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 521,
      "relation" : "eq"
    },
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "nba",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 1.0,
        "_source" : {
          "countryEn" : "United States",
          "teamName" : "老鹰",
          "birthDay" : 831182400000,
          "country" : "美国",
          "teamCityEn" : "Atlanta",
          "code" : "jaylen_adams",
          "displayAffiliation" : "United States",
          "displayName" : "杰伦 亚当斯",
          "schoolType" : "College",
          "teamConference" : "东部",
          "teamConferenceEn" : "Eastern",
          "weight" : "86.2 公斤",
          "teamCity" : "亚特兰大",
          "playYear" : 1,
          "jerseyNo" : "10",
          "teamNameEn" : "Hawks",
          "draft" : 2018,
          "displayNameEn" : "Jaylen Adams",
          "heightValue" : 1.88,
          "birthDayStr" : "1996-05-04",
          "position" : "后卫",
          "age" : 23,
          "playerId" : "1629121"
        }
      },
      {
        "_index" : "nba",
        "_type" : "_doc",
        "_id" : "2",
        "_score" : 1.0,
        "_source" : {
          "countryEn" : "New Zealand",
          "teamName" : "雷霆",
          "birthDay" : 743140800000,
          "country" : "新西兰",
          "teamCityEn" : "Oklahoma City",
          "code" : "steven_adams",
          "displayAffiliation" : "Pittsburgh/New Zealand",
          "displayName" : "斯蒂文 亚当斯",
          "schoolType" : "College",
          "teamConference" : "西部",
          "teamConferenceEn" : "Western",
          "weight" : "120.2 公斤",
          "teamCity" : "俄克拉荷马城",
          "playYear" : 6,
          "jerseyNo" : "12",
          "teamNameEn" : "Thunder",
          "draft" : 2013,
          "displayNameEn" : "Steven Adams",
          "heightValue" : 2.13,
          "birthDayStr" : "1993-07-20",
          "position" : "中锋",
          "age" : 26,
          "playerId" : "203500"
        }
      },
      {
        "_index" : "nba",
        "_type" : "_doc",
        "_id" : "3",
        "_score" : 1.0,
        "_source" : {
          "countryEn" : "United States",
          "teamName" : "热火",
          "birthDay" : 869198400000,
          "country" : "美国",
          "teamCityEn" : "Miami",
          "code" : "bam_adebayo",
          "displayAffiliation" : "Kentucky/United States",
          "displayName" : "巴姆 阿德巴约",
          "schoolType" : "College",
          "teamConference" : "东部",
          "teamConferenceEn" : "Eastern",
          "weight" : "115.7 公斤",
          "teamCity" : "迈阿密",
          "playYear" : 2,
          "jerseyNo" : "13",
          "teamNameEn" : "Heat",
          "draft" : 2017,
          "displayNameEn" : "Bam Adebayo",
          "heightValue" : 2.08,
          "birthDayStr" : "1997-07-18",
          "position" : "中锋-前锋",
          "age" : 22,
          "playerId" : "1628389"
        }
      }
    ]
  }
}

6.4 布尔查询

typedescription
must必须出现在匹配文档中
filter必须出现在文档中,但是不打分
must_not不能出现在文档中
should应该出现在文档中

6.4.1 must查询 GET/POST请求

localhost:9200/nba/_search
{
    // 语义: 查询名字叫做james的球员
  "query": {
    "bool": { // 布尔查询
      "must":[ //匹配查询方式
        {
          "match": { // 全文搜索
            "displayNameEn": "james"
          }
        }
      ]
    }
  },
  "from": 0,
  "size": 3
}
{
  "took" : 0,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 5,
      "relation" : "eq"
    },
    "max_score" : 4.699642,
    "hits" : [
      {
        "_index" : "nba",
        "_type" : "_doc",
        "_id" : "214",
        "_score" : 4.699642,
        "_source" : {
          "countryEn" : "United States",
          "teamName" : "火箭",
          "birthDay" : 620107200000,
          "country" : "美国",
          "teamCityEn" : "Houston",
          "code" : "james_harden",
          "displayAffiliation" : "Arizona State/United States",
          "displayName" : "詹姆斯 哈登",
          "schoolType" : "College",
          "teamConference" : "西部",
          "teamConferenceEn" : "Western",
          "weight" : "99.8 公斤",
          "teamCity" : "休斯顿",
          "playYear" : 10,
          "jerseyNo" : "13",
          "teamNameEn" : "Rockets",
          "draft" : 2009,
          "displayNameEn" : "James Harden",
          "heightValue" : 1.96,
          "birthDayStr" : "1989-08-26",
          "position" : "后卫",
          "age" : 30,
          "playerId" : "201935"
        }
      },
      {
        "_index" : "nba",
        "_type" : "_doc",
        "_id" : "266",
        "_score" : 4.699642,
        "_source" : {
          "countryEn" : "United States",
          "teamName" : "国王",
          "birthDay" : 854082000000,
          "country" : "美国",
          "teamCityEn" : "Sacramento",
          "code" : "justin_james",
          "displayAffiliation" : "United States",
          "displayName" : "贾斯汀 詹姆斯",
          "schoolType" : "College",
          "teamConference" : "西部",
          "teamConferenceEn" : "Western",
          "weight" : "86.2 公斤",
          "teamCity" : "萨克拉门托",
          "playYear" : 0,
          "jerseyNo" : "",
          "teamNameEn" : "Kings",
          "draft" : 2019,
          "displayNameEn" : "Justin James",
          "heightValue" : 2.01,
          "birthDayStr" : "1997-01-24",
          "position" : "后卫-前锋",
          "age" : 22,
          "playerId" : "1629713"
        }
      },
      {
        "_index" : "nba",
        "_type" : "_doc",
        "_id" : "267",
        "_score" : 4.699642,
        "_source" : {
          "countryEn" : "United States",
          "teamName" : "湖人",
          "birthDay" : 473230800000,
          "country" : "美国",
          "teamCityEn" : "Los Angeles",
          "code" : "lebron_james",
          "displayAffiliation" : "No College/United States",
          "displayName" : "勒布朗 詹姆斯",
          "schoolType" : "High School",
          "teamConference" : "西部",
          "teamConferenceEn" : "Western",
          "weight" : "113.4 公斤",
          "teamCity" : "洛杉矶",
          "playYear" : 16,
          "jerseyNo" : "23",
          "teamNameEn" : "Lakers",
          "draft" : 2003,
          "displayNameEn" : "LeBron James",
          "heightValue" : 2.03,
          "birthDayStr" : "1984-12-30",
          "position" : "前锋",
          "age" : 35,
          "playerId" : "2544"
        }
      }
    ]
  }
}

6.4.2 filter查询 GET/POST请求

localhost:9200/nba/_search
{
    // 语义: 查询名字叫做james的球员 不包含打分
  "query": {
    "bool": {
      "filter":[
        {
          "match": {
            "displayNameEn": "james"
          }
        }
      ]
    }
  },
  "from": 0,
  "size": 3
}
{
  "took" : 0,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 5,
      "relation" : "eq"
    },
    "max_score" : 0.0,
    "hits" : [
      {
        "_index" : "nba",
        "_type" : "_doc",
        "_id" : "158",
        "_score" : 0.0, // 不包含打分
        "_source" : {
          "countryEn" : "United States",
          "teamName" : "76人",
          "birthDay" : 646804800000,
          "country" : "美国",
          "teamCityEn" : "Philadelphia",
          "code" : "james_ennis iii",
          "displayAffiliation" : "Cal State-Long Beach/United States",
          "displayName" : "詹姆斯 恩尼斯三世",
          "schoolType" : "College",
          "teamConference" : "东部",
          "teamConferenceEn" : "Eastern",
          "weight" : "95.3 公斤",
          "teamCity" : "费城",
          "playYear" : 5,
          "jerseyNo" : "11",
          "teamNameEn" : "76ers",
          "draft" : 2013,
          "displayNameEn" : "James Ennis III",
          "heightValue" : 2.01,
          "birthDayStr" : "1990-07-01",
          "position" : "前锋",
          "age" : 29,
          "playerId" : "203516"
        }
      },
      {
        "_index" : "nba",
        "_type" : "_doc",
        "_id" : "214",
        "_score" : 0.0,
        "_source" : {
          "countryEn" : "United States",
          "teamName" : "火箭",
          "birthDay" : 620107200000,
          "country" : "美国",
          "teamCityEn" : "Houston",
          "code" : "james_harden",
          "displayAffiliation" : "Arizona State/United States",
          "displayName" : "詹姆斯 哈登",
          "schoolType" : "College",
          "teamConference" : "西部",
          "teamConferenceEn" : "Western",
          "weight" : "99.8 公斤",
          "teamCity" : "休斯顿",
          "playYear" : 10,
          "jerseyNo" : "13",
          "teamNameEn" : "Rockets",
          "draft" : 2009,
          "displayNameEn" : "James Harden",
          "heightValue" : 1.96,
          "birthDayStr" : "1989-08-26",
          "position" : "后卫",
          "age" : 30,
          "playerId" : "201935"
        }
      },
      {
        "_index" : "nba",
        "_type" : "_doc",
        "_id" : "266",
        "_score" : 0.0,
        "_source" : {
          "countryEn" : "United States",
          "teamName" : "国王",
          "birthDay" : 854082000000,
          "country" : "美国",
          "teamCityEn" : "Sacramento",
          "code" : "justin_james",
          "displayAffiliation" : "United States",
          "displayName" : "贾斯汀 詹姆斯",
          "schoolType" : "College",
          "teamConference" : "西部",
          "teamConferenceEn" : "Western",
          "weight" : "86.2 公斤",
          "teamCity" : "萨克拉门托",
          "playYear" : 0,
          "jerseyNo" : "",
          "teamNameEn" : "Kings",
          "draft" : 2019,
          "displayNameEn" : "Justin James",
          "heightValue" : 2.01,
          "birthDayStr" : "1997-01-24",
          "position" : "后卫-前锋",
          "age" : 22,
          "playerId" : "1629713"
        }
      }
    ]
  }
}

6.4.3 must_not查询 GET/POST请求

localhost:9200/nba/_search
{
    // 语义: 查询名字叫做james的球员,一定不在东部的
  "query": {
    "bool": {
      "filter":[
        {
          "match": {
            "displayNameEn": "james"
          }
        }
      ],
      "must_not": [
        {
          "term": {
            "teamConferenceEn": {
              "value": "eastern"
            }
          }
        }
      ]
    }
  },
  "from": 0,
  "size": 3
}
{
  "took" : 0,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 5,
      "relation" : "eq"
    },
    "max_score" : 0.0,
    "hits" : [
      {
        "_index" : "nba",
        "_type" : "_doc",
        "_id" : "158",
        "_score" : 0.0,
        "_source" : {
          "countryEn" : "United States",
          "teamName" : "76人",
          "birthDay" : 646804800000,
          "country" : "美国",
          "teamCityEn" : "Philadelphia",
          "code" : "james_ennis iii",
          "displayAffiliation" : "Cal State-Long Beach/United States",
          "displayName" : "詹姆斯 恩尼斯三世",
          "schoolType" : "College",
          "teamConference" : "东部",
          "teamConferenceEn" : "Eastern",
          "weight" : "95.3 公斤",
          "teamCity" : "费城",
          "playYear" : 5,
          "jerseyNo" : "11",
          "teamNameEn" : "76ers",
          "draft" : 2013,
          "displayNameEn" : "James Ennis III",
          "heightValue" : 2.01,
          "birthDayStr" : "1990-07-01",
          "position" : "前锋",
          "age" : 29,
          "playerId" : "203516"
        }
      },
      {
        "_index" : "nba",
        "_type" : "_doc",
        "_id" : "214",
        "_score" : 0.0,
        "_source" : {
          "countryEn" : "United States",
          "teamName" : "火箭",
          "birthDay" : 620107200000,
          "country" : "美国",
          "teamCityEn" : "Houston",
          "code" : "james_harden",
          "displayAffiliation" : "Arizona State/United States",
          "displayName" : "詹姆斯 哈登",
          "schoolType" : "College",
          "teamConference" : "西部",
          "teamConferenceEn" : "Western",
          "weight" : "99.8 公斤",
          "teamCity" : "休斯顿",
          "playYear" : 10,
          "jerseyNo" : "13",
          "teamNameEn" : "Rockets",
          "draft" : 2009,
          "displayNameEn" : "James Harden",
          "heightValue" : 1.96,
          "birthDayStr" : "1989-08-26",
          "position" : "后卫",
          "age" : 30,
          "playerId" : "201935"
        }
      },
      {
        "_index" : "nba",
        "_type" : "_doc",
        "_id" : "266",
        "_score" : 0.0,
        "_source" : {
          "countryEn" : "United States",
          "teamName" : "国王",
          "birthDay" : 854082000000,
          "country" : "美国",
          "teamCityEn" : "Sacramento",
          "code" : "justin_james",
          "displayAffiliation" : "United States",
          "displayName" : "贾斯汀 詹姆斯",
          "schoolType" : "College",
          "teamConference" : "西部",
          "teamConferenceEn" : "Western",
          "weight" : "86.2 公斤",
          "teamCity" : "萨克拉门托",
          "playYear" : 0,
          "jerseyNo" : "",
          "teamNameEn" : "Kings",
          "draft" : 2019,
          "displayNameEn" : "Justin James",
          "heightValue" : 2.01,
          "birthDayStr" : "1997-01-24",
          "position" : "后卫-前锋",
          "age" : 22,
          "playerId" : "1629713"
        }
      }
    ]
  }
}

6.4.4 should 第一种 查询 GET/POST请求

localhost:9200/nba/_search
{
    // 语义: 查找名字叫做james的打球时间应该在11到20年的西部球员
    // should应该 但是不是必须
  "query": {
    "bool": {
      "filter":[
        {
          "match": {
            "displayNameEn": "james"
          }
        }
      ],
      "must_not": [
        {
          "term": {
            "teamConferenceEn": {
              "value": "eastern"
            }
          }
        }
      ],
      "should": [
        {
          "range": {
            "playYear": {
              "gte": 11,
              "lte": 20
            }
          }
        }
      ]
    }
  },
  "from": 0,
  "size": 3
}
{
  "took" : 0,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 5,
      "relation" : "eq"
    },
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "nba",
        "_type" : "_doc",
        "_id" : "267",
        "_score" : 1.0,
        "_source" : {
          "countryEn" : "United States",
          "teamName" : "湖人",
          "birthDay" : 473230800000,
          "country" : "美国",
          "teamCityEn" : "Los Angeles",
          "code" : "lebron_james",
          "displayAffiliation" : "No College/United States",
          "displayName" : "勒布朗 詹姆斯",
          "schoolType" : "High School",
          "teamConference" : "西部",
          "teamConferenceEn" : "Western",
          "weight" : "113.4 公斤",
          "teamCity" : "洛杉矶",
          "playYear" : 16,
          "jerseyNo" : "23",
          "teamNameEn" : "Lakers",
          "draft" : 2003,
          "displayNameEn" : "LeBron James",
          "heightValue" : 2.03,
          "birthDayStr" : "1984-12-30",
          "position" : "前锋",
          "age" : 35,
          "playerId" : "2544"
        }
      },
      {
        "_index" : "nba",
        "_type" : "_doc",
        "_id" : "158",
        "_score" : 0.0,
        "_source" : {
          "countryEn" : "United States",
          "teamName" : "76人",
          "birthDay" : 646804800000,
          "country" : "美国",
          "teamCityEn" : "Philadelphia",
          "code" : "james_ennis iii",
          "displayAffiliation" : "Cal State-Long Beach/United States",
          "displayName" : "詹姆斯 恩尼斯三世",
          "schoolType" : "College",
          "teamConference" : "东部",
          "teamConferenceEn" : "Eastern",
          "weight" : "95.3 公斤",
          "teamCity" : "费城",
          "playYear" : 5,
          "jerseyNo" : "11",
          "teamNameEn" : "76ers",
          "draft" : 2013,
          "displayNameEn" : "James Ennis III",
          "heightValue" : 2.01,
          "birthDayStr" : "1990-07-01",
          "position" : "前锋",
          "age" : 29,
          "playerId" : "203516"
        }
      },
      {
        "_index" : "nba",
        "_type" : "_doc",
        "_id" : "214",
        "_score" : 0.0,
        "_source" : {
          "countryEn" : "United States",
          "teamName" : "火箭",
          "birthDay" : 620107200000,
          "country" : "美国",
          "teamCityEn" : "Houston",
          "code" : "james_harden",
          "displayAffiliation" : "Arizona State/United States",
          "displayName" : "詹姆斯 哈登",
          "schoolType" : "College",
          "teamConference" : "西部",
          "teamConferenceEn" : "Western",
          "weight" : "99.8 公斤",
          "teamCity" : "休斯顿",
          "playYear" : 10,
          "jerseyNo" : "13",
          "teamNameEn" : "Rockets",
          "draft" : 2009,
          "displayNameEn" : "James Harden",
          "heightValue" : 1.96,
          "birthDayStr" : "1989-08-26",
          "position" : "后卫",
          "age" : 30,
          "playerId" : "201935"
        }
      }
    ]
  }
}

6.4.5 should 第二种 查询 GET/POST请求

{
    // 语义: 查找名字叫做james的打球时间应该在11到20年的西部球员
    // minimum_should_match = 1 最小匹配精度,至少有一个条件满足
  "query": {
    "bool": {
      "filter":[
        {
          "match": {
            "displayNameEn": "james"
          }
        }
      ],
      "must_not": [
        {
          "term": {
            "teamConferenceEn": {
              "value": "eastern"
            }
          }
        }
      ],
      "should": [
        {
          "range": {
            "playYear": {
              "gte": 11,
              "lte": 20
            }
          }
        }
      ]
      , "minimum_should_match": 1
    }
  },
  "from": 0,
  "size": 3
}
{
  "took" : 0,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 1,
      "relation" : "eq"
    },
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "nba",
        "_type" : "_doc",
        "_id" : "267",
        "_score" : 1.0,
        "_source" : {
          "countryEn" : "United States",
          "teamName" : "湖人",
          "birthDay" : 473230800000,
          "country" : "美国",
          "teamCityEn" : "Los Angeles",
          "code" : "lebron_james",
          "displayAffiliation" : "No College/United States",
          "displayName" : "勒布朗 詹姆斯",
          "schoolType" : "High School",
          "teamConference" : "西部",
          "teamConferenceEn" : "Western",
          "weight" : "113.4 公斤",
          "teamCity" : "洛杉矶",
          "playYear" : 16,
          "jerseyNo" : "23",
          "teamNameEn" : "Lakers",
          "draft" : 2003,
          "displayNameEn" : "LeBron James",
          "heightValue" : 2.03,
          "birthDayStr" : "1984-12-30",
          "position" : "前锋",
          "age" : 35,
          "playerId" : "2544"
        }
      }
    ]
  }
}

6.5 排序查询

6.5.1 第一种排序查询 GET/POST请求

localhost:9200/nba/_search
{
    // 语义: ⽕箭队中按打球时间从⼤到⼩排序的球员
  "query": {
    "match": {
      "teamName": "Rockets"
    }
  },
  "sort": [
    {
      "playYear": {
        "order": "desc"
      }
    }
  ], 
  "from": 0,
  "size": 3
}
{
  "took" : 0,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 21,
      "relation" : "eq"
    },
    "max_score" : null,
    "hits" : [
      {
        "_index" : "nba",
        "_type" : "_doc",
        "_id" : "395",
        "_score" : null,
        "_source" : {
          "countryEn" : "Brazil",
          "teamName" : "火箭",
          "birthDay" : 400737600000,
          "country" : "巴西",
          "teamCityEn" : "Houston",
          "code" : "nene_hilario",
          "displayAffiliation" : "Brazil",
          "displayName" : "内内",
          "schoolType" : "",
          "teamConference" : "西部",
          "teamConferenceEn" : "Western",
          "weight" : "113.4 公斤",
          "teamCity" : "休斯顿",
          "playYear" : 17,
          "jerseyNo" : "42",
          "teamNameEn" : "Rockets",
          "draft" : 2002,
          "displayNameEn" : "Nene",
          "heightValue" : 2.11,
          "birthDayStr" : "1982-09-13",
          "position" : "中锋-前锋",
          "age" : 37,
          "playerId" : "2403"
        },
        "sort" : [
          17
        ]
      },
      {
        "_index" : "nba",
        "_type" : "_doc",
        "_id" : "425",
        "_score" : null,
        "_source" : {
          "countryEn" : "United States",
          "teamName" : "火箭",
          "birthDay" : 484200000000,
          "country" : "美国",
          "teamCityEn" : "Houston",
          "code" : "chris_paul",
          "displayAffiliation" : "Wake Forest/United States",
          "displayName" : "克里斯 保罗",
          "schoolType" : "College",
          "teamConference" : "西部",
          "teamConferenceEn" : "Western",
          "weight" : "79.4 公斤",
          "teamCity" : "休斯顿",
          "playYear" : 14,
          "jerseyNo" : "3",
          "teamNameEn" : "Rockets",
          "draft" : 2005,
          "displayNameEn" : "Chris Paul",
          "heightValue" : 1.83,
          "birthDayStr" : "1985-05-06",
          "position" : "后卫",
          "age" : 34,
          "playerId" : "101108"
        },
        "sort" : [
          14
        ]
      },
      {
        "_index" : "nba",
        "_type" : "_doc",
        "_id" : "206",
        "_score" : null,
        "_source" : {
          "countryEn" : "United States",
          "teamName" : "火箭",
          "birthDay" : 507099600000,
          "country" : "美国",
          "teamCityEn" : "Houston",
          "code" : "gerald_green",
          "displayAffiliation" : "No College/United States",
          "displayName" : "杰拉德 格林",
          "schoolType" : "High School",
          "teamConference" : "西部",
          "teamConferenceEn" : "Western",
          "weight" : "93.0 公斤",
          "teamCity" : "休斯顿",
          "playYear" : 12,
          "jerseyNo" : "14",
          "teamNameEn" : "Rockets",
          "draft" : 2005,
          "displayNameEn" : "Gerald Green",
          "heightValue" : 2.01,
          "birthDayStr" : "1986-01-26",
          "position" : "后卫-前锋",
          "age" : 33,
          "playerId" : "101123"
        },
        "sort" : [
          12
        ]
      }
    ]
  }
}

6.5.2 第一种排序查询 GET/POST请求

localhost:9200/nba/_search
{
    // 语义: ⽕箭队中按打球时间从⼤到⼩,如果年龄相同则按照身⾼从⾼到低排序的球员
  "query": {
    "match": {
      "teamNameEn": "Rockets"
    }
  },
  "sort": [
    {
      "playYear": {
        "order": "desc"
      }
    },
    {
      "heightValue": {
        "order": "asc"
      }
    }
  ], 
  "from": 0,
  "size": 3
}
{
  "took" : 0,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 21,
      "relation" : "eq"
    },
    "max_score" : null,
    "hits" : [
      {
        "_index" : "nba",
        "_type" : "_doc",
        "_id" : "395",
        "_score" : null,
        "_source" : {
          "countryEn" : "Brazil",
          "teamName" : "火箭",
          "birthDay" : 400737600000,
          "country" : "巴西",
          "teamCityEn" : "Houston",
          "code" : "nene_hilario",
          "displayAffiliation" : "Brazil",
          "displayName" : "内内",
          "schoolType" : "",
          "teamConference" : "西部",
          "teamConferenceEn" : "Western",
          "weight" : "113.4 公斤",
          "teamCity" : "休斯顿",
          "playYear" : 17,
          "jerseyNo" : "42",
          "teamNameEn" : "Rockets",
          "draft" : 2002,
          "displayNameEn" : "Nene",
          "heightValue" : 2.11,
          "birthDayStr" : "1982-09-13",
          "position" : "中锋-前锋",
          "age" : 37,
          "playerId" : "2403"
        },
        "sort" : [
          17,
          2.11
        ]
      },
      {
        "_index" : "nba",
        "_type" : "_doc",
        "_id" : "425",
        "_score" : null,
        "_source" : {
          "countryEn" : "United States",
          "teamName" : "火箭",
          "birthDay" : 484200000000,
          "country" : "美国",
          "teamCityEn" : "Houston",
          "code" : "chris_paul",
          "displayAffiliation" : "Wake Forest/United States",
          "displayName" : "克里斯 保罗",
          "schoolType" : "College",
          "teamConference" : "西部",
          "teamConferenceEn" : "Western",
          "weight" : "79.4 公斤",
          "teamCity" : "休斯顿",
          "playYear" : 14,
          "jerseyNo" : "3",
          "teamNameEn" : "Rockets",
          "draft" : 2005,
          "displayNameEn" : "Chris Paul",
          "heightValue" : 1.83,
          "birthDayStr" : "1985-05-06",
          "position" : "后卫",
          "age" : 34,
          "playerId" : "101108"
        },
        "sort" : [
          14,
          1.83
        ]
      },
      {
        "_index" : "nba",
        "_type" : "_doc",
        "_id" : "206",
        "_score" : null,
        "_source" : {
          "countryEn" : "United States",
          "teamName" : "火箭",
          "birthDay" : 507099600000,
          "country" : "美国",
          "teamCityEn" : "Houston",
          "code" : "gerald_green",
          "displayAffiliation" : "No College/United States",
          "displayName" : "杰拉德 格林",
          "schoolType" : "High School",
          "teamConference" : "西部",
          "teamConferenceEn" : "Western",
          "weight" : "93.0 公斤",
          "teamCity" : "休斯顿",
          "playYear" : 12,
          "jerseyNo" : "14",
          "teamNameEn" : "Rockets",
          "draft" : 2005,
          "displayNameEn" : "Gerald Green",
          "heightValue" : 2.01,
          "birthDayStr" : "1986-01-26",
          "position" : "后卫-前锋",
          "age" : 33,
          "playerId" : "101123"
        },
        "sort" : [
          12,
          2.01
        ]
      }
    ]
  }
}

6.6 聚合查询指标聚合

  • ES聚合分析是什么
  1. 聚合分析是数据库中重要的功能特性,完成对⼀个查询的数据集中数据的聚合计算,如:找出某字段(或计算表达式的结果)的最⼤值、最⼩值,计算和、平均值等。ES作为搜索引擎兼数据库,同样提供了强⼤的聚合分析能力。

  2. 对⼀个数据集求最大、最小、和、平均值等指标的聚合,在ES中称为指标聚合

  3. 而关系型数据库中除了有聚合函数外,还可以对查询出的数据行分组group by,再在组上进行指标聚合。在ES中称为桶聚合

6.6.1 max min sum avg 指标聚合查询 GET/POST

  • max min sum avg 指标聚合

localhost:9200/nba/_search
{
    // 语义: 查询火箭队球员平均年龄
  "query": {
    "term": {
      "teamNameEn": "Rockets"
    }
  },
  "aggs": { // aggs 代表使用聚合函数
    "avgAge": { // avgAge是自定义的,因为是查年年龄平均所以起名avgAge
      "avg": { // avg 平均
        "field": "age"
      }
    }
  }, 
  "size": 0 // 不看数据只看指标聚合
}
{
  "took" : 1,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 21,
      "relation" : "eq"
    },
    "max_score" : null,
    "hits" : [ ]
  },
  "aggregations" : {
    "avgAge" : {
      "value" : 26.761904761904763 // 平均年龄
    }
  }
}

6.6.2 value_count 指标聚合查询 GET/POST

  • 统计非空字段的文档数

localhost:9200/nba/_search
{
    // 语义: 查询火箭队中球员打球时间不为空的数量
  "query": {
    "term": {
      "teamNameEn": "Rockets"
    }
  },
  "aggs": {
    "countPlayerYear": {
      "value_count": {
        "field": "playYear"
      }
    }
  }, 
  "size": 0
}
{
  "took" : 4,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 21,
      "relation" : "eq"
    },
    "max_score" : null,
    "hits" : [ ]
  },
  "aggregations" : {
    "countPlayerYear" : {
      "value" : 21
    }
  }
}

6.6.3 _count 指标聚合查询(严格来说不属于聚合) GET/POST

  • 查询火箭队有多少文档,也就是有多少球员

localhost:9200/nba/_count
{
  "query": {
    "term": {
      "teamNameEn": "Rockets"
    }
  }
}
{
    "count": 21,
    "_shards": {
        "total": 1,
        "successful": 1,
        "skipped": 0,
        "failed": 0
    }
}

6.6.4 cardinality 指标聚合查询 GET/POST

  • Cardinality 值去重计算

localhost:9200/nba/_search
{
    // 语义: 查询火箭队中年龄不同的数量
  "query": {
    "term": {
      "teamNameEn": "Rockets"
    }
  },
  "aggs": {
    "countAge": { // 自定义名字
      "cardinality": { // 去掉相同的只保留一个值
        "field": "age"
      }
    }
  },
  "size": 0
}
{
  "took" : 1,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 21,
      "relation" : "eq"
    },
    "max_score" : null,
    "hits" : [ ]
  },
  "aggregations" : {
    "countAge" : {
      "value" : 13
    }
  }
}

6.6.5 status 种指标聚合查询 GET/POST

  • stats 统计count max min avg sum 5个值

localhost:9200/nba/_search
{
    // 语义: 查询火箭球员的年龄status
  "query": {
    "term": {
      "teamNameEn": "Rockets"
    }
  },
  "aggs": {
    "status": {
      "stats": {
        "field": "age"
      }
    }
  },
  "size": 0
}
{
  "took" : 1,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 21,
      "relation" : "eq"
    },
    "max_score" : null,
    "hits" : [ ]
  },
  "aggregations" : {
    "status" : {
      "count" : 21,
      "min" : 21.0,
      "max" : 37.0,
      "avg" : 26.761904761904763,
      "sum" : 562.0
    }
  }
}

6.6.6 extended status 种指标聚合查询 GET/POST

  • Extended stats ⽐比stats多4个统计结果: 平⽅方和、⽅方差、标准差、平均值加减两个标准差的区间

localhost:9200/nba/_search
{
    // 查出火箭队球员的年龄Extend stats
  "query": {
    "term": {
      "teamNameEn": "Rockets"
    }
  },
  "aggs": {
    "extendedStatsAge": {
      "extended_stats": {
        "field": "age"
      }
    }
  },
  "size": 0
}
{
  "took" : 0,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 21,
      "relation" : "eq"
    },
    "max_score" : null,
    "hits" : [ ]
  },
  "aggregations" : {
    "extendedStatsAge" : {
      "count" : 21,
      "min" : 21.0,
      "max" : 37.0,
      "avg" : 26.761904761904763,
      "sum" : 562.0,
      "sum_of_squares" : 15534.0,
      "variance" : 23.5147392290249,
      "std_deviation" : 4.84919985451465,
      "std_deviation_bounds" : {
        "upper" : 36.46030447093406,
        "lower" : 17.063505052875463
      }
    }
  }
}

6.6.7 percentiles 种指标聚合查询 GET/POST

  • Percentiles 占比百分位对应的值统计,默认返回[ 1, 5, 25, 50, 75, 95, 99 ]分位上的值

localhost:9200/nba/_search
{
    // 语义: 查出火箭的球员的年龄占比
  "query": {
    "term": {
      "teamNameEn": "Rockets"
    }
  },
  "aggs": {
    "percentilesAge": {
      "percentiles": {
        "field": "age",
        // 这里可以指定,不使用默认
        // "percents": [
        //   25,
        //   50,
        //   75
        // ]
      }
    }
  },
  "size": 0
}
{
  "took" : 1,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 21,
      "relation" : "eq"
    },
    "max_score" : null,
    "hits" : [ ]
  },
  "aggregations" : {
    "percentilesAge" : {
      "values" : {
        "1.0" : 21.0,
        "5.0" : 21.0,
        "25.0" : 22.75, // 小于22.75岁的 占25%
        "50.0" : 25.0,
        "75.0" : 30.25,// 小于30.25岁的 占75%
        "95.0" : 35.349999999999994,
        "99.0" : 37.0
      }
    }
  }
}

6.7 聚合查询桶聚合

6.7.1 terms aggregation 桶聚合查询 GET/POST

localhost:9200/nba/_search
{
    // 语义: 火箭队根据年龄进行分组
  "query": {
    "term": {
      "teamNameEn": "Rockets"
    }
  },
  "aggs": {
    "aggrAge": {
      "terms": { // 因为根据年龄做桶聚合所以使用terms
        "field": "age",
        "size": 3 // 指定显示桶数
      }
    }
  },
  "size": 0
}
{
  "took" : 1,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 21,
      "relation" : "eq"
    },
    "max_score" : null,
    "hits" : [ ]
  },
  "aggregations" : {
    "aggrAge" : {
      "doc_count_error_upper_bound" : 0,
      "sum_other_doc_count" : 3,
      "buckets" : [
        {
          "key" : 21, // 指定的字段 age
          "doc_count" : 4 // 21岁的文档数有4个
        },
        {
          "key" : 25,
          "doc_count" : 3
        },
        {
          "key" : 23,
          "doc_count" : 2
        }
      ]
    }
  }
}

6.7.2 order 第一种分组聚合查询 GET/POST

{
    // 语义: 根据火箭队年龄进行分组,分组信息通过年龄从大到小排序(通过指定字段)
  "query": {
    "term": {
      "teamNameEn": "Rockets"
    }
  },
  "aggs": {
    "aggrAge": {
      "terms": {
        "field": "age",
        "size": 3,
        "order": {
          "_key": "desc" //"_key关键字 倒序排序
        //   "_count": "desc"  通过文档排序
        }
      }
    }
  },
  "size": 0
}
{
  "took" : 0,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 21,
      "relation" : "eq"
    },
    "max_score" : null,
    "hits" : [ ]
  },
  "aggregations" : {
    "aggrAge" : {
      "doc_count_error_upper_bound" : 0,
      "sum_other_doc_count" : 17,
      "buckets" : [
        {
          "key" : 37,
          "doc_count" : 1
        },
        {
          "key" : 34,
          "doc_count" : 2
        },
        {
          "key" : 33,
          "doc_count" : 1
        }
      ]
    }
  }
}

6.7.3 order 第二种分组聚合查询 GET/POST

localhost:9200/nba/_search
{
    // 语义: 每支球队按该队所有球员的平均年龄进行分组排序(通过分组指标值)
  "aggs": {
    "aggsTeamName": {
      "terms": { // 因为使用分组所以用terms
        "field": "teamNameEn",
        "size": 3, // 显示3条
        "order": {
          "avgAge": "desc"
        }
      }, // 因为需要通过对球队的平均年龄进行分组排序,所以再写aggs
      "aggs": {
        "avgAge": {
          "avg": {
            "field": "age"
          }
        }
      }
    }
  },
  "size": 0
}
{
  "took" : 3,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 566,
      "relation" : "eq"
    },
    "max_score" : null,
    "hits" : [ ]
  },
  "aggregations" : {
    "aggsTeamName" : {
      "doc_count_error_upper_bound" : -1,
      "sum_other_doc_count" : 511,
      "buckets" : [
        {
          "key" : "Bucks",
          "doc_count" : 14,
          "avgAge" : {
            "value" : 28.142857142857142
          }
        },
        {
          "key" : "Mavericks",
          "doc_count" : 20,
          "avgAge" : {
            "value" : 27.85
          }
        },
        {
          "key" : "Lakers",
          "doc_count" : 21,
          "avgAge" : {
            "value" : 27.714285714285715
          }
        }
      ]
    }
  }
}

6.7.3 include 筛选分组聚合查询 GET/POST

localhost:9200/nba/_search
{
    // 语义: 湖人和火箭队按球队平均年龄进行分组排序(指定值列表 )
  "aggs": {
    "aggsTeamName": {
      "terms": {
        "field": "teamNameEn",
        // include指定队伍  ["Lakes","Rockets","warriors"]
        "include": ["Lakes","Rockets","warriors"], 
        // exclude去除["warriors"]
        "exclude": ["warriors"], 
        "size": 3,
        "order": {
          "avgAge": "desc"
        }
      },
      "aggs": {
        "avgAge": {
          "avg": {
            "field": "age"
          }
        }
      }
    }
  },
  "size": 0
}
{
  "took" : 0,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 566,
      "relation" : "eq"
    },
    "max_score" : null,
    "hits" : [ ]
  },
  "aggregations" : {
    "aggsTeamName" : {
      "doc_count_error_upper_bound" : 0,
      "sum_other_doc_count" : 0,
      "buckets" : [
        {
          "key" : "Rockets",
          "doc_count" : 21,
          "avgAge" : {
            "value" : 26.761904761904763
          }
        }
      ]
    }
  }
}

6.7.4 include 正则筛选分组聚合查询 GET/POST

localhost:9200/nba/_search
{
    // 语义: 湖人和火箭队按球队平均年龄进行分组排序(指定值列表 )
  "aggs": {
    "aggsTeamName": {
      "terms": {
        "field": "teamNameEn",
        // 使用正则表达式 
        "include": "Lakers|Ro.*|Warriors.*", 
        "exclude": "warriors", 
        "size": 3,
        "order": {
          "avgAge": "desc"
        }
      },
      "aggs": {
        "avgAge": {
          "avg": {
            "field": "age"
          }
        }
      }
    }
  },
  "size": 0
}
{
  "took" : 0,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 566,
      "relation" : "eq"
    },
    "max_score" : null,
    "hits" : [ ]
  },
  "aggregations" : {
    "aggsTeamName" : {
      "doc_count_error_upper_bound" : 0,
      "sum_other_doc_count" : 0,
      "buckets" : [
        {
          "key" : "Lakers",
          "doc_count" : 21,
          "avgAge" : {
            "value" : 27.714285714285715
          }
        },
        {
          "key" : "Rockets",
          "doc_count" : 21,
          "avgAge" : {
            "value" : 26.761904761904763
          }
        },
        {
          "key" : "Warriors",
          "doc_count" : 20,
          "avgAge" : {
            "value" : 26.25
          }
        }
      ]
    }
  }
}

6.7.4 range aggregation 范围分组聚合查询 GET/POST

localhost:9200/nba/_search
{
    // 语义: 球员年龄按20、20-35、35 这样分组
  "aggs": {
    "ageRange": {
      "range": {
        "field": "age",
        "ranges": [
          {
            "to": 20,  // 小于等于 20
            "key": "A" //别名 A
          },
          {
            "from": 20, // 大于等于20
            "to": 35, //  小于等于 35
            "key": "B"  //别名 B
          },
          {
            "from": 35, // 大于等于35 
            "key": "C" //别名 C
          }
        ]
      }
    }
  }, 
  "size": 0
}
{
  "took" : 0,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 566,
      "relation" : "eq"
    },
    "max_score" : null,
    "hits" : [ ]
  },
  "aggregations" : {
    "ageRange" : {
      "buckets" : [
        {
          "key" : "A",
          "to" : 20.0,
          "doc_count" : 15
        },
        {
          "key" : "B",
          "from" : 20.0,
          "to" : 35.0,
          "doc_count" : 531
        },
        {
          "key" : "C",
          "from" : 35.0,
          "doc_count" : 20
        }
      ]
    }
  }
}

6.7.5 date rabge aggregation 时间范围分组聚合查询 GET/POST

localhost:9200/nba/_search
{
    // 语义: 球员按出生年月分组
  "aggs": {
    "birthDayRange": {
      "date_range": {   // 时间类型
        "field": "birthDay", // 生日 生日是时间类型
        "format": "MM-yyy",  //时间格式 月份年份
        "ranges": [
          {
            "from": "01-1989" // 小于1989年1月出生
          },
          {
            "from": "01-1989", // 1989年1月到1999年1月
            "to": "01-1999"
          },
          {
            "from": "01-1999", // 1999年1月到2009年1月
            "to": "01-2009"
          },
          {
            "from": "01-2009"
          }
        ]
      }
    }
  }, 
  "size": 0
}
{
  "took" : 0,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 566,
      "relation" : "eq"
    },
    "max_score" : null,
    "hits" : [ ]
  },
  "aggregations" : {
    "birthDayRange" : {
      "buckets" : [
        {
          "key" : "01-1989-01-1999",
          "from" : 5.99616E11,
          "from_as_string" : "01-1989",
          "to" : 9.151488E11,
          "to_as_string" : "01-1999",
          "doc_count" : 426
        },
        {
          "key" : "01-1989-*",
          "from" : 5.99616E11,
          "from_as_string" : "01-1989",
          "doc_count" : 469
        },
        {
          "key" : "01-1999-01-2009",
          "from" : 9.151488E11,
          "from_as_string" : "01-1999",
          "to" : 1.230768E12,
          "to_as_string" : "01-2009",
          "doc_count" : 43
        },
        {
          "key" : "01-2009-*",
          "from" : 1.230768E12,
          "from_as_string" : "01-2009",
          "doc_count" : 0
        }
      ]
    }
  }
}


6.7.6 date histogram aggregation 时间范围分组聚合查询 GET/POST

  • 按天、月、年等进行聚合统计。可按 year (1y), quarter (1q), month (1M), week (1w), day (1d), hour (1h), minute (1m), second (1s) 间隔聚合

localhost:9200/nba/_search
{
    // 语义: 球员按出⽣生年年分组
  "aggs": {
    "birthday_aggs": {
      "date_histogram": {
        "field": "birthDay", //生日字段
        "format": "yyyy",  // 时间格式
        "calendar_interval": "year" // 根据年
      }
    }
  }, 
  "size": 0
}
{
  "took" : 1,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 566,
      "relation" : "eq"
    },
    "max_score" : null,
    "hits" : [ ]
  },
  "aggregations" : {
    "birthday_aggs" : {
      "buckets" : [
        {
          "key_as_string" : "1977",
          "key" : 220924800000,
          "doc_count" : 1
        },
        {
          "key_as_string" : "1978",
          "key" : 252460800000,
          "doc_count" : 1
        },
        {
          "key_as_string" : "1979",
          "key" : 283996800000,
          "doc_count" : 0
        },
        {
          "key_as_string" : "1980",
          "key" : 315532800000,
          "doc_count" : 3
        },
        {
          "key_as_string" : "1981",
          "key" : 347155200000,
          "doc_count" : 2
        },
        {
          "key_as_string" : "1982",
          "key" : 378691200000,
          "doc_count" : 3
        },
        {
          "key_as_string" : "1983",
          "key" : 410227200000,
          "doc_count" : 2
        },
        {
          "key_as_string" : "1984",
          "key" : 441763200000,
          "doc_count" : 8
        },
        {
          "key_as_string" : "1985",
          "key" : 473385600000,
          "doc_count" : 15
        },
        {
          "key_as_string" : "1986",
          "key" : 504921600000,
          "doc_count" : 19
        },
        {
          "key_as_string" : "1987",
          "key" : 536457600000,
          "doc_count" : 16
        },
        {
          "key_as_string" : "1988",
          "key" : 567993600000,
          "doc_count" : 27
        },
        {
          "key_as_string" : "1989",
          "key" : 599616000000,
          "doc_count" : 24
        },
        {
          "key_as_string" : "1990",
          "key" : 631152000000,
          "doc_count" : 35
        },
        {
          "key_as_string" : "1991",
          "key" : 662688000000,
          "doc_count" : 31
        },
        {
          "key_as_string" : "1992",
          "key" : 694224000000,
          "doc_count" : 36
        },
        {
          "key_as_string" : "1993",
          "key" : 725846400000,
          "doc_count" : 46
        },
        {
          "key_as_string" : "1994",
          "key" : 757382400000,
          "doc_count" : 45
        },
        {
          "key_as_string" : "1995",
          "key" : 788918400000,
          "doc_count" : 57
        },
        {
          "key_as_string" : "1996",
          "key" : 820454400000,
          "doc_count" : 56
        },
        {
          "key_as_string" : "1997",
          "key" : 852076800000,
          "doc_count" : 57
        },
        {
          "key_as_string" : "1998",
          "key" : 883612800000,
          "doc_count" : 39
        },
        {
          "key_as_string" : "1999",
          "key" : 915148800000,
          "doc_count" : 28
        },
        {
          "key_as_string" : "2000",
          "key" : 946684800000,
          "doc_count" : 15
        }
      ]
    }
  }
}

6.8 query_string 查询

  • query_string 查询,如果熟悉lucene的查询语法,我们可以直接⽤用lucene查询语法写⼀一个查询串进行查询,ES中接到请求后,通过查询解析器 ,解析查询串生成对应的查询。

6.8.1 query_string AND OR 单字段查询 GET/POST请求

localhost:9200/nba/_search
{
    // 语义: 指定单个字段查询(查询詹姆斯或者库里的球员)
  "query": {
    "query_string": {
      "default_field": "displayNameEn",
      "query": "james OR curry" // 这里可以使用or或and也就是sql里的or和and
    //  "query": "james AND curry"
    }
  },
  "size": 3
}
{
  "took" : 0,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 7,
      "relation" : "eq"
    },
    "max_score" : 5.4989905,
    "hits" : [
      {
        "_index" : "nba",
        "_type" : "_doc",
        "_id" : "123",
        "_score" : 5.4989905,
        "_source" : {
          "countryEn" : "United States",
          "teamName" : "独行侠",
          "birthDay" : 651384000000,
          "country" : "美国",
          "teamCityEn" : "Dallas",
          "code" : "seth_curry",
          "displayAffiliation" : "Duke/United States",
          "displayName" : "賽斯 库里",
          "schoolType" : "College",
          "teamConference" : "西部",
          "teamConferenceEn" : "Western",
          "weight" : "83.9 公斤",
          "teamCity" : "达拉斯",
          "playYear" : 6,
          "jerseyNo" : "30",
          "teamNameEn" : "Mavericks",
          "draft" : 2013,
          "displayNameEn" : "Seth Curry",
          "heightValue" : 1.88,
          "birthDayStr" : "1990-08-23",
          "position" : "后卫",
          "age" : 29,
          "playerId" : "203552"
        }
      },
      {
        "_index" : "nba",
        "_type" : "_doc",
        "_id" : "124",
        "_score" : 5.4989905,
        "_source" : {
          "countryEn" : "United States",
          "teamName" : "勇士",
          "birthDay" : 574318800000,
          "country" : "美国",
          "teamCityEn" : "Golden State",
          "code" : "stephen_curry",
          "displayAffiliation" : "Davidson/United States",
          "displayName" : "斯蒂芬 库里",
          "schoolType" : "College",
          "teamConference" : "西部",
          "teamConferenceEn" : "Western",
          "weight" : "86.2 公斤",
          "teamCity" : "金州",
          "playYear" : 10,
          "jerseyNo" : "30",
          "teamNameEn" : "Warriors",
          "draft" : 2009,
          "displayNameEn" : "Stephen Curry",
          "heightValue" : 1.9,
          "birthDayStr" : "1988-03-14",
          "position" : "后卫",
          "age" : 31,
          "playerId" : "201939"
        }
      },
      {
        "_index" : "nba",
        "_type" : "_doc",
        "_id" : "214",
        "_score" : 4.699642,
        "_source" : {
          "countryEn" : "United States",
          "teamName" : "火箭",
          "birthDay" : 620107200000,
          "country" : "美国",
          "teamCityEn" : "Houston",
          "code" : "james_harden",
          "displayAffiliation" : "Arizona State/United States",
          "displayName" : "詹姆斯 哈登",
          "schoolType" : "College",
          "teamConference" : "西部",
          "teamConferenceEn" : "Western",
          "weight" : "99.8 公斤",
          "teamCity" : "休斯顿",
          "playYear" : 10,
          "jerseyNo" : "13",
          "teamNameEn" : "Rockets",
          "draft" : 2009,
          "displayNameEn" : "James Harden",
          "heightValue" : 1.96,
          "birthDayStr" : "1989-08-26",
          "position" : "后卫",
          "age" : 30,
          "playerId" : "201935"
        }
      }
    ]
  }
}

6.8.2 query_string AND OR 多字段查询 GET/POST请求

localhost:9200/nba/_search
{
    // 语义: 指定多个字段查询(查询詹姆斯或者库里的球员)
  "query": {
    "query_string": {
      "fields": [ // 指定多个字段
        "displayNameEn",
        "teamNameEn"
        ],
        "query": "james AND Rockets" // 查询条件
    }
  },
  "size": 3
}
{
  "took" : 0,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 1,
      "relation" : "eq"
    },
    "max_score" : 7.9719486,
    "hits" : [
      {
        "_index" : "nba",
        "_type" : "_doc",
        "_id" : "214",
        "_score" : 7.9719486,
        "_source" : {
          "countryEn" : "United States",
          "teamName" : "火箭",
          "birthDay" : 620107200000,
          "country" : "美国",
          "teamCityEn" : "Houston",
          "code" : "james_harden",
          "displayAffiliation" : "Arizona State/United States",
          "displayName" : "詹姆斯 哈登",
          "schoolType" : "College",
          "teamConference" : "西部",
          "teamConferenceEn" : "Western",
          "weight" : "99.8 公斤",
          "teamCity" : "休斯顿",
          "playYear" : 10,
          "jerseyNo" : "13",
          "teamNameEn" : "Rockets",
          "draft" : 2009,
          "displayNameEn" : "James Harden",
          "heightValue" : 1.96,
          "birthDayStr" : "1989-08-26",
          "position" : "后卫",
          "age" : 30,
          "playerId" : "201935"
        }
      }
    ]
  }
}

七、ElasticSerach 高级搜索

7.1 索引别名的使用

  • 在开发中,随着业务需求的迭代,较老的业务逻辑就要面临更新甚至是重构,而对于es来说,为了了适应新的业务逻辑,可能就要对原有的索引做一些修改,比如对某些字段做调整,甚至是重建索引。而做这些操作的时候,可能会对业务造成影响,甚至是停机调整等问题。由此,es提供了索引别名来解决这些问题。 索引别名就像一个快捷方式或是软连接,可以指向一个或多个索引,也可以给任意一个需要索引名的API来使⽤用。别名的应用为程序提供了极大地灵活性

7.1.1 查询别名 GET请求

localhost:9200/nba/_alias // 查询nba别名
localhost:9200/_aliases  // 查询所有别名
{
  // 语义: 查看所有别名
    "nba": {
        "aliases": {}
    },
    ".kibana_task_manager": {
        "aliases": {}
    },
    ".kibana_1": {
        "aliases": {
            ".kibana": {}
        }
    }
}

7.1.2 新增别名 POST请求

localhost:9200/_aliases
{
    // 语义: nba 新建别名nba_v1.0
  "actions": [
    {
      "add": {
        "index": "nba",
        "alias": "nba_v1.0"
      }
    }
  ]
}
{
    "acknowledged": true
}

7.1.3 删除别名 POST请求

localhost:9200/_aliases
{
  // 语义: 删除nba的nba_v1.0别名
  "actions": [
    {
      "remove": {
        "index": "nba",
        "alias": "nba_v1.0"
      }
    }
  ]
}
{
    "acknowledged": true
}

7.1.4 重命名别名 POST请求

localhost:9200/_aliases
{
  // 先删除nba_v1.0 别名 在新增 nba_v2.0别名,即是重命名
  "actions": [
    {
      "remove": {
        "index": "nba",
        "alias": "nba_v1.0"
      }
    },
    {
      "add": {
        "index": "nba",
        "alias": "nba_v2.0"
      }
    }
  ]
}
{
    "acknowledged": true
}

7.1.5 通过别名获取索引 GET请求

localhost:9200/nba_v2.0
{
    "nba": {
        "aliases": {
            "nba_v2.0": {}
        },
        "mappings": {
            "properties": {
                "age": {
                    "type": "integer"
                },
                "birthDay": {
                    "type": "date"
                },
                "birthDayStr": {
                    "type": "keyword"
                },
                "code": {
                    "type": "text"
                },
                "country": {
                    "type": "text"
                },
                "countryEn": {
                    "type": "text"
                },
                "displayAffiliation": {
                    "type": "text"
                },
                "displayName": {
                    "type": "text"
                },
                "displayNameEn": {
                    "type": "text"
                },
                "draft": {
                    "type": "long"
                },
                "heightValue": {
                    "type": "float"
                },
                "jerseyNo": {
                    "type": "text"
                },
                "playYear": {
                    "type": "long"
                },
                "playerId": {
                    "type": "keyword"
                },
                "position": {
                    "type": "text"
                },
                "schoolType": {
                    "type": "text"
                },
                "teamCity": {
                    "type": "text"
                },
                "teamCityEn": {
                    "type": "text"
                },
                "teamConference": {
                    "type": "keyword"
                },
                "teamConferenceEn": {
                    "type": "keyword"
                },
                "teamName": {
                    "type": "keyword"
                },
                "teamNameEn": {
                    "type": "keyword"
                },
                "weight": {
                    "type": "text"
                }
            }
        },
        "settings": {
            "index": {
                "creation_date": "1573300240575",
                "number_of_shards": "1",
                "number_of_replicas": "1",
                "uuid": "X7FLu-8sRcijAYKUkgBZQQ",
                "version": {
                    "created": "7020199"
                },
                "provided_name": "nba"
            }
        }
    }
}

7.1.6 通过别名写索引 POST请求

  • 当别名指定了一个索引,则可以做写的操作

localhost:9200/nba_v2.0/_doc/566
{
  // 语义: 通过别名nba_v2.0 修改id为566的球员
    "countryEn": "Croatia",
    "teamName": "快船",
    "birthDay": 858661200000,
    "country": "克罗地亚",
    "teamCityEn": "LA",
    "code": "ivica_zubac",
    "displayAffiliation": "Croatia",
    "displayName": "伊维察 祖巴茨哥哥", //"伊维察 祖巴茨"修改为"伊维察 祖巴茨哥哥"
    "schoolType": "",
    "teamConference": "西部",
    "teamConferenceEn": "Western",
    "weight": "108.9 公斤",
    "teamCity": "洛杉矶",
    "playYear": 3,
    "jerseyNo": "40",
    "teamNameEn": "Clippers",
    "draft": 2016,
    "displayNameEn": "Ivica Zubac",
    "heightValue": 2.16,
    "birthDayStr": "1997-03-18",
    "position": "中锋",
    "age": 22,
    "playerId": "1627826"
   
}
{
    "_index": "nba",
    "_type": "_doc",
    "_id": "566",
    "_version": 2,
    "result": "updated",
    "_shards": {
        "total": 2,
        "successful": 1,
        "failed": 0
    },
    "_seq_no": 566,
    "_primary_term": 1
}

7.2 如何重建索引

  • Elasticsearch是⼀一个实时的分布式搜索引擎,为用户提供搜索服务,当我们决定存储某种数据时,在创建索引的时候需要将数据结构完整确定下来,于此同时索引的设定和很多固定配置将用不能改变。当需要改变数据结构时,就需要重新建立索引,为此,Elastic团队提供了很多辅助工具帮助开发人员进行重建索引

  1. nba取一个别名nba_latest, nba_latest作为对外使用
  • POST 请求
localhost:9200/_aliases
{
  "actions": [
    {
      "add": {
        "index": "nba",
        "alias": "nba_latest"
      }
    }
  ]
}
{
  "acknowledged" : true
}

  1. 新增一个索引nba_20220101,结构复制于nba索引,根据业务要求修改字段
  • PUT 请求
localhost:9200/nba_20220101
{
   "mappings": {
        "properties": {
            "age": {
                "type": "integer"
            },
            "birthDay": {
                "type": "date"
            },
            "birthDayStr": {
                "type": "keyword"
            },
            "code": {
                "type": "text"
            },
            "country": {
                "type": "keyword"
            },
            "countryEn": {
                "type": "keyword"
            },
            "displayAffiliation": {
                "type": "text"
            },
            "displayName": {
                "type": "text"
            },
            "displayNameEn": {
                "type": "text"
            },
            "draft": {
                "type": "long"
            },
            "heightValue": {
                "type": "float"
            },
            "jerseyNo": {
                "type": "keyword"
            },
            "playYear": {
                "type": "long"
            },
            "playerId": {
                "type": "keyword"
            },
            "position": {
                "type": "text"
            },
            "schoolType": {
                "type": "text"
            },
            "teamCity": {
                "type": "text"
            },
            "teamCityEn": {
                "type": "text"
            },
            "teamConference": {
                "type": "keyword"
            },
            "teamConferenceEn": {
                "type": "keyword"
            },
            "teamName": {
                "type": "keyword"
            },
            "teamNameEn": {
                "type": "keyword"
            },
            "weight": {
                "type": "text"
            }
        }
   }
}
{
    "acknowledged": true,
    "shards_acknowledged": true,
    "index": "nba_20220101"
}
  1. 将nba数据同步到nba_20220101
  • POST 请求
localhost:9200/_reindex //同步请求 等待响应
localhost:9200/_reindex?wait_for_completion=false  // 异步请求 直接返回
{
  "source": {
    "index": "nba"
  },
  "dest": {
    "index": "nba_20220101"
  }
}
{
  "took" : 102,
  "timed_out" : false,
  "total" : 566,
  "updated" : 0,
  "created" : 566,
  "deleted" : 0,
  "batches" : 1,
  "version_conflicts" : 0,
  "noops" : 0,
  "retries" : {
    "bulk" : 0,
    "search" : 0
  },
  "throttled_millis" : 0,
  "requests_per_second" : -1.0,
  "throttled_until_millis" : 0,
  "failures" : [ ]
}

  1. 给nba_20220101添加别名nba_latest,删除nba别名nba_latest
  • POST请求
localhost:9200/_aliases
{
  "actions": [
    {
      "add": {
        "index": "nba_20220101",
        "alias": "nba_latest"
      }
    }
  ]
}
{
  "acknowledged" : true
}

  1. 删除nba索引
  • DELETE请求
localhost:9200/nba
{
  "acknowledged" : true
}

7.3 refresh操作

  • 理想的搜索
  1. 新的数据一添加到索引中立马就能搜索到,但是真实情况不是这样的

  2. 我们使⽤用链式命令请求,先添加⼀一个⽂文档,再⽴立刻搜索

curl -X PUT localhost:9200/star/_doc/888 -H 'Content-Type:

application/json' -d '{ "displayName": "蔡徐坤" }'

curl  -X GET localhost:9200/star/_doc/_search?pretty
curl -X PUT localhost:9200/star/_doc/666?refresh -H 'Content-Type:

application/json' -d '{ "displayName": "杨超越" }'

curl  -X GET localhost:9200/star/_doc/_search?pretty
  1. 修改默认更更新时间(默认时间是1s)
  • PUT 请求
localhost:9200/star/_settings
{
  "index":{
    "refresh_interval": "5s"
  }
}
{
  "acknowledged" : true
}
  1. 将refresh关闭
  • PUT 请求
localhost:9200/star/_settings
{
  "index":{
    "refresh_interval": "-1"
  }
}
{
  "acknowledged" : true
}

7.4 高亮查询

  • 如果返回的结果集中很多符合条件的结果,那怎么能一眼就能看到我们想要的那个结果呢?比如,我们搜索苍井空 ,在结果集中,将所有苍井空 高亮显示?

localhost:9200/nba_latest/_search
{
  // 语义: 查找NBA james球员,对james做高亮显示
  "query": {
    "match": {
      "displayNameEn": "james"
    }
  },
  "highlight": { // 高亮关键字
    "fields": { // 对displayNameEn做高亮
      "displayNameEn": {}
    }
  },
  "size": 2
}

 // 也可以自定义标签
{
  "query": {
    "match": {
      "displayNameEn": "james"
    }
  },
  "highlight": {
    "fields": {
      "displayNameEn": {
        // 定义高亮标签为 h1
        "pre_tags": ["<h1>"],
        "post_tags": ["</h1>"]
        
      }
    }
  },
  "size": 2
}
{
  "took" : 2,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 5,
      "relation" : "eq"
    },
    "max_score" : 4.699642,
    "hits" : [
      {
        "_index" : "nba_20220101",
        "_type" : "_doc",
        "_id" : "214",
        "_score" : 4.699642,
        "_source" : {
          "countryEn" : "United States",
          "teamName" : "火箭",
          "birthDay" : 620107200000,
          "country" : "美国",
          "teamCityEn" : "Houston",
          "code" : "james_harden",
          "displayAffiliation" : "Arizona State/United States",
          "displayName" : "詹姆斯 哈登",
          "schoolType" : "College",
          "teamConference" : "西部",
          "teamConferenceEn" : "Western",
          "weight" : "99.8 公斤",
          "teamCity" : "休斯顿",
          "playYear" : 10,
          "jerseyNo" : "13",
          "teamNameEn" : "Rockets",
          "draft" : 2009,
          "displayNameEn" : "James Harden",
          "heightValue" : 1.96,
          "birthDayStr" : "1989-08-26",
          "position" : "后卫",
          "age" : 30,
          "playerId" : "201935"
        },
        "highlight" : {
          // "<em> 包裹起来是 高亮的意思
          "displayNameEn" : [
            "<em>James</em> Harden"
          ]
        }
      },
      {
        "_index" : "nba_20220101",
        "_type" : "_doc",
        "_id" : "266",
        "_score" : 4.699642,
        "_source" : {
          "countryEn" : "United States",
          "teamName" : "国王",
          "birthDay" : 854082000000,
          "country" : "美国",
          "teamCityEn" : "Sacramento",
          "code" : "justin_james",
          "displayAffiliation" : "United States",
          "displayName" : "贾斯汀 詹姆斯",
          "schoolType" : "College",
          "teamConference" : "西部",
          "teamConferenceEn" : "Western",
          "weight" : "86.2 公斤",
          "teamCity" : "萨克拉门托",
          "playYear" : 0,
          "jerseyNo" : "",
          "teamNameEn" : "Kings",
          "draft" : 2019,
          "displayNameEn" : "Justin James",
          "heightValue" : 2.01,
          "birthDayStr" : "1997-01-24",
          "position" : "后卫-前锋",
          "age" : 22,
          "playerId" : "1629713"
        },
        "highlight" : {
          // "<em> 包裹起来是 高亮的意思
          "displayNameEn" : [
            "Justin <em>James</em>"
          ]
        }
      }
    ]
  }
}

7.5 查询建议

  • 查询建议是什么
  1. 查询建议,是为了给用户提供更好的搜索体验。包括:词条检查,自动补全
  • Suggester
  1. Term suggester
  2. Phrase suggester
  3. Completion suggester
text指定搜索文本
field获取建议词的搜索字段
analyzer指定分词器
size每个词返回的最大建议词数
sort如何对建议词进行排序,可用选项:score:先按评分排序、再按文档频率排、term顺序;frequency:先按文档频率排,再按评分、term顺序排。
suggest_mode建议模式,控制提供建议词的方式:missing:仅在搜索的词项在索引中不存在时才提供建议词,默认值;popular:仅建议文档频率比搜索词项高的词;always:总是提供匹配的建议词

7.5.1 term suggester

  • term 词条建议器 ,对给输入的文本进行分词,为每个分词提供词项建议

localhost:9200/nba_latest/_search
{
  "suggest": {
    "my-suggest": {
      "text": "jamse", //用户可能输入错误 jsmes写成jamse
      "term": {
        "suggest_mode": "missing",
        "field": "displayNameEn"
      }
    }
  }
}
{
  "took" : 3,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 0,
      "relation" : "eq"
    },
    "max_score" : null,
    "hits" : [ ]
  },
  "suggest" : {
    "my-suggest" : [
      {
        "text" : "jamse",
        "offset" : 0,
        "length" : 5,
        "options" : [
          {
            "text" : "james",
            "score" : 0.8,
            "freq" : 5
          },
          {
            "text" : "jamal",
            "score" : 0.6,
            "freq" : 2
          },
          {
            "text" : "jake",
            "score" : 0.5,
            "freq" : 1
          },
          {
            "text" : "jose",
            "score" : 0.5,
            "freq" : 1
          }
        ]
      },
      {
        "text" : "hardne",
        "offset" : 6,
        "length" : 6,
        "options" : [
          {
            "text" : "harden",
            "score" : 0.8333333,
            "freq" : 1
          }
        ]
      }
    ]
  }
}

7.5.2 phrase suggester

  • phrase 短语建议,在term的基础上,会考量多个term之间的关系,比如是否同时出现在索引的原文⾥里,相邻程度,以及词频等

localhost:9200/nba_latest/_search
{
  "suggest": {
    "my-suggest": {
      "text": "jamse hardne",
      "phrase": { // 词组 对单词进行联系
        "field": "displayNameEn"
      }
    }
  }
}
{
  "took" : 26,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 0,
      "relation" : "eq"
    },
    "max_score" : null,
    "hits" : [ ]
  },
  "suggest" : {
    "my-suggest" : [
      {
        "text" : "jamse hardne",
        "offset" : 0,
        "length" : 12,
        "options" : [
          {
            "text" : "james hardne",
            "score" : 0.0025682184
          },
          {
            "text" : "jamal hardne",
            "score" : 0.0016773979
          },
          {
            "text" : "jamse harden",
            "score" : 0.0016222595
          },
          {
            "text" : "jake hardne",
            "score" : 0.001299489
          },
          {
            "text" : "jose hardne",
            "score" : 0.001299489
          }
        ]
      }
    ]
  }
}

7.5.3 completion suggester

  • Completion 完成建议

localhost:9200/nba_latest/_search
{
  "suggest": {
    "my-suggest": {
      "text": "Miam",
      "completion":{
      "field": "teamCityEn"
      }
    }
  }
}

八、NBA中国官网实战

  • 官方网站
    https://china.nba.com/playerindex/

8.1 项目搭建

  • springboot 整合 elasticsearch 和 mysql

8.1.1 POM依赖

        <!-- elasticsearch-rest-high-level-client -->
        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>elasticsearch-rest-high-level-client</artifactId>
            <version>7.2.1</version>
        </dependency>
        <!-- elasticsearch -->
        <dependency>
            <groupId>org.elasticsearch</groupId>
            <artifactId>elasticsearch</artifactId>
            <version>7.2.1</version>
        </dependency>

8.1.2 YML依赖

elasticsearch:
  host: localhost
  port: 9200

8.1.3 ElasticSearch配置文件

package com.frame.elasticsearch.config;

import lombok.Data;
import org.apache.http.HttpHost;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.springframework.boot.SpringBootConfiguration;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;

/**
 * ElasticSearch配置文件
 * Es7使用RestHighLevelClient操作ES
 */
@SpringBootConfiguration
@ConfigurationProperties(prefix = "elasticsearch")
@Data
public class ElasticSearchConfig {
    private String host;
    private Integer port;

    /**
     * 创建RestHighLevelClient 实例
     */
    @Bean
    public RestHighLevelClient restHighLevelClient() {
        HttpHost http = new HttpHost(host, port, "http");
        return new RestHighLevelClient(RestClient.builder(http));
    }
}

8.1.4 ElasticSearch CRUD入门操作

  • 对象转Map工具类
import org.springframework.cglib.beans.BeanMap;

import java.util.HashMap;
import java.util.Map;

public class BeanUtils {
    /**
     * 对象转为Map
     */
    public static <T> Map<String, Object> beanToMap(T bean) {
        HashMap<String, Object> map = new HashMap<>();
        if (bean != null) {
            BeanMap beanMap = BeanMap.create(bean);
            for (Object o : beanMap.keySet()) {
                if (beanMap.get(o) != null) {
                    map.put(o.toString(), beanMap.get(o));
                }
            }
        }
        return map;
    }
}
  • CRUD 实现方法
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.frame.common.entity.NbaPlayer;
import com.frame.common.utils.BeanUtils;
import com.frame.elasticsearch.mapper.NbaPlayerMapper;
import com.frame.elasticsearch.service.NbaPlayerService;
import org.elasticsearch.action.delete.DeleteRequest;
import org.elasticsearch.action.delete.DeleteResponse;
import org.elasticsearch.action.get.GetRequest;
import org.elasticsearch.action.get.GetResponse;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.action.update.UpdateRequest;
import org.elasticsearch.action.update.UpdateResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.index.reindex.BulkByScrollResponse;
import org.elasticsearch.index.reindex.DeleteByQueryRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.io.IOException;
import java.util.Map;

/**
 * <p>
 * 服务实现类
 * </p>
 *
 * @author Crazy.X
 * @since 2019-11-10
 */
@Service
public class NbaPlayerServiceImpl implements NbaPlayerService {

    /* ES索引 */
    private final String NBA_INDEX = "nba_latest";

    @Autowired
    private RestHighLevelClient restHighLevelClient;

    /**
     * 添加一条文档
     */
    @Override
    public boolean addPlayer(NbaPlayer player, String id) throws IOException {
        // 获取 IndexRequest
        IndexRequest request = new IndexRequest(NBA_INDEX)
                .id(id)
                .source(BeanUtils.beanToMap(player));
        // 获取 IndexResponse
        IndexResponse response = restHighLevelClient.index(request, RequestOptions.DEFAULT);
        System.out.println(JSON.toJSONString(response));
        return false;
    }

    /**
     * 获取一条文档
     */
    @Override
    public Map<String, Object> getPlayer(String id) throws IOException {
        // 获取 GetRequest
        GetRequest getRequest = new GetRequest(NBA_INDEX, id);
        // 获取 GetResponse
        GetResponse getResponse = restHighLevelClient.get(getRequest, RequestOptions.DEFAULT);
        // 返回结果
        return getResponse.getSource();
    }

    /**
     * 更新一条文档
     */
    @Override
    public boolean updatePlayer(NbaPlayer nbaPlayer, String id) throws IOException {
        // 获取 UpdateRequest
        UpdateRequest updateRequest = new UpdateRequest(NBA_INDEX, id)
                .doc(BeanUtils.beanToMap(nbaPlayer));
        // 获取 UpdateResponse
        UpdateResponse update = restHighLevelClient.update(updateRequest, RequestOptions.DEFAULT);
        System.out.println(JSON.toJSONString(update));
        return true;
    }

    /**
     * 删除一条文档
     */
    @Override
    public boolean deletePlayer(String id) throws IOException {
        // 获取 DeleteRequest
        DeleteRequest deleteRequest = new DeleteRequest(NBA_INDEX, id).id(id);
        // 获取 DeleteResponse
        DeleteResponse delete = restHighLevelClient.delete(deleteRequest, RequestOptions.DEFAULT);
        System.out.println(delete);
        return true;
    }

    /**
     * 删除所有文档
     * 先查询所所有在进行删除
     */
    @Override
    public boolean deleteAllPlayer() throws IOException {
        // 获取 deleteByQueryRequest
        DeleteByQueryRequest deleteByQueryRequest = new DeleteByQueryRequest(NBA_INDEX);
        // 获取 BulkByScrollResponse
        BulkByScrollResponse bulkByScrollResponse = restHighLevelClient.deleteByQuery(
                deleteByQueryRequest,
                RequestOptions.DEFAULT
        );
        return true;
    }
}
  • CRUD 测试类
import com.frame.common.entity.NbaPlayer;
import com.frame.elasticsearch.service.NbaPlayerService;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import java.io.IOException;
import java.util.Map;

@RunWith(SpringRunner.class)
@SpringBootTest
public class NbaPlayerServiceImplTest {

    @Autowired
    NbaPlayerService nbaPlayerService;

    @Test
    public void addPlayer() throws IOException {
        NbaPlayer nbaPlayer = new NbaPlayer()
                .setId(999)
                .setDisplayName("苍井空");
        boolean result = nbaPlayerService.addPlayer(nbaPlayer, "999");
    }

    @Test
    public void getPlayer() throws IOException {
        Map<String, Object> player = nbaPlayerService.getPlayer("999");
        System.out.println(player);
    }


    @Test
    public void updatePlayer() throws IOException {
        NbaPlayer nbaPlayer = new NbaPlayer()
                .setId(999)
                .setDisplayName("小泽玛利亚");
        boolean result = nbaPlayerService.updatePlayer(nbaPlayer, "999");
    }

    @Test
    public void deletePlayer() throws IOException {
        boolean result = nbaPlayerService.deletePlayer("999");
    }

    @Test
    public void deleteAllPlayer() throws IOException {
        boolean result = nbaPlayerService.deleteAllPlayer();
    }
}

8.2 接口开发

  • Result结果集Vo
import com.frame.common.enums.ResultEnum;
import lombok.AllArgsConstructor;
import lombok.Data;

/**
 * 结果封装Vo
 */
@Data
@AllArgsConstructor
public class Result<T> {

    private Integer code;
    private String msg;
    private T data;

    public static <T> Result success() {
        return success(null);
    }

    public static <T> Result success(T data) {
        return success(ResultEnum.SUCCESS.getCode(), data);
    }

    public static <T> Result success(Integer code, T data) {
        return success(code, ResultEnum.SUCCESS.getMsg(), data);
    }

    public static <T> Result success(String msg, T data) {
        return success(ResultEnum.SUCCESS.getCode(), msg, data);
    }

    public static <T> Result success(Integer code, String msg, T data) {
        return new Result<T>(code, msg, data);
    }

    public static <T> Result fail() {
        return fail(ResultEnum.FAIL.getCode());
    }

    public static <T> Result fail(Integer code) {
        return fail(code, ResultEnum.FAIL.getMsg());
    }

    public static <T> Result fail(String msg) {
        return fail(ResultEnum.FAIL.getCode(), msg);
    }

    public static <T> Result fail(Integer code, String msg) {
        return success(code, msg, null);
    }
}
  • 结果集对应的枚举
import lombok.AllArgsConstructor;
import lombok.Getter;

/**
 * Result结果集枚举类
 */
@Getter
@AllArgsConstructor
public enum ResultEnum {

    SUCCESS(200, "操作成功"),
    FAIL(400,"操作失败")
    ;
    private Integer code;
    private String msg;
}

8.2.1 将数据库数据导入到elastic search

  • controller层
    /**
     * 从mysql导入数据到es
     */
    @GetMapping("/import")
    public Result importAllPlayer() {
        try {
            nbaPlayerService.importAllPlayer();
            return Result.success("数据导入成功");
        } catch (IOException e) {
            log.error("ElasticSearch导入数据失败");
            e.printStackTrace();
            return Result.fail("ElasticSearch导入数据失败");
        }
    }
  • service层
    /**
     * 从mysql导入数据到es
     */
    @Override
    @Transactional
    public boolean importAllPlayer() throws IOException {
        // 查询所有数据,这里使用MybatisPlus不作解释
        List<NbaPlayer> nbaPlayers = list();
        for (NbaPlayer e : nbaPlayers) {
            // 此处调用的增加文档方法
            addPlayer(e, String.valueOf(e.getId()));
        }
        return true;
    }

8.2.2 通过姓名查找球员

  • controller层
    /**
     * 通过姓名查找球员
     */
    @GetMapping("/searchMatch")
    public Result searchMatch(@RequestParam("key") String key,
                              @RequestParam("val") String val,
                              @RequestParam(value = "page", required = false, defaultValue = "0") Integer page,
                              @RequestParam(value = "limit", required = false, defaultValue = "10") Integer limit) {
        List<NbaPlayer> nbaPlayers = null;
        try {
            nbaPlayers = nbaPlayerService.searchTerm(key, val, page, limit);
        } catch (IOException e) {
            log.error("searchMatch失败,参数[key={}]][val={}]]", key, val);
            e.printStackTrace();
        }
        return Result.success(nbaPlayers);
    }
  • service层
    /**
     * 通过姓名查找球员
     */
    @Override
    public List<NbaPlayer> searchMatch(String key, String val, Integer page, Integer limit) throws IOException {
        // 获取 SearchRequest
        SearchRequest searchRequest = new SearchRequest(NBA_INDEX);
        // 创建 SearchSourceBuilder 用于查询语句
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        searchSourceBuilder
                // 查询 通过match查询 key 字段名称 val 字段值
                .query(QueryBuilders.termQuery(key, val))
                // 起始页
                .from(page)
                // 显示条数
                .size(limit);
        // 设置 请求源 理解为设置查询语句
        searchRequest.source(searchSourceBuilder);
        // 获取 SearchResponse 查询数据
        SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
        // 获取碰撞之后的结果 (固定写法)
        SearchHit[] hits = searchResponse.getHits().getHits();
        // 进行对象转换并返回
        return Stream.of(hits)
                .map(e -> JSON.parseObject(e.getSourceAsString(), NbaPlayer.class))
                .collect(Collectors.toList());
    }

8.2.3 通过国家或者球队查询球员

  • controller层
    /**
     * 通过国家或者球队查询球员
     */
    @GetMapping("/searchTerm")
    public Result searchTerm(@RequestParam(value = "country", required = false) String country,
                             @RequestParam(value = "teamName", required = false) String teamName,
                             @RequestParam(value = "page", required = false, defaultValue = "0") Integer page,
                             @RequestParam(value = "limit", required = false, defaultValue = "10") Integer limit) {
        List<NbaPlayer> nbaPlayers = null;
        try {
            // 路由选择国家 或者 球队
            if (StringUtils.isNotBlank(country)) {
                nbaPlayers = nbaPlayerService.searchTerm("country", country, page, limit);
            } else {
                nbaPlayers = nbaPlayerService.searchTerm("teamName", teamName, page, limit);
            }
        } catch (IOException e) {
            log.error("searchTerm失败,参数[country={}]][teamName={}]]", country, teamName);
            e.printStackTrace();
        }
        return CollectionUtils.isNotEmpty(nbaPlayers) ? Result.success(nbaPlayers) : Result.success();
    }
  • service层
    /**
     * 通过国家或者球队查询球员
     */
    @Override
    public List<NbaPlayer> searchTerm(String key, String val, Integer page, Integer limit) throws IOException {
        // 获取 SearchRequest
        SearchRequest searchRequest = new SearchRequest(NBA_INDEX);
        // 创建 SearchSourceBuilder 用于查询语句
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        searchSourceBuilder
                // 查询 通过match查询 key 字段名称 val 字段值
                .query(QueryBuilders.termQuery(key, val))
                // 起始页
                .from(page)
                // 显示条数
                .size(limit);
        // 设置 请求源 理解为设置查询语句
        searchRequest.source(searchSourceBuilder);
        // 获取 SearchResponse 查询数据
        SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
        // 获取碰撞之后的结果 (固定写法)
        SearchHit[] hits = searchResponse.getHits().getHits();
        // 进行对象转换并返回
        return Stream.of(hits)
                .map(e -> JSON.parseObject(e.getSourceAsString(), NbaPlayer.class))
                .collect(Collectors.toList());
    }

8.2.4 通过姓名字母查找球员

  • controller层
    /**
     * 通过姓名字母查找球员
     */
    @GetMapping("/searchPrefix")
    public Result searchPrefix(@RequestParam(value = "prefix", required = false, defaultValue = "A") String prefix,
                               @RequestParam(value = "page", required = false, defaultValue = "0") Integer page,

                               @RequestParam(value = "limit", required = false, defaultValue = "10") Integer limit) {
        List<NbaPlayer> nbaPlayers = null;
        try {
            nbaPlayers = nbaPlayerService.searchPrefix(prefix, page, limit);
        } catch (IOException e) {
            log.error("searchPrefix失败,参数[prefix={}]]", prefix);
            e.printStackTrace();
        }
        return CollectionUtils.isNotEmpty(nbaPlayers) ? Result.success(nbaPlayers) : Result.success();
    }
  • service层
    /**
     * 通过姓名字母查找球员
     */
    @Override
    public List<NbaPlayer> searchPrefix(String prefix, Integer page, Integer limit) throws IOException {
        // 获取 SearchRequest
        SearchRequest searchRequest = new SearchRequest(NBA_INDEX);
        // 创建 SearchSourceBuilder 用于查询语句
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        searchSourceBuilder
                // 查询 通过prefix查询 displayNameEn.keyword 名字字段 prefix 前缀字母
                .query(QueryBuilders.prefixQuery("displayNameEn.keyword", prefix))
                // 起始页
                .from(page)
                // 显示条数
                .size(limit);
        // 设置 请求源 理解为设置查询语句
        searchRequest.source(searchSourceBuilder);
        // 获取 SearchResponse 查询数据
        SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
        // 获取碰撞之后的结果 (固定写法)
        SearchHit[] hits = searchResponse.getHits().getHits();
        // 进行对象转换并返回
        return Stream.of(hits)
                .map(e -> JSON.parseObject(e.getSourceAsString(), NbaPlayer.class))
                .collect(Collectors.toList());
    }

九、 走入高可用分布式集群

十、 深入挖掘ElasticSearch原理



About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK