Elastic Search 索引 API 介绍

1,449 阅读6分钟

前言

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 来操作。后续我们在用别的文章来说明。