基本概念
基本概念
es是面向文档的搜索引擎,其和mysql的对比如下
mysql | es |
---|---|
数据库database | 索引(indices) |
表(table) | types(慢慢会被启用) |
行 --user :小明,id:1 | documents(文档) |
字段 | fields |
物理设计
集群
es在后台把每个索引划分成多个分片,每个分配可以在集群中的不同服务器间迁移.
实际上,一个es就是一个集群,只是我们只安装了一个es,如下:
默认的集群名称就是elaticsearch
节点和分片
一个集群至少有一个节点,每一个节点就是一个es进程,节点有多个默认索引,每个索引又有默认的五个分片,每一个主分片又有一个副本.
如上图,是一个有三个节点的集群,可以看到主分片和对应的复制分片不在同一个节点内,这样有利于某个节点挂掉了,数据也不至于丢失.实际上,一个分片是一个Lucenen索引,也即倒排索引
什么是倒排索引?
如图所示,就是将文章进行分词,用词来映射文章
索引基本操作
- 创建索引
PUT /{index}/_doc/{id}
{
“”:"",
…
}
- 创建映射
PUT /index
{
“properties”:{
“mappings”:{
“name”:{
“type”:“text”
}
}
}
}
- 修改索引
POST _update方式的方式与直接用PUT 方式的区别在于,
_update 只会修改需要更新的地方
put 如果没传值,原先的记录就会不见
POST /test/type/1/_update
{
"doc":{
"name":"lisi2",
"age":"153"
}
}
- 删除索引
DELETE /test
文档操作
在查询前先创一个索引,多存几个用户的信息
普通查询操作
- 匹配查询:(根据name=lisi进行匹配)
GET /test/user/_search?q=name:lisi
模糊查询
GET /test/user/_search?
{
"query": {
"match": {
"name": "张三"
}
}
}
可以看到有一个score,即匹配分值
排序
根据年龄排序
GET /test/user/_search?
{
"query": {
"match": {
"name": "张三"
}
},
"sort": [
{
"age": {
"order": "desc"
}
}
]
}
分页查询
关键字:from,size
GET /test/user/_search?
{
"query": {
"match": {
"name": "张三"
}
},
"_source": ["name"],
"from": 0,
"size": 1
}
多条件查询
必须满足条件:
GET /test/user/_search?
{
"query": {
"bool": {
"must": [
{
"match": {
"name":"张三"
}
},
{
"match": {
"age": "19"
}
}
]
}
}
}
满足其中一个:
GET /test/user/_search?
{
"query": {
"bool": {
"should": [
{
"match": {
"name":"张三"
}
},
{
"match": {
"age": "19"
}
}
]
}
}
}
非查询
关键字:must_not,
只要名字不是张三
GET /test/user/_search?
{
"query": {
"bool": {
"must_not": [
{
"match": {
"name":"张三"
}
}
]
}
}
}
过滤查询
关键字:filter
其中,
gt ----大于
gte ----大于等于
lt —小于
lte --小于等于
GET /test/user/_search?
{
"query": {
"bool": {
"must_not": [
{
"match": {
"name":"张三"
}
}
],
"filter": [
{
"range": {
"age": {
"gte": 10
}
}
}
]
}
}
}
倒排精确查找!
term 查询是直接通过倒排索引指定的词条进行精确查找
关于分词:
- term 直接精确查
- match 会先用分词器进行分词,再查询
GET /test1/user/_search
{
"query": {
"bool": {
"must": [
{
"term": {
"name": {
"value": "张三"
}
}
}
]
}
}
}