elasticsearch index - yaokun123/php-wiki GitHub Wiki

es的文档、类型和索引

在介绍索引之前,先介绍几个名词。理解他们将有助于你理解索引

一、名词介绍

索引

_index,文档存储的地方,类似于关系型数据中的数据库。

事实上,数据被存储和索引在分片中,索引仅仅是一个把一个或者多个分片分组在一起的逻辑空间。

索引名字必须是全部小写,不允许以下划线开头,不能包含逗号。

类型

_type,对应于关系型数据库中的表。(这个描述其实是不准确的,这里只是为了方便理解,具体区别请移步百度搜索)

每个类型type都有自己的映射或者结构定义,就像传统数据库表中的列一样。类型的映射会告诉ElasticSearch文档如何被索引。 

_type的名字可以是大写或者小写,不能包含下划线或者逗号。

映射

映射是指数据在每个字段中的解释说明。
映射机制用于进行字段类型确认,将每个字段匹配为一种确定的数据类型(string,number,boolean,date等)。 
_mapping参数指令用于参数某index下某type的映射情况。
不同类型的字段的索引方式是不同的,因此会导致查询结果不同。
ElasticSearch中的数据大致分为两类:确切值,全文文本。这也是ES区别于别的数据库的根本差异。
映射的重要参数:
type:即指定字段的类型;
index:控制字符串以何种方式被索引;analyzed表示全文文本形式,not_analyzed表示确切值形式 ,no表示不索引(即不能被搜索到)。string类型字段的默认值是analyzed。
analyzer:指定分析器(譬如whitespace,simple,english)。

文档

档id是一个字符串,与_index和_type组合时,就可以在ElasticSearch中唯一标识一个文档。创建文档时,可以自定义_id,也可以让ES帮助自动生成。

二、索引管理

1、创建索引

PUT http://localhost:9200/shuidi/
{
  "settings": {
    "number_of_shards": 5,
    "number_of_replicas": 1
  },
  "mappings": {
    "company": {
      "properties": {
        "companyName": {
          "type": "text",
          "analyzer": "ik_max_word"
        },
        "companyNameStr": {
          "type": "keyword"
        },
        "companyNameDigest": {
          "type": "keyword"
        },
        "province": {
          "type": "keyword"
        },
        "establishDate": {
          "type": "keyword"
        },
        "companyType": {
          "type": "keyword"
        },
        "legalPerson": {
          "type": "keyword"
        },
        "capital": {
          "type": "keyword"
        },
        "companyCode": {
          "type": "keyword"
        },
        "creditNo": {
          "type": "keyword"
        },
        "authority": {
          "type": "keyword"
        },
        "companyStatus": {
          "type": "keyword"
        },
        "capitalNumber": {
          "type": "long"
        },
        "establishDuration": {
          "type": "integer"
        },
        "subdivideIndustry": {
          "type": "keyword"
        },
        "companyDesc": {
          "type": "text",
          "analyzer": "ik_max_word"
        },
        "queryTimes": {
          "type": "long"
        },
        "prefectureCity": {
          "type": "keyword"
        },
        "scoreSort": {
          "type": "long"
        },
        "isClaimed": {
          "type": "keyword"
        },
        "vipLevel": {
          "type": "integer"
        }
      }
    }
  }
}


mapping增加字段

PUT /test_index/_mapping/test_type
{
  "properties": {
    "proRemark": {
      "type": "string",
      "index": "not_analyzed"
    }
  }
}

2、root object

就是某个type对应的mapping json,包括properties,matadata(_id,_source,_type),setting(analyzer),其他setting

1、properties

2、_source
好处:
--查询的时候,直接可以拿到完整的document,不需要先拿document id,再发送一次请求拿document;
--partial update基于_source实现;
--reindex时,直接基于_source实现,不需要从数据库(或者其他外部存储)查询数据再修改;
--可以基于_source定制返回field
--debug query更容易,因为可以直接看到_source
如果不需要上述好处,可以禁用_source
{
    "mappings":{
        "my_type":{
            "_source":{
                "enable":false
            }
        }
    }
}

3、_all
将所有field打包在一起,作为一个_all field,建立索引。没有指定任何field进行搜索时,就是使用_all field在搜索。
如果不需要可以禁用
{
    "mappings":{
        "my_type":{
            "_all":{
                "enable":false
            }
        }
    }
}
也可以在field级别设置include_in_all filed,设置是否要将field的值包含在_all field中
{
    "my_field":{
        "include_in_all":false
    }
}

3、定制dynamic策略

true:遇到陌生字段,就进行dynamic mapping
false:遇到陌生字段,就忽略
strict:遇到陌生字段,就报错\

{
    "mappings":{
        "my_type":{
            "dynamic":"strict",//遇到陌生字段,就报错
            "properties:{...}
        }
    }
}

4、重建索引

一个field的设置是不能被修改的,如果要修改一个field,那么应该重新按照新的mapping,建立一个index,然后将数据批量查询出来。重新用bulk api写入index中。

批量查询的时候,建议采用scroll api,并且采用多线程并发的方式来reindex数据,每次scroll就查询指定日期的一段数据,交给一个线程即可

三、数据相关操作

数据相关的操作有:

索引一个文档;PUT。
检索文档,检索文档的一部分;GET,以及_source参数。
检索文档是否存在;HEAD(返回200或者404)。
更新整个文档;PUT。
创建新的文档;POST(冲突时返回409)。
删除文档;DELETE(返回200或者404)。
文档局部更新;POST,以及_update参数。
检索多个文档;_mget参数指令,docs数组参数
批量更新;_bulk参数指令,可以包含create,index,update,delete动作。