Elastic Search 索引 API 介绍

前言

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

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

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

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

安装分词解析器

要按照关键词进行搜素,须要对对应的字段的值进行分词。针对中文,须要指定特殊的分词插件。这里咱们用了 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,执行命令github

curl http://10.110.2.53:9200/_cat/plugins
master analysis-ik 6.1.1
复制代码

能够看到,IK 6.1.1的分词器已经安装好了docker

索引操做

建立索引

一个典型的索引建立的 rest api 接口的调用以下所示:json

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)api

索引设置

索引设置经过 settings.index 用来设置索引的相关配置。例子中设置索引的分片数量(number_of_shards)为 6 个,副本的数量(number_of_replicas)为 0 。由于咱们的实验环境是单节点的,因此不建立副本。不然由于没法把副本建立到第二个 node 上,会致使索引的健康状态为 yellow。bash

索引映射

索引映射( 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 来操做。后续咱们在用别的文章来讲明。

相关文章
相关标签/搜索