Elastic Search 索引 API 介绍

前言

Elastic Search 主要靠 Restful api 来对索引进行操作。主要分为两类,一类是索引的管理类的 api ,包括索引的创建、修改、删除、查询等,文档的创建、修改、删除等。还有一类是查询类,包括各种条件的文档的检索。

这里我们准备了好了一个场景。在这里我们假定有一批作者,每个作者都有标识、姓名、性别、年龄,描述着几个字段。每个作者都会写一些列的文章,文章包括文章标识、标题、作者标识、内容、发表时间字段。我们需要通过姓名、年龄、描述中的关键词来查询作者,需要根据发表时间、标题关键词、内容关键词以及作者来查询文章。

这里分析一下。我们需要建两个索引,一个是作者索引,还有一个是文章索引。其中作者索引的描述字段和文章索引的标题、内容字段需要做分词。

以下所有操作都是在前文《Elastic Search 安装和配置》的基础上进行的。大部分的 rest api 的请求都是在 postman 这个工具里完成。

安装分词解析器

要按照关键词进行搜素,需要对对应的字段的值进行分词。针对中文,需要指定特殊的分词插件。这里我们用了 IK 分词插件。这个插件有针对 Elastic Search 的安装包。注意一定要安装对应版本的。前面安装的 Elastic Search 的版本时 6.1.1 所以用下面的命令来安装:

elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.1.1/elasticsearch-analysis-ik-6.1.1.zip

安装好了后,重启 Elastic Search,执行命令

curl http://10.110.2.53:9200/_cat/plugins
master analysis-ik 6.1.1

可以看到,IK 6.1.1的分词器已经安装好了

索引操作

创建索引

一个典型的索引创建的 rest api 接口的调用如下所示:

curl -X PUT -H 'Content-Type:application/json'  \
http://10.110.2.53:9200/author -d '
{
    "settings": {
        "index": {
            "number_of_shards": 6,
            "number_of_replicas": 0
        }
    },
    "mappings": {
        "person": {
            "properties": {
                "name": {
                    "type": "text"
                },
                "sex": {
                    "type": "text"
                },
                "age": {
                    "type": "integer"
                },
                "des": {
                    "type": "text",
                    "analyzer": "ik_max_word",
                    "search_analyzer": "ik_max_word"
                }
            }
        }
    }
}
'

这里包含两个部分,第一个部分是索引设置(Setting),第二个部分是索引映射(Mapping)

索引设置

索引设置通过 settings.index 用来设置索引的相关配置。例子中设置索引的分片数量(number_of_shards)为 6 个,副本的数量(number_of_replicas)为 0 。因为我们的实验环境是单节点的,所以不创建副本。否则因为无法把副本创建到第二个 node 上,会导致索引的健康状态为 yellow。

索引映射

索引映射( mapping)就是用来在创建索引的时候,指定索引中字段的配置。配置的内容包括

  • 字段是否可以被全文索引(分词)
  • 字段存储的数据类型
  • 字段显示的数据格式
  • 字段是否要放到 _all 这个内置的字段中。这个特性已经被在6.0版本被声明为不推荐使用了
明确索引映射

创建索引的时候,明确通过 mappings 参数来设置每个字段的映射就叫做明确索引映射。如上述的例子。

动态索引映射

除了在创建索引的时候指定索引字段的映射关系,还有一个简单的创建索引的方式是不指定索引字段的映射,Elastic Search 将会为索引采用动态映射(dynamic mapping)方式在第一次索引这个字段的时候自动推动自动的存储类型、存储格式等。

例如我们可以用一下方法创建一个作者(author)的索引

curl -X PUT http://10.110.2.53:9200/author

这个里面我们没有为这个索引设置任何映射信息。当我们用下面的信息为这个索引创建第一个文档的时候,会自动的将 name、sex、des 映射为 text 类型,而将 age 映射为 long 。

 {
    "name":"杨高超",
    "age":24,
    "sex":"男",
    "des":"IT软件工程师,擅长Java和软件架构"
 }

除了创建索引,还有修改索引、查询索引、删除索引等操作 api。更多、更详细的索引操作 api 的用法可以参考官网文档

文档查询

通过下面的命令查询 author 索引的详细信息如下:

curl http://10.110.2.53:9200/author?pretty
{
  "author" : {
    "aliases" : { },
    "mappings" : {
      "doc" : {
        "properties" : {
          "age" : {
            "type" : "text",
            "fields" : {
              "keyword" : {
                "type" : "keyword",
                "ignore_above" : 256
              }
            }
          },
          "des" : {
            "type" : "text",
            "analyzer" : "ik_max_word"
          },
          "name" : {
            "type" : "text"
          },
          "age" : {
            "type" : "integer"
          },
          "sex" : {
            "type" : "text"
          }
        }
      }
    },
    "settings" : {
      "index" : {
        "creation_date" : "1515160270198",
        "number_of_shards" : "6",
        "number_of_replicas" : "0",
        "uuid" : "v1E0_mfAR5qRIroOV31HOA",
        "version" : {
          "created" : "6010199"
        },
        "provided_name" : "author"
      }
    }
  }
}

文档索引

下面的命令将一个作者文档索引到作者索引中

curl  -H 'Content-Type:application/json' http://10.110.2.53:9200/author -d '
{
    "name": "李高超",
    "age": 23,
    "sex": "女",
    "des": "IT软件经理,擅长Java和开发管理"
}
'

最后索引到作者 (author) 索引和文章(article)索引的数据列表如下

作者索引文档数据
文章索引文档数据

文档查询

全文索引

curl -X GET 'http://10.110.2.53:9200/article/_search?q=docker搭建gitlab&pretty'
{
  "took" : 5,
  "timed_out" : false,
  "_shards" : {
    "total" : 6,
    "successful" : 6,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : 1,
    "max_score" : 1.3862944,
    "hits" : [
      {
        "_index" : "article",
        "_type" : "doc",
        "_id" : "rKOjxmABQGn3FeQBeqAg",
        "_score" : 1.3862944,
        "_source" : {
          "title" : "通过 docker 搭建自用的 gitlab 服务",
          "author" : "qaOXxmABQGn3FeQBMqCA",
          "created" : "2018-01-01 15:11:11",
          "context" : "git 是当下如日中天的版本管理系统。现在如果不是工作在 git 版本管理系统之下,几乎都不好意思和人打招呼了。有很多现成的互联网的 git 服务提供给大家使用,例如号称程序员社交网络的 GitHub,还有低调好用的 bitbucket 。这些给个人使用或者公司用来做开源使用都没有什么问题。但如果在部门内推广使用就会涉及到代码不能公开或者额外的费用的问题。本人原来在部门内采用的是手工在 linux 服务器上来管理代码仓库。权限没法设置,也非常不方便。所以也一直很苦恼。"
        }
      }
    ]
  }
}

复杂查询

curl -X POST -H 'Content-Type:application/json' http://10.110.2.53:9200/author/_search?pretty -d '
{
  "took" : 5,
  "timed_out" : false,
  "_shards" : {
    "total" : 6,
    "successful" : 6,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : 2,
    "max_score" : 0.2876821,
    "hits" : [
      {
        "_index" : "author",
        "_type" : "doc",
        "_id" : "qaOXxmABQGn3FeQBMqCA",
        "_score" : 0.2876821,
        "_source" : {
          "name" : "杨高超",
          "age" : "24",
          "sex" : "男",
          "des" : "IT软件工程师,擅长Java和软件架构"
        }
      },
      {
        "_index" : "author",
        "_type" : "doc",
        "_id" : "qqOXxmABQGn3FeQBiKCD",
        "_score" : 0.2876821,
        "_source" : {
          "name" : "李高超",
          "age" : "23",
          "sex" : "女",
          "des" : "IT软件经理,擅长Java和开发管理"
        }
      }
    ]
  }
}

带布尔计算的查询

curl -X POST -H 'Content-Type:application/json' http://10.110.2.53:9200/author/_search?pretty -d '
{
    "query": {
        "bool": {
            "must": [
                {
                    "match": {
                        "des": "经理"
                    }
                },
                {
                    "match": {
                        "name": "高超"
                    }
                }
            ]
        }
    }
}
'

这个查询得到 name 包含“高超”, des 包含“经理”的作者

更多、更详细的查询用法可以参考官网文档。大家可以基于我们的样例和文档说明执行更多的查询。

后记

对于 Elastic Search 的 Api 的详细用法可以多参考官网的说明。实际上我们在程序中使用。都是使用高级 Api 来操作。后续我们在用别的文章来说明。

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

推荐阅读更多精彩内容