ElasticSearch-1 ES基础概念及命令操作

ElasticSearch-1 ES基础概念及命令操作

ElasticSearch-2 ES6 TransportClient + SpringBoot2 增删改查

ElasticSearch-3 ES6 TransportClient 实现全文检索

ElasticSearch-4 ES7.6.3 RestHighLevelClient + SpringBoot2 增删改查

ElasticSearch-5 ES7.6.3 RestHighLevelClient 实现仿京东搜索


基础概念


ElasticSearch是面向文档的数据库,ES里一切都是JSON!

  • index:是ES的顶层管理单位,相当于一个数据库。查看所有索引的命令:GET 'http://localhost:9200/_cat/indices'

  • type:字段类型:index里的虚拟的逻辑分组,类似于一个表用来过滤 Document(ES7.0被去掉)。

  • document: Index 里面单条的JSON格式记录称为 Document(文档),许多条 Document 构成了一个 Index。

  • 分片:每个索引都有多个分片,每个分片是一个Lucene索引,所以每一个ES索引由多个Lucene索引组成

  • 备份:复制一个分片就完成了分片的备份

  • 倒排索引:Lucene索引采用倒排索引

    倒排索引

基础操作


restFull风格增删改查
  • put创建索引
put /test0
{
  "acknowledged" : true,
  "shards_acknowledged" : true,
  "index" : "test0"
}
  • 创建索引时指定mappingssettings
PUT  /test1
{
    "settings": {
        "number_of_shards": 3,
        "number_of_replicas": 1
    },
    "mappings": {
        "man": {
            "properties": {
                "name": {
                    "type":"text"
                },
                "country": {
                    "type":"keyword"
                },
                "age": {
                    "type":"integer"
                },
                "date": {
                    "type": "date",
                    "format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
                }
            }
        },
        "worman": {}
    }
}
  • put创建索引、文档

put可以只创建索引,也可以索引文档一起创建
post不可以只创建索引,但可以索引文档一起创建

put /test/_doc/1
{
  "name":"瓦力",
   "age":18
}
{
  "_index" : "test",
  "_type" : "_doc",
  "_id" : "1",
  "_version" : 1,
  "result" : "created",
  "_shards" : {
    "total" : 2,
    "successful" : 1,
    "failed" : 0
  },
  "_seq_no" : 0,
  "_primary_term" : 20
}
  • post 创建索引、文档(post可以不指定id,让其自动生成)
post /test3/_doc/
{
  "name":"卧矣",
   "age":18
}
{
  "_index" : "test",
  "_type" : "_doc",
  "_id" : "-kq5bXEBSZdLg0qiZcmg",
  "_version" : 1,
  "result" : "created",
  "_shards" : {
    "total" : 2,
    "successful" : 1,
    "failed" : 0
  },
  "_seq_no" : 0,
  "_primary_term" : 20
}
  • post 修改文档

post修改是修改指定字段,put修改是用给与的字段覆盖原有文档

post /test/_update/1
{
  "doc":{
      "name":"瓦力",
   "age":18,
   "hobby":"卧矣"
  }
}
{
  "_index" : "test",
  "_type" : "_doc",
  "_id" : "1",
  "_version" : 2,
  "result" : "noop",
  "_shards" : {
    "total" : 0,
    "successful" : 0,
    "failed" : 0
  },
  "_seq_no" : 1,
  "_primary_term" : 20
}
  • get 查看索引和文档

创建缩影的时候如果不显示设置aliasesmappingssettings,系统会自动设置

get /test
{
  "test" : {
    "aliases" : { },
    "mappings" : {
      "properties" : {
        "age" : {
          "type" : "long"
        },
        "hobby" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        },
        "name" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        }
      }
    },
    "settings" : {
      "index" : {
        "creation_date" : "1586665691321",
        "number_of_shards" : "5",
        "number_of_replicas" : "1",
        "uuid" : "YHxWx3pIQrC5lIP9_FcHoQ",
        "version" : {
          "created" : "7060299"
        },
        "provided_name" : "test"
      }
    }
  }
}
get /test/_doc/1
{
  "_index" : "test",
  "_type" : "_doc",
  "_id" : "1",
  "_version" : 1,
  "_seq_no" : 0,
  "_primary_term" : 1,
  "found" : true,
  "_source" : {
    "name" : "瓦力",
    "age" : 18
  }
}
  • delete 删除文档和索引
delete /test/_doc/1
> 类型不可执行删除操作
{
  "_index" : "test",
  "_type" : "_doc",
  "_id" : "1",
  "_version" : 3,
  "result" : "deleted",
  "_shards" : {
    "total" : 2,
    "successful" : 1,
    "failed" : 0
  },
  "_seq_no" : 2,
  "_primary_term" : 20
}
delete /test
{
  "acknowledged" : true
}

高级查询


1、子条件查询:特定字段查询所指特定值

  • Query context:ES会计算一个_score来表示匹配的程度,旨在判断目标文档和查询条件匹配的有多好
  • 全文本查询:针对文本类型数据的查询,包含模糊匹配、短语匹配、多字段匹配、语法查询
  • match :模糊查询,会经过分词器解析
  • term :精确查找,通过倒排索引指定的词条进行精确查找
  • _score :匹配度
  • _source:文档的字段
  • 创建测试数据
PUT /es/_create/1
{
  "name":"瓦力在雨中",
  "age":18,
  "desc":"一顿操作猛如虎",
  "tags":["暖男","执着","善良"]
}


PUT /es/_create/2
{
  "name":"瓦力在太空",
  "age":19,
  "desc":"一看工资两千五",
  "tags":["可爱","好色","疯狂"]
}

PUT /es/_create/3
{
  "name":"伊娃",
  "age":18,
  "desc":"一看工资两千五",
  "tags":["善良","可爱","美丽"]
}

PUT /es/_create/4
{
  "name":"伊娃",
  "age":16,
  "desc":"白富美",
  "tags":["白富美","女神","大长腿"]
}
  • 模糊查询,并过滤输出信息的字段
get /es/_search
{
  "query":{
    "match": {
      "name": "瓦力"
    }
  },
  "_source": ["name","tags"]
}
{
  "took" : 1,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 2,
      "relation" : "eq"
    },
    "max_score" : 0.95466316,
    "hits" : [
      {
        "_index" : "es",
        "_type" : "user",
        "_id" : "1",
        "_score" : 0.95466316,
        "_source" : {
          "name" : "瓦力在雨中",
          "tags" : [
            "暖男",
            "执着",
            "善良"
          ]
        }
      },
      {
        "_index" : "es",
        "_type" : "user",
        "_id" : "2",
        "_score" : 0.95466316,
        "_source" : {
          "name" : "瓦力在太空",
          "tags" : [
            "可爱",
            "好色",
            "疯狂"
          ]
        }
      }
    ]
  }
}
  • 根据指定字段进行排序并进行分页显示
get /es/_search
{
  "query":{
    "match": {
      "name": "瓦力"
    }
  },
  "sort": [
    {
      "age":{
        "order":"asc"
      }
    }
  ],
  "from":0,
  "size":1
}
{
  "took" : 1,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 2,
      "relation" : "eq"
    },
    "max_score" : null,
    "hits" : [
      {
        "_index" : "es",
        "_type" : "user",
        "_id" : "1",
        "_score" : null,
        "_source" : {
          "name" : "瓦力在雨中",
          "age" : 18,
          "desc" : "一顿操作猛如虎",
          "tags" : [
            "暖男",
            "执着",
            "善良"
          ]
        },
        "sort" : [
          18
        ]
      }
    ]
  }
}
  • 多条件查询,类似mysql的and
get /es/_search
{
  "query":{
    "bool":{
      "must":[
        {
          "match":{
            "name":"瓦力"
          }
        },
        {
          "match":{
          "age":18
          }
        }
      ]
    }
  }
}
{
  "took" : 6,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 1,
      "relation" : "eq"
    },
    "max_score" : 2.1794991,
    "hits" : [
      {
        "_index" : "es",
        "_type" : "user",
        "_id" : "1",
        "_score" : 2.1794991,
        "_source" : {
          "name" : "瓦力在雨中",
          "age" : 18,
          "desc" : "一顿操作猛如虎",
          "tags" : [
            "暖男",
            "执着",
            "善良"
          ]
        }
      }
    ]
  }
}
  • 多条件查询,类似mysql的 !=
    只需要将上面的must改为must_not

  • 多条件查询,类似mysql的or
    只需要将上面的must改为should即可

  • 过滤器:过滤年龄段

gt>
gte>=
lt<
lte<=

get /es/_search
{
  "query":{
    "bool":{
      "must":[
        {
          "match":{
            "name":"瓦力"
          }
        }
      ],
      "filter": {
        "range": {
          "age": {
            "gte": 10,
            "lte": 20
          }
        }
      }
    }
  }
}
  • 匹配多个条件

tags里包男和善良的文档都会被查询出来,多个匹配关键字之间用空格隔开

get /es/_search
{
  "query":{
    "match":{
    "tags": "男 善良"
    }
  }
}
  • 精确查询
    经过分词器
    不经过分词器

  • 精确查询多个值

get /es/_search
{
  "query":{
    "bool":{
      "should":[
        {
          "term":{
            "age":"19"
          }
        },{
          "term":{
            "age":16
          }
        }
      ]
    }
  }
}
  • 高亮查询

会在查询出来信息的字段上加上<em>标签

get /es/_search
{
  "query":{
    "match": {
      "name": "伊娃"
    }
  },
  "highlight":{
    "pre_tags":"<p class='key' style='color:red'>",
    "post_tags": "</>", 
    "fields": {
      "name":{}
    }
  }
}
  • 其他
127.0.0.1:9200/book/_search
{
    "query": {
        "match":{
            "author":"金庸"
        }
    }
}

习语/短语匹配:关键词match_phrase

127.0.0.1:9200/book/_search
{
    "query": {
        "match_phrase":{
            "author":"java入门"
        }
    }
}

多字段匹配:关键词multi_match

127.0.0.1:9200/book/_search
{
    "query": {
        "multi_match":{
            "author":"金庸",
            "fields":["auth","title"]
        }
    }
}

语法匹配:关键词query_string

127.0.0.1:9200/book/_search
{
    "query": {
        "query_string":{
            "query":"(java AND good) OR Python",
                "fields": ["title", "author"]

        }
    }
}
  • 字段级别查询:针对结构化数据,如数字,日期等
    语法匹配:关键词term
127.0.0.1:9200/book/_search
{
    "query": {
        "term":{
            "author":"古龙"
        }
    }
}
  • 字段级别的范围查询
127.0.0.1:9200/book/_search
{
    "query": {
        "range":{
            "word_count": {
                       "gte": 1000,
                       "lte": 2000
                 }
        }
    }
}

2、Filter context ,只判断是否满足条件,只有yes或no; 会对结果进行缓存,速度较快

127.0.0.1:9200/book/_search
{
    "query": {
        "bool":{
            "filter": {
               "term": {
                       "word_count": 1000
               }
           }
        }
    }
}
  • 二、复合条件查询:以一定的逻辑组合子条件查询

索引


1 、索引名规范

  • 仅限小写字母
  • 不能超过255个字节(注意它是字节,因此多字节字符将计入255个限制)

2、索引的种类

  • 非结构化索引
    mappings为空就是非结构话索引
  • 结构化索引
    mappings:{}不为空的索引

3、索引配置

PUT blog
{
    "settings" : {
        "index" : {
            "number_of_shards" : 2,
            "number_of_replicas" : 2
        }
    }
}

PUT blog
{
    "settings" : {
        "number_of_shards" : 2,
        "number_of_replicas" : 2
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,716评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,558评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,431评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,127评论 0 209
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,511评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,692评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,915评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,664评论 0 202
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,412评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,616评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,105评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,424评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,098评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,096评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,869评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,748评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,641评论 2 271

推荐阅读更多精彩内容