近期接触到搜索引擎ElasticSearch,简单做了一下学习记录。
ES的来源
ES全称ElasticSearch,是一种分布式全文搜索引擎,基于Lucene(全文搜索框架)封装和开元而来。
ES的基本概念
索引(Index):一个索引就是含有某些相似特性的文档的集合。
- 一个索引需要有一个名称作为唯一标识
- 名称必须是小写
- 名通过文档去执行索引,搜索,更新和删除操作。
类型(Type):一个类型是索引中的一个分类,可以在同一索引中存储不同类型的文档。
文档(Document):一个文档必须指定一个在索引中的类型,文档是可被索引的数据的基础单元。文档可以用JSON格式表现。
理解索引
索引和DB的结构比较相似,一个ES集群可以包含多个索引(indices)(数据库),每个索引库可以包含多个类型(types)(表),每一个类型包含多个文档(documents)(行),然后每个文档包含多个字段(Fields)(列)。
即:
Elasticsearch -> 索引库Indices -> 类型Types -> 文档Documents -> 字段Fields
关系数据库(MYSQL) -> 数据库DB-> 表TABLE-> 行ROW-> 列Column
DSL查询
ES提供的查询语言叫做DSL查询(Query DSL),DSL有一些特定的语法。
可以在终端使用命令去调用,也可以直接通过Jmeter或者Postman工具进行ES接口的调用。最常用的查询就是结构索引的查询,以及关键字结果的查询。
工具https请求语法:域名:端口/索引的名称/_search?pretty&q=city:"beijing"
终端调用语法:
- 查询Index的结构
$ curl -XGET域名:端口/索引的名称/_doc/_mapping?pretty
{
"index_name" : {
"mappings" : {
"_doc" : {
"dynamic" : "strict",
"properties" : {
"city" : {
"type" : "keyword"
},
"travel" : {
"type" : "keyword"
}
}
}
}
}
}
dynamic
dynamic是mapping的属性,定义了如何处理新增文档中包含的新增字段,有3个值可选:
- true,允许新增文档中包含新增字段,并且新增字段也会被索引搜索,也是默认值
- false, 允许新增文档包含新字段,但文档中包含的新增字段无法被索引
- strict, 不允许新增文档中包含新增字段
- 查询Index特定的关键字
$ curl -XGET域名:端口/索引的名称/_doc/_search?pretty\&size=10\&q=city:"beijing"
{
"took":2,
"timed_out":false,
"_shards":{"total":5,"successful":5,"failed":0},
"hits":{
"total":2,
"max_score":1.0,
"hits":[
{
"_index":"product",
"_type":"_doc",
"_id":"1",
"_score":1.0,
"_source": {
"has_ticket": "yes",
"city": "beijing",
"travel": "The Great Wall",
}
},
{
"_index":"accounts",
"_type":"person",
"_id":"2",
"_score":1.0,
"_source": {
"has_ticket": "yes",
"city" : "beijing",
"travel" : "Forbidden City",
}
}
]
}}
返回结果的释义:
took:返回的记录总数
timed_out:表示是否超时
hits:表示命中的记录,hit里面子字段的含义如下
total:返回记录数,本例是2条
max_score:最高的匹配程度,因为每条记录都会返回一个_score字段,表示匹配的程度,默认是按照这个字段降序排列
hits:返回的详细记录组成的数组
_index : “crm”,文档存储位置(索引)
_type : “user”,文档映射类型
_id : “1”,文档唯一标识(可以自定义也可以自动生成)
_score : 1.0,匹配度程度
_source : 具体返回的数据明细