一、ElasticSearch 相关概念
Elasticsearch是⾯向⽂档(document oriented)的,这意味着它可以存储整个对象或⽂档(document)。
然 ⽽它不仅仅是存储,还会索引(index)每个⽂档的内容使之可以被搜索。
在Elasticsearch中,你可以对⽂ 档(⽽⾮成⾏成列的数据)进⾏索引、搜索、排序、过滤。
Elasticsearch⽐传统关系型数据库如下:
Relational DB -> Databases -> Tables -> Rows -> Columns
Elasticsearch -> Indices -> Types -> Documents -> Fields
1.1 关建概念 1.1.1 索引 index⼀个索引就是⼀个拥有⼏分相似特征的⽂档的集合。
⽐如说,你可以有⼀个客户数据的索引,另⼀个产 品⽬录的索引,还有⼀个订单数据的索引。
⼀个索引由⼀个名字来标识(必须全部是⼩写字母的),并 且当我们要对对应于这个索引中的⽂档进⾏索引、搜索、更新和删除的时候,都要使⽤到这个名字。
在 ⼀个集群中,可以定义任意多的索引。
在⼀个索引中,你可以定义⼀种或多种类型。
⼀个类型是你的索引的⼀个逻辑上的分类/分区,其语义 完全由你来定。
通常,会为具有⼀组共同字段的⽂档定义⼀个类型。
⽐如说,我们假设你运营⼀个博客 平台并且将你所有的数据存储到⼀个索引中。
在这个索引中,你可以为⽤户数据定义⼀个类型,为博客 数据定义另⼀个类型,当然,也可以为评论数据定义另⼀个类型。
相当于是数据表的字段,对⽂档数据根据不同属性进⾏的分类标识
1.1.4 映射 mappingmapping是处理数据的⽅式和规则⽅⾯做⼀些限制,如某个字段的数据类型、默认值、分析器、是否被 索引等等,这些都是映射⾥⾯可以设置的,其它就是处理es⾥⾯数据的⼀些使⽤规则设置也叫做映射, 按着最优规则处理数据对性能提⾼很⼤,因此才需要建⽴映射,并且需要思考如何建⽴映射才能对性能 更好。
⼀个⽂档是⼀个可被索引的基础信息单元。
⽐如,你可以拥有某⼀个客户的⽂档,某⼀个产品的⼀个⽂ 档,当然,也可以拥有某个订单的⼀个⽂档。
⽂档以JSON(Javascript Object Notation)格式来表⽰, ⽽JSON是⼀个到处存在的互联⽹数据交互格式。
在⼀个index/type⾥⾯,你可以存储任意多的⽂档。
注意,尽管⼀个⽂档,物理上存在于⼀个索引之 中,⽂档必须被索引/赋予⼀个索引的type
1.1.6 集群 cluster⼀个集群就是由⼀个或多个节点组织在⼀起,它们共同持有整个的数据,并⼀起提供索引和搜索功能。
⼀个集群由⼀个唯⼀的名字标识,这个名字默认就是“elasticsearch”。
这个名字是重要的,因为⼀个节 点只能通过指定某个集群的名字,来加⼊这个集群
二 、ElasticSearch的客户端 *** 作实际开发中,主要有三种⽅式可以作为elasticsearch服务的客户端:
第⼀种,elasticsearch-head插件
第⼆种,使⽤elasticsearch提供的Restful接⼜直接访问
第三种,使⽤elasticsearch提供的API进⾏访问
查询语句是重点。
请求url:POST 192.168.220.100:9200/blog1/article/_search
请求体:{ "query": { "query_string": { "default_field": "title", "query": "搜索服务器" } } }
2.2.1 term 查询{ "query": { "term": { "title": "搜索" } } }
两种查询的区别在于:
query_string:搜索之前对搜索的关键词分词
term:对搜索的关键词不分词
三、 IK 分词器
IKAnalyzer是⼀个开源的,基于java语⾔开发的轻量级的中⽂分词⼯具包。
安装ik分词器必须和 e s的版本一致否则容易报错, 容器闪退
分词器下载地址 https://github.com/medcl/elasticsearch-analysis-ik/releases
将ik分词器上传到服务器上,然后解压,并改名字为ik
unzip elasticsearch-analysis-ik-5.6.8.zip
mv elasticsearch ik
将ik⽬录拷贝到docker容器的plugins⽬录下
docker cp ./ik kkb_es:/usr/share/elasticsearch/plugins
ik_max_word:会将⽂本做最细粒度的拆分
ik_smart:会做最粗粒度的拆分
四、掌握DSL语句 4.1 索引 *** 作
(1)查询所有索引
GET /_cat/indices?v
(2)删除某个索引
DELETE /skuinfo
(3)新增索引
PUT /user
(4)创建映射
PUT /user/userinfo/_mapping
{
"properties": {
"name":{
"type": "text",
"analyzer": "ik_smart",
"search_analyzer": "ik_smart"
},
"city":{
"type": "text",
"analyzer": "ik_smart",
"search_analyzer": "ik_smart"
},
"age":{
"type": "long"
},
"description":{
"type": "text",
"analyzer": "ik_smart",
"search_analyzer": "ik_smart"
}
}
}
(5)新增文档数据
PUT /user/userinfo/1
{
"name":"李四",
"age":22,
"city":"深圳",
"description":"李四来⾃湖北武汉!"
}
(6)修改数据
a. 替换 *** 作
更新数据可以使⽤之前的增加 *** 作,这种 *** 作会将整个数据替换掉,代码如下:
#更新数据,id=4
PUT /user/userinfo/4
{
"name":"张三丰",
"description":"在武汉读书,家在武汉!在深圳⼯作!"
}
b. 更新数据
#使⽤POST更新某个域的数据
POST /user/userinfo/4/_update
{
"doc":{
"name":"张三丰",
"description":"在武汉读书,家在武汉!在深圳⼯作!"
}
}
(7)删除document
#删除数据
DELETE user/userinfo/7
4.2 数据查询
(1)查询所有数据
GET /user/_search
(2)根据 id 查询
GET /user/userinfo/2
(3)sort 排序
#搜索排序
GET /user/_search
{
"query":{
"match_all": {}
},
"sort":{
"age":{
"order":"desc"
}
}
}
(4)分页
#分⻚实现
GET /user/_search
{
"query":{
"match_all": {}
},
"sort":{
"age":{
"order":"desc"
}
},
"from": 0,
"size": 2
}
4.3 查询模式
(1)term查询
term主要⽤于分词精确匹配,如字符串、数值、⽇期等(不适合情况:1.列中除英⽂字符外有其它值 2. 字符串值中有冒号或中⽂ 3.系统⾃带属性如_version)
#查询-term
GET _search
{
"query":{
"term":{
"city":"武汉"
}
}
}
#查询-terms 允许多个Term
GET _search
{
"query":{
"terms":{
"city":
[
"武汉",
"⼴州"
]
}
}
}
(2)match查询
GET _search
{
"query": {
"match": {
"city": "⼴州武汉"
}
}
}
(3)query_string查询
GET _search
{
"query": {
"query_string": {
"default_field": "city",
"query": "⼴州武汉"
}
}
}
(4)range 查询
range过滤允许我们按照指定范围查找⼀批数据。
例如我们查询年龄范围
#-range 范围过滤
#gt表示> gte表示=>
#lt表示< lte表示<=
GET _search
{
"query":{
"range": {
"age": {
"gte": 30,
"lte": 57
}
}
}
}
(5)exists
exists 过滤可以⽤于查找拥有某个域的数据
GET _search
{
"query": {
"exists":{
"field":"address"
}
}
}
(6)bool 查询
bool 可以⽤来合并多个条件查询结果的布尔逻辑,它包含⼀下 *** 作符:
- must : 多个查询条件的完全匹配,相当于 and。
- must_not : 多个查询条件的相反匹配,相当于 not。
- should : ⾄少有⼀个查询条件匹配, 相当于 or。
GET _search { "query": { "bool": { "must": [ { "term": { "city": { "value": "深圳" } } }, { "range":{ "age":{ "gte":20, "lte":99 } } } ] } } }
(7)match_all 查询
可以查询到所有⽂档,是没有查询条件下的默认语句#查询所有 match_all GET _search { "query": { "match_all": {} } }
(8)match查询
match查询是⼀个标准查询,不管你需要全⽂本查询还是精确查询基本上都要⽤到它。如果你使⽤ match 查询⼀个全⽂本字段,它会在真正查询之前⽤分析器先分析match⼀下查询字符:
#字符串匹配
GET _search
{
"query": {
"match": {
"description": "武汉"
}
}
}
(9) prefix 查询
见名知意
(10))multi_match 查询
multi_match查询允许你做match查询的基础上同时搜索多个字段,在多个字段中同时查⼀个
#多个域匹配搜索
GET _search
{
"query": {
"multi_match": {
"query": "深圳",
"fields": [
"city",
"description"
]
}
}
}
五、 Spring Data ElasticSearch
编写实体Article
@Document(indexName = "lxs_blog", type = "article")
public class Article {
@Id
@Field(type = FieldType.Long, store = true)
private long id;
@Field(type = FieldType.Text, store = true, analyzer = "ik_smart")
private String title;
@Field(type = FieldType.Text, store = true, analyzer = "ik_smart")
private String content;
。
。
。
}
编写dao
public interface ArticleRepository extends ElasticsearchRepository {}
框架中有很多内置方法
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)