ElasticSearch基本概念与基本语法

41次阅读

共计 6660 个字符,预计需要花费 17 分钟才能阅读完成。

一、基本概念

1、Cluster(集群)

es 集群对外提供索引和搜寻的服务,其蕴含一个或者多个节点,每个节点都有对立的集群名称。参考本地集群搭建。

2、Node(节点)

独自一个 Elasticsearch 服务器实例称为一个 node,node 是集群的一部分,每个 node 有独立的名称,默认是启动时获取一个 UUID 作为名称,也能够自行配置。

3、Shard(分片)

Shard 分片也称为 primary shard,是单个 Lucene 索引,因为单台机器的存储容量是无限的,而 Elasticsearch 索引的数据可能特地大,单台机器无奈存储全副数据,就须要将索引中的数据切分为多个 shard,散布在多台服务器上存储。利用 shard 能够很好地进行横向扩大,存储更多数据,让搜寻和剖析等操作散布到多台服务器下来执行,晋升集群整体的吞吐量和性能。创立索引时就应该预估好须要的分片数量,一旦创立则分片数量无奈更改。

4、Replica(复制分片)

replica 全称叫 replica shard,是索引的正本,齐全拷贝 shard 的内容,shard 与 replica 的关系能够是一对多,同一个 shard 能够有一个或多个 replica。当集群中有节点宕机了,失落的 shard 会由 replica 补位,保证数据高可用;replica shard 也能分担查问申请,晋升集群的吞吐量。

5、Index(索引)

es 索引,其保留具备雷同构造的文档汇合,相似于关系型数据库的数据库实例(6.0.0 版本 type 废除后,索引的概念降落到等同于数据库表的级别)。一个集群里能够定义多个索引

6、Type(类型)

类型,本来是在索引 (Index) 内进行的逻辑细分,但起初发现企业研发为了加强可浏览性和可维护性,制订的标准束缚,同一个索引下很少还会再应用 type 进行逻辑拆分(如同一个索引下既有订单数据,又有评论数据),因此在 6.0.0 版本之后,此定义废除。

7、Document(文档)

Elasticsearch 最小的数据存储单元,JSON 数据格式,相似于关系型数据库的表记录(一行数据),构造定义多样化,同一个索引下的 document,构造尽可能雷同。

8、Field type(字段类型)

  • text:被剖析索引的字符串类型
  • keyword:不能被剖析,只能被准确匹配的字符串类型
  • date:日期类型,能够配合 format 一起应用
  • long:长整型,数字类型
  • integer:整型,数字类型
  • short:短整型,数字类型
  • double:双精度浮点型,数字类型
  • Boolean:布尔型,true、false
  • array:数组类型
  • object:对象类型,json 嵌套
  • ip:ip 类型
  • geo_point:地理位置类型

9、分词器

ElasticSearch 借助各种类型的分词器来对文档内容进行分词解决,以便于创立倒排索引,这是搜寻的外围。同时也对搜寻内容进行分词解决,用以在倒排索引中索引文档。

1、内置分词器

规范分词器(standard analyzer)(默认)
  • 剖析过程:字符过滤器 -> 字符解决 -> 分词过滤(分词转换)

阐明:首先是字符过滤器过滤掉特殊符号以及量词(the、an、a 等),进一步将分词小写解决,

英文分词器(english analyzer)
  • 剖析过程:字符过滤器 -> 字符解决 -> 分词过滤(分词转换,词干转化)

阐明:首先是字符过滤器过滤掉特殊符号以及量词(the、an、a 等),进一步将分词小写解决,再次进行分词转换,例如:eating -> eat,其实它们两是一回事。

简略分词器(simple analyzer)

先依照空格分词,英文大写转小写。

空格分词器(whitespace analyzer)

先依照空格分词,英文不做大小写解决。

2、内部分词器

中文分词器(ik_maxword)

会将文本做最细粒度的拆分;尽可能多的拆分出词语,例如:如南京市长江大桥 –> 南京市 / 南京 / 市长 / 长江大桥 / 长江 / 大桥

中文分词器(ik_smart)

会做最粗粒度的拆分;已被分出的词语将不会再次被其它词语占有,如南京市长江大桥 –> 南京市 / 长江大桥

二、根本语法

1、筹备数据

抱着学习的目标,首先须要 ElasticSearch 的环境,有了环境当前,咱们还须要初始化一批数据,咱们能够借助 TMDB(the movie database)数据源来不便咱们练习根本语法。

  • 参考本地 ElasticSearch 集群搭建
  • TMDB(the movie database)数据源下载

2、创立索引

  • 非结构化形式创立索引
PUT /employee
{
  "settings": {
    "number_of_shards": 1,
    "number_of_replicas": 1
  }
}
  • 结构化形式创立索引
PUT /movie
{
  "settings": {
    "number_of_shards": 1,
    "number_of_replicas": 1
  },
  "mappings": {
    "properties": {"title":{"type": "text","analyzer": "english"},
      "tagline":{"type": "text","analyzer": "english"},
      "release_date":{"type": "date","format": "8yyyy/MM/dd||yyyy/M/dd||yyyy/MM/d||yyyy/M/d"},
      "popularity":{"type": "double"},
      "overview":{"type": "text","analyzer": "english"},
      "cast":{
        "type": "object",
        "properties": {"character":{"type":"text","analyzer":"standard"},
          "name":{"type":"text","analyzer":"standard"}
        }
      }
    }
  }
}

阐明:以上指定了个别字段应用英文分词器,日期类型指定了 format,能够反对解析多种类型的日期字符串格局。

3、删除索引

  • 删除索引
DELETE /employee

4、新增文档

  • 强制指定创立,若已存在,则失败
POST /employee/_create/1
{
  "name":"关二爷",
  "age":31
}
  • (不存在)新增或者(存在)更新文档
PUT /employee/_doc/1
{
  "name":"jayway1",
  "age":30
}

阐明:如果文档不存在,则会插入文档,如果文档已存在,则会笼罩原文档。

5、批改文档

  • 指定更新字段更新文档
POST /employee/_update/1
{
  "doc": {"name":"jayway2"}
}

阐明:指定字段更新就只会更新指定的字段,不会去笼罩原文档。

5、删除文档

  • 删除指定文档
DELETE /employee/_doc/1

6、简略查问文档

  • 查问指定文档
GET /employee/_doc/2
  • 查问多条文档
GET /employee/_search
  • 不带条件查问所有记录
GET /employee/_search
{
  "query": {"match_all": {}
  }
}
  • 分页查问
GET /employee/_search
{
  "query": {"match_all": {}
  },
  "from": 0,
  "size": 20
}
  • 带关键字的条件查问
GET /employee/_search
{
  "query": {
    "match": {"name": "关羽"}
  }
}
  • 带关键字的条件查问,并排序
GET /employee/_search
{
  "query": {
    "match": {"name": "关"}
  },
  "sort": [
    {
      "age": {"order": "desc"}
    }
  ]
}

阐明:自主排序后,分数就没有意义了,分数值为 null

  • 指定操作符查问
# 分词后的 and 和 or 的逻辑,match 默认应用的是 or
GET /movie/_search
{
  "query": {
    "match": {"title": "basketball with cartoom aliens"}
  }
}

GET /movie/_search
{
  "query": {
    "match": {
      "title": {
        "query": "basketball with cartoom aliens",
        "operator": "and"
      }
    }
  }
}
  • 指定最小词匹配项查问
# 最小词匹配项(最小匹配两个词)GET /movie/_search
{
  "query": {
    "match": {
      "title": {
        "query": "basketball love aliens",
        "operator": "or",
        "minimum_should_match": 2
      }
    }
  }
}
  • 短语查问
# 短语查问, 将查问内容视作一个短语,不做分词
GET /movie/_search
{
  "query": {
    "match_phrase": {"title": "steve zissou"}
  }
}
  • 多字段查问
GET /movie/_search
{
  "query": {
    "multi_match": {
      "query": "basketball with cartoom aliens",
      "fields": ["title","overview"]
    }
  }
}

阐明:待查问内容分词别离匹配各个字段,每个字段都有一个评分,取最大的评分。

  • 优化多字段查问
# 咱们认为 title 字段比拟重要,人为地去干预评分的权重,#如下的含意是:评分放大系数(boost,默认 2.2)放大十倍
#tie_breaker: 将除最大评分字段以外的其它字段得分乘以此系数累加到最大评分中取得最终得分;综合思考多个字段得分,而不是一刀切
GET /movie/_search
{
  "explain": true,
  "query": {
    "multi_match": {
      "query": "basketball with cartoom aliens",
      "fields": ["title^10","overview"],
      "tie_breaker": 0.3
    }
  }
}
  • 指定查问类型的查问
#best_fields(最匹配模式): 默认的得分形式,获得最高的分数作为对应文档的对应分数
GET /movie/_search
{
  "query": {
    "multi_match": {
      "query": "basketball with cartoom aliens",
      "fields": ["title^10","overview"]
    }
  }
}

#most_fields:思考绝大多数(所有的),文档的字段得分相加,取得咱们想要的后果
GET /movie/_search
{
  "query": {
    "multi_match": {
      "query": "basketball with cartoom aliens",
      "fields": ["title^10","overview^0.1"],
      "type": "most_fields"
    }
  }
}

#cross_fields:以分词为单位计算栏位的总分, 实用于词维度的匹配,分词在各个字段中的得分取最大值,而后累加这些最大得分
GET /movie/_search
{
  "query": {
    "multi_match": {
      "query": "steve job",
      "fields": ["title","overview"],
      "type": "cross_fields"
    }
  }
}
  • query string 形式查问
# 不便的利用 and or not
GET /movie/_search
{
  "query": {
    "query_string": {"fields": ["title"],
      "query": "steve or jobs"
    }
  }
}

7、布尔查问

  • 单条件过滤
GET /movie/_search
{
  "query": {
    "bool": {
      "filter": {"term": {"title": "steve"}
      }
    }
  }
}

阐明:term 关键字查问不会分词,match 才会分词

  • 多条件过滤
GET /movie/_search
{
  "query": {
    "bool": {
      "filter": [{"term":{"title": "steve"}},
        {"term":{"cast.name": "gaspard"}},
        {"range":{"release_date": {"lte":"2014/01/01"}}},
        {"range":{"popularity": {"gte":"25"}}}
      ]
    }
  }
}
  • 布尔查问
#bool 查问
#must:必须都为 true
#must not:必须都是 false
#should:其中只有一个为 true 即可
#为 true 越多则分数越高
GET /movie/_search
{
  "query": {
    "bool": {
      "should": [{"match": {"title": "basketball with cartoom aliens"}},
        {"match": {"overview": "basketball with cartoom aliens"}}
      ]
    }
  }
}
  • 带 match 打分的 filter
GET /movie/_search
{
  "query": {
    "bool": {
      "should": [{"match":{"title": "life"}}
      ], 
      "filter": [{"term":{"title": "steve"}},
        {"term":{"cast.name": "gaspard"}},
        {"range":{"release_date": {"lte":"2014/01/01"}}},
        {"range":{"popularity": {"gte":"25"}}}
      ]
    }
  }
}

阐明:match 查问负责打分匹配,filter 负责过滤,最终返回的文档是有分数的。

  • 多条件过滤加排序
GET /movie/_search
{
  "query": {
    "bool": {
      "filter": [{"term":{"title": "steve"}},
        {"term":{"cast.name": "gaspard"}},
        {"range":{"release_date": {"lte":"2014/01/01"}}},
        {"range":{"popularity": {"gte":"25"}}}
      ]
    }
  },
  "sort": [
    {
      "popularity": {"order": "desc"}
    }
  ]
}

8、自定义得分查问

  • 自定义得分查问
#functionscore, 对原始查问失去的分数,进一步进行解决
GET /movie/_search
{
  "query": {
    "function_score": {
      "query": {
        "multi_match": {
          "query": "steve job",
          "fields": ["title","overview"],
          "operator": "or",
          "type": "most_fields"
        }
      },
      "functions": [
        {
          "field_value_factor": {
            "field": "popularity",
            "modifier": "log2p",
            "factor": 10
          }
        },
        {
          "field_value_factor": {
            "field": "popularity",
            "modifier": "log2p",
            "factor": 5
          }
        }
      ],
      "score_mode": "sum",
      "boost_mode": "sum"
    }
  }
}

9、聚合查问

GET /employee/_search
{
  "query": {
    "match": {"name": "关"}
  },
  "sort": [
    {
      "age": {"order": "desc"}
    }
  ],
  "aggs": {
    "group_by_age": {
      "terms": {
        "field": "age",
        "size": 10
      }
    }
  }
}

9、查问剖析

  • 应用 analyze api 查看分词状态
GET /movie/_analyze
{
  "field": "name",
  "text": "Eating an apple a day & keeps the doctor away"
}
  • 应用 explain 查看打分的剖析后果
GET /movie/_search
{
  "explain": true,
  "query": {
    "match": {"title": "steve"}
  }
}
  • explanation
GET /movie/_validate/query?explain
{
  "query": {
    "multi_match": {
      "query": "basketball with cartoom aliens",
      "fields": ["title^10","overview"],
      "type": "best_fields"
    }
  }
}

正文完
 0