ElasticSearch基础语法开发

  1. Elaticsearch,简称为es, es是一个开源的高扩展的分布式全文检索引擎,它可以近乎实时的存储、检索数据;本身扩展性很好,可以扩展到上百台服务器,处理PB级别的数据。es也使用Java开发并使用Lucene作为其核心来实现所有索引和搜索的功能,但是它的目的是通过简单的RESTful API来隐藏Lucene的复杂性,从而让全文搜索变得简单。
  2. 对比mysql:
    当我们在上万条数据中模糊查询时,使用mysql就会遍历整张表,并且进行匹配,查询数度是非常慢的。
    但是我们在使用es搜索之后这些问题就会得到解决,因为es搜索基于倒排索引。
    在这里插入图片描述
    如图所示就是倒排索引的体现,我们将词语跟出现到的文档进行绑定,当我们搜索“市场时”就会定位到A,B,C文档中,而不会在去遍历其它的文档,省掉了做无用功的时间,因此检索速度得到了数量级的提升。
    分词:当我们做词组搜索时,用数据库是很难实现的,例如,当用户在搜索框输入“四川火锅”时,数据库通常只能把这四个字去进行全部匹配。可是在文本中,可能会出现“推荐四川好吃的火锅”,这时候就没有结果了。
    我们使用es搜索时就不用太过于关注分词了,因为因为Elasticsearch支持中文分词插件(IK),很好地解决了问题。
  3. 全文检索:
    将非结构化数据中的一部分信息提取出来,重新组织,使其变得有一定结构,这就是索引,我们再查询索引检索到相关的内容,信息。
    如同查字典一样,可以根据前面的偏旁部首,或者拼音来进行检索。
    应用场景:
    对于数据量大、数据结构不固定的数据可采用全文检索方式搜索,比如百度、Google等搜索引擎、论坛站内搜索、电商网站站内搜索等。
  4. 创建索引index和映射mapping
    在这里插入图片描述

创建索引:

PUT preson

查询索引:

GET preson

删除索引:

DELETE preson

查询映射:

GET preson/_mapping

添加映射:

PUT preson/_mapping{
	"properties":{
		"name":{
			"type":"text"
			},
		"age":{
			"type":"integer"
		},
		"address":{
			"type":"text"
		}
	}
}

创建索引时并添加映射:

	PUT preson{
		"mapping":{
			"properties":{
				"name":{
				"type":"text"
				},
				"age":{
				"type":"integer"
				},
			"address":{
				"type":"text"
				}
			}
		}
	}
  1. 操作文档document

查询索引:

GET preson

添加文档:指定id

PUT preson/doc_1/1{
	“name”:“张三”,
	"age":"18",
	"address":"北京昌平区"
}

添加文档:不指定id

POST preson/doc_1{
	“name”:“张三”,
	"age":"18",
	"address":"北京昌平区"
}

查询指定文档

GET person/doc_1/1

查询所有文档

GET person/_search

删除文档

DELETE person/doc_1/1

修改文档,有id时就是修改,没有id时就是添加

PUT person/doc_1/1{
	"name":"李四",
	"age":19,
	"address":"北京昌平区"
}

全文查询-match查询
全文查询-match会分析查询条件,先将查询条件进行分词,然后查询,求并集

	GET person/_search{
	"query":{
		"match":{
			"address":"深圳"
		}	
	}
}

查询文档-term查询
不会分析查询条件,一个字为一个分词。

GET preson/_search{
	"query":{
		"term":{
			"address": {
       		"value": "深圳宝安区"
     			}
		}
	}
}

关键字搜索:

GET preson/_search?q=name:"张三"

DSL 查询:

在这里插入代码片

DSL查询:
查询年龄大于20岁的女性用户

GET preson/_search
{
"query":{
	"bool":{
		"filter":{
			"range":{
				"age":{
					"gt":20
				}
			}
		},
		"must":
		{
			"match":{
				"sex":"女"		
				}
			}
		}
	}
}
}

全文搜索张三李四

GET preson/_search{
	"query":{
		"match":{"张三 李四"}
	}
}

高亮显示

GET preson/_search{
	"query":{
		"match":{
			"name":"张三 李四"
		}
	},
	"highlight":{
		"fields":{
			"name":{}
		}
	}
	
}

聚合(分组查询)

GET preson/_search
{
  "aggs": {
    "all_interests": {
      "terms": {
        "field": "age",
        "size": 10
      }
    }
  } 
}

指定响应响应字段

GET preson/_doc/1001?_source=age,name

判断文档是否存在(返回200表示存在)

GET preson/_doc/1001

批量查询

POST preson/_doc/_mget
{
	"ids":[1001,1002]
}

_bulk操作
在Elasticsearch中,支持批量的插入、修改、删除操作,都是通过_bulk的api完成的。
请求格式如下:(请求格式不同寻常)

{ action: { metadata }}\n
{ request body    }\n
{ action: { metadata }}\n
{ request body    }\n
...

批量插入数据:

POST _bulk
{"create":{"_index":"pse","_id":2001}}
{"name":"张三","age":18,"sex":男}
{"create":{"_index":"pse","_id":2002}}
{"name":"李四","age":20,"sex":男}

批量删除

{"delete":{"_index":"pse","_id":2001}}
{"delete":{"_index":"pse","_id":2002}}
{"delete":{"_index":"pse","_id":2003}}

分页:和SQL使用 LIMIT 关键字返回只有一页的结果一样,Elasticsearch接受 from 和 size 参数:
from:从几开始,并跳过它
size:一页显示几个

GET preson/_search?size=5&from=5

重6开始,一页显示5个。
terms查询
terms 跟 term 有点类似,但 terms 允许指定多个匹配条件。 如果某个字段指定了多个值,那么文档需要一
起去做匹配:

POST preson/_search
{
	"query":{
		"terms":{
			"age" : [20,21]
		}
	}
}

range查询
range 过滤允许我们按照指定范围查找一批数据:

范围操作符包含:

gt :: 大于
gte :: 大于等于
lt :: 小于
lte :: 小于等于
	POST preson/_search
	{
		"query":{
			"range":{
				"age":{
					"gt":19
				}
			}
		}
	}

exists 查询

exists 查询可以用于查找文档中是否包含指定字段或没有某个字段,类似于SQL语句中的 IS_NULL 条件

POST preson/_search
{
	"query":{
		"exists":{
			"field":"main"
		}
	}
}

猜你喜欢

转载自blog.csdn.net/weixin_44363766/article/details/114268326