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