之前实践过的Elasticsearch到现在基本上的语法我都回忆不起来了,所以准备写篇文章帮助自己复习一下,没有什么技术含量的分享,但是也分享给想初步了解的朋友们。
就不介绍Elasticsearch了,直接进入正文(手动分割线0.0)
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
为了模拟真实场景,建议大家在linux下安装Elasticsearch。
Kibana是一个Elasticsearch索引库数据统计工具,可以利用Elasticsearch的聚合功能,生成各种图表,而且还提供了操作Elasticsearch索引数据的控制台,并且提供了一定的API提示,非常有利于我们学习Elasticsearch的语法(划重点!!!提供API提示!),建议安装。
启动后Kibana后
选择左侧的DevTools菜单,即可进入控制台页面
1.基本概念
Elasticsearch也是基于Lucene的全文检索库,本质也是存储数据,很多概念与MySQL类似的。
对比关系:
索引(indices)--------------------------------Databases 数据库
类型(type)-----------------------------Table 数据表 文档(Document)----------------Row 行 字段(Field)-------------------Columns 列
2.创建索引
Elasticsearch采用Rest风格API,因此其API就是一次http请求,你可以用任何工具发起http请求
创建索引的请求格式:
请求方式:PUT
请求路径:/索引库名
请求参数:json格式:
{ "settings": { "number_of_shards": 3, "number_of_replicas": 2 }}
number_of_shards:分片数量
number_of_replicas:副本数量
settings:索引库的设置
查看和删除分别使用get和delete请求即可。
2.1 映射配置
通俗的讲就是mysql数据库中的建表
创建映射请求方式依然是PUT
PUT /索引库名/_mapping/类型名称{ "properties": { "字段名": { "type": "类型", "index": true, "store": true, "analyzer": "分词器" } }}
类型名称:就是前面type的概念,类似于数据库中的不同表字段名:任意填写 ,可以指定许多属性,例如:
type:类型,可以是text、long、short、date、integer、object等
index:是否索引,默认为true
store:是否存储,默认为false
analyzer:分词器
Elasticsearch中支持的数据类型非常丰富
他的String类型,又分两种,这个很有特色!:
text:可分词,不可参与聚合
keyword:不可分词,数据会作为完整字段进行匹配,可以参与聚合
2.1.2index
index影响字段的索引情况。
true:字段会被索引,则可以用来进行搜索。默认值就是true
false:字段不会被索引,不能用来搜索
index的默认值就是true,但是有些字段是我们不希望被索引的,比如商品的图片信息,就设置index为false。
2.1.3 store
是否将数据进行额外存储。
Elasticsearch在创建文档索引时,会将文档中的原始数据备份,保存到一个叫做_source
的属性中。而且我们可以通过过滤_source
来选择哪些要显示,哪些不显示。
而如果设置store为true,就会在_source
以外额外存储一份数据,多余,因此一般我们都会将store设置为false。默认就为false
2.2 新增数据
通过POST请求,可以向一个已经存在的索引库中添加数据
示例:
POST /test/goods/
{
"title":"篮球",
"images":"123",
"price":99
}
通过kibana查看数据:
get _search
{
"query":{
"match_all":{}
}
}
-----------------------------------------------------------------------------
响应:
{
"_index": "test",
"_type": "goods",
"_id": "r9c1KGMBIhaxtY5rlRKv",
"_version": 1,
"_score": 1,
"_source": {
"title": "篮球",
"images": "123",
"price": 99
}
}
_source
:源文档信息,所有的数据都在里面。_id
:这条文档的唯一标示,与文档自己的id字段没有关联
3. 查询
我们从4块来讲查询:
基本查询
_source
过滤结果过滤
高级查询
排序
3.1基本查询
基本语法
GET /索引库名/_search{ "query":{ "查询类型":{ "查询条件":"查询条件值" } }}
这里的query代表一个查询对象,里面可以有不同的查询属性
查询类型:
例如:
match_all
,match
,term
,range
等等
查询条件:查询条件会根据类型的不同,写法也有差异
示例:
GET /test/_search
{
"query":{
"match_all": {}
}
}
query
:代表查询对象match_all
:代表查询所有
------------------------------------------------------------------------------
结果:
{
"took": 2,
"timed_out": false,
"_shards": {
"total": 3,
"successful": 3,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 2,
"max_score": 1,
"hits": [
{
"_index": "jiang",
"_type": "goods",
"_id": "2",
"_score": 1,
"_source": {
"title": "篮球",
"images": "123",
"price": 99
}
},
{
"_index": "jiang",
"_type": "goods",
"_id": "r9c1KGMBIhaxtY5rlRKv",
"_score": 1,
"_source": {
"title": "足球",
"images": "123",
"price": 69
}
}
]
}
}
took:查询花费时间,单位是毫秒
time_out:是否超时
_shards:分片信息
hits:搜索结果总览对象
_index:索引库
_type:文档类型
_id:文档id
_score:文档得分
_source:文档的源数据
total:搜索到的总条数
max_score:所有结果中文档得分的最高分
hits:搜索结果的文档对象数组,每个元素是一条搜索到的文档信息
3.2匹配查询
or关系
match
类型查询,会把查询条件进行分词,然后进行查询,多个词条之间是or的关系
GET /test/_search
{
"query":{
"match":{
"title":"小米电视"
}
}
}
结果不仅会查询到电视,而且与小米相关的都会查询到,多个词之间是or
的关系。
-------------------------------------------------------------------------------------------------------
and关系
某些情况下,我们需要更精确查找,我们希望这个关系变成and
,可以这样做
GET /test/_search
{
"query":{
"match": {
"title": {
"query": "小米电视",
"operator": "and"
}
}
}
}
这样,只有同时包含小米
和电视
的词条才会被搜索到。
3.3多字段查询
multi_match
与match
类似,不同的是它可以在多个字段中查询结果我们会在title字
GET /test/_search
{
"query":{
"multi_match": {
"query": "小米",
"fields": [ "title", "subTitle" ]
}
}
}
段和subtitle字段中查询小米这个词
3.4词条匹配(term)
term 查询被用于精确值 匹配,这些精确值可能是数字、时间、布尔或者那些未分词的字符串
GET /test/_search
{
"query":{
"term":{
"price":2699.00
}
}
}
3.5结果过滤
默认情况下,elasticsearch在搜索的结果中,会把文档中保存在_source的所有字段都返回。
如果我们只想获取其中的部分字段,我们可以添加_source的过滤
GET /test/_search
{
"_source": ["title","price"],
"query": {
"term": {
"price": 2699
}
}
}
------------------------------------------------------------------------------------------------------------
突然发现有点晚了,还是下次再继续介绍高级查询和聚合的使用好了。。。。。。。。。。。
敬请期待~~~~~~~~~~~