安装部署过程网上有很多教程,在此不累赘
Elasticsearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java语言开发的,并作为Apache许可条款下的开放源码发布,是一种流行的企业级搜索引擎。Elasticsearch用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。官方客户端在Java、.NET(C#)、PHP、Python、Apache Groovy、Ruby和许多其他语言中都是可用的。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr,也是基于Lucene。(百度百科)
ES的顶层的单位,相当于关系型数据库中的Database
注:在7.X版本中将Type类型进行了移除,不再推荐使用
在ES中,可以针对Document进行分组,而这个分组讲的就是Type,它是虚拟的逻辑分组,用来过滤 Document,类似关系型数据库中的数据表(仅仅是类似,性质不同,后边有讲到)。
不同的 Type 应该有相似的结构(Schema),性质完全不同的数据(比如 products 和 logs)应该存成两个 Index,而不是一个 Index 里面的两个 Type(虽然可以做到)。
ES是基于Lucene开发的搜索引擎,最终在Lucene中不同Type下的Filed的处理是一样的,即不同Type下相同名称的Filed是同一个的。不同Type中的相同字段名称就会在处理中出现冲突的情况,导致Lucene处理效率下降。但是在很多情况下,不同Type下难免会出现不同映射关系的Filed,在ES是不允许出现的,
Index(索引)中的单条数据称为Document(文档),相当于关系型数据库中表的单条数据,Document使用JSON进行表示。
Document(文档)中的字段,每个Document包含了很多个Filed(字段),每个字段都有对应的值,多个字段组合成为了Document,相当于关系型数据库表的字段。
在平常的使用中最多的可能是正向索引,即通过key去查找value,而倒排索引则是通过value查找key。假如有以下的数据。
ID | 名称 | 描述 |
---|---|---|
1 | 华为 | 硬件、强国、通信、手机、中国 |
2 | 三星 | 硬件,手机、通信、韩国 |
3 | 苹果 | 手机、美国 |
正向索引就是我们通过ID为1的key我们可查到名称为华为,描述为硬件、强国、通信、手机、中国的一条信息。
倒排索引则另外维护了一个表,如下
描述 | ID |
---|---|
硬件 | 1、2 |
强国 | 1 |
通信 | 1、2 |
手机 | 1、2、3 |
中国 | 1 |
韩国 | 2 |
美国 | 3 |
当我们需要查询中国这个关键字的时候,就会锁定到上表的一条记录上,发现只有ID为1的数据存在中国这个关键字,我们只需要通过ID = 1进行查询就可以了,避免了直接通过模糊匹配在表1描述属性进行全文遍历,大大提升了索引的效率。
个人感觉ES的restful操作风格不是很规范[狗头]
method | 地址 | 描述 |
---|---|---|
PUT | host:9200/索引名称/类型名称/文档ID | 创建文档(指定文档ID) |
POST | host:9200/索引名称/类型名称/ | 创建文档(随机文档ID) |
POST | host:9200/索引名称/类型名称/文档ID/_update | 修改文档 |
DELETE | host:9200/索引名称/类型名称/文档ID/ | 删除文档 |
GET | host:9200/索引名称/类型名称/文档ID/ | 查找文档(指定ID) |
POST | host:9200/索引名称/类型名称/_search/ | 查找所有文档 |
POST /test_index_2/_doc/
{
"name": "zhangsan",
"age": 18
}
PUT /test_index/test_type/1
{
"name": "zhangsan",
"age": 11
}
注意:更新时必须指定所有字段,否则其他非更新字段也会被更新
PUT /test_index/test_type/1
{
"name": "zhangsan",
"age": 111
}
注意:不插入数据,只建立索引结构,如指定字段类型(mapping)
PUT /test_index_3
{
"mappings": {
"properties": {
"name": {
"type": "text"
},
"age": {
"type": "integer"
},
"birthday": {
"type": "date"
}
}
}
}
注意:此方式不需要指定所有字段,只需要指定修改的字段即可,推荐使用
POST /test_index/test_type/1/_update
{
"doc": {
"name": "zhangsan_update"
}
}
DELETE /test_index/test_type/1
GET /test_index/test_type/1
POST /test_index/test_type/_search
GET /student/_search
{
"query": {
"match": {
"name": "王子"
}
}
}
GET /student/_search
{
"query": {
"match_all": {}
}
}
GET /student/_search
{
"query": {
"match_phrase": {
"name": "王子"
}
}
}
GET /student/_search
{
"query": {
"multi_match": {
"query": "王",
"fields": ["name"]
}
}
}
GET /student/_search
{
"query": {
"match_all": {}
},
"sort": [
{
"age": {
"order": "desc"
}
}
]
}
GET /student/_search
{
"query": {
"match_all": {}
},
"from": 0,
"size": 2
}
GET /student/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"age": 15
}
},
{
"match": {
"name": "张三"
}
}
]
}
}
}
GET /student/_search
{
"query": {
"bool": {
"should": [
{
"match": {
"age": 15
}
},
{
"match": {
"name": "李四"
}
}
]
}
}
}
GET /student/_search
{
"query": {
"bool": {
"must_not": [
{
"match": {
"age": 15
}
}
]
}
}
}
GET /student/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"name": "张三"
}
}
],
"filter": {
"range": {
"age": {
"gt": 10
}
}
}
}
}
}
不知道分词器的存在,不会对filed进行分词操作,直接使用倒排索引精确匹配
# 分词器首先会将张三分为 “张” 和 “三” ,然后查询包含张和三的
GET student/_search
{
"query": {
"match": {
"name": "张三"
}
}
}
# 不会对张三进行分词,直接采用倒排索引查询“张三”, 虽然存在张三这个数据,但是在存储的过程中并没有张三这个最终分词,所以查询为空
GET student/_search
{
"query": {
"term": {
"name": "张三"
}
}
}
GET student/_search
{
"query": {
"match": {
"name": "张三"
}
},
"highlight": {
"pre_tags": "",
"post_tags": "",
"fields": {
"name": {}
}
}
}