Elasticsearch介绍及如何使用

是什么

Elasticsearch 是一个分布式可扩展的实时搜索和分析引擎,一个建立在全文搜索引擎 Apache Lucene™ 基础上的搜索引擎.当然 Elasticsearch 并不仅仅是 Lucene 那么简单,它不仅包括了全文搜索功能,还可以进行以下工作:

  • 分布式实时文件存储,并将每一个字段都编入索引,使其可以被搜索。
  • 实时分析的分布式搜索引擎。
  • 可以扩展到上百台服务器,处理PB级别的结构化或非结构化数据。

基本概念:

  • 节点(Node):
    一个节点是一个单一的服务器,是你的集群的一部分,存储数据,并且参与集群的索引和搜索功能。
    一个节点可以通过配置特定的集群名称来加入特定的集群。默认情况下,每个节点被设定加入一个名称为 “elasticsearch” 的集群,这意味着如果你在你的网络中启动了一些节点,并且假设它们能相互发现,它们将会自动组织并加入一个名称是 “elasticsearch” 的集群。
  • 索引(Index):
    可以近似的理解SQL中的数据库,虽然官方文档上说这是不好的。可以包涵表和数据。
  • 类型(Type):(警告!Type在6.0.0版本中已经不赞成使用):
    可以近似的理解成是SQL中的表,里面会包涵许多数据
  • 文档(Document):
    可以近似的理解是SQL中的表里的每一条数据。

去哪下:

官网下载传送
官网下载window版(我的是6.6.1版本)。
双击运行bin目录下的 elasticsearch.bat

怎么玩:

测试
看到这个结果,说明安装,启动成功。

  • 列出所有的索引:(GET)
http://localhost:9200/_cat/indices?v
  • 创建一个索引:(PUT)
http://localhost:9200/customer

创建索引结果

  • 向索引中添加文档(PUT)
http://localhost:9200/customer/doc/1
	//其中doc是类型。

向索引中添加文档结果

  • 获取刚刚加入索引的文档:(GET)
http://localhost:9200/customer/doc/1

获取刚刚加入索引的文档

  • 删除一个索引:(DELETE)
http://localhost:9200/customer
  • 更新文档(POST)
    除了能够新增和替换文档,我们也可以更新文档。注意虽然 Elasticsearch 在底层并没有真正更新文档,而是当我们更新文档时,Elasticsearch 首先去删除旧的文档,然后加入新的文档。
http://localhost:9200/customer/doc/1/_update?pretty
{
  "doc": { "name": "Jane Doe" }
}

更新操作也可以使用简单的脚本来执行。如下的示例使用一个脚本将age增加了5:

http://localhost:9200/customer/doc/1/_update?pretty
{
  "script" : "ctx._source.age += 5"
}
  • 删除文档(DELETE):
http://localhost:9200/customer/doc/2?pretty

推荐使用Kibana进行数据查询

搜索:
  • _mget(批量获取文档)
    类似sql中的 id in(1,2,3)这样。
GET _mget
{
	"docs":[
		{
			"_index": "bank",
			"_type": "account",
			"_id": "1",
			"_source": ["balance", "city"]
		},
		{
			"_index": "bank",
			"_type": "account",
			"_id": "5",
			"_source": "firstname"
		}
	]
}

也可以简写:

GET /bank/account/_mget
{
	"ids": ["1", "2", "4"]
}
  • _bulk(批量操作)
    1.格式:
    {action:{metadata}}
    {requestbody}

    其中action(行为)可以取值:
    1.create:文档不存在时创建
    2.update:更新文档
    3.index:创建新文档或覆盖已有文档
    4.delete:删除一个文档
    create和index的区别:如果数据存在,使用create操作失败,会提示文档以存在,使用index可以成功执行。
    如果使用create创建多个,其中有存在的,那么存在的返回失败,不存在的添加成功
    其中metadata可以取值:
    _index,_type,_id

    示例:
    1.create:

    POST /bank/account/_bulk
    {"create":{"_id":"999"}}
    {"account_number":999, "balance": 999}
    {"create":{"_id":"1000"}}
    {"account_number":1000, "balance": 1000}
    {"create":{"_id":"1001"}}
    {"account_number":1001, "balance": 1001}
    

    2.delete:

    POST bank/account/_bulk
    {"delete":{"_index":"bank", "_type":"account", "_id":"1000"}}
    

    3.update:

    POST /bank/account/_bulk
    {"update":{"_id":"1001"}}
    {"doc":{"balance":"0"}}
    
  • term:
    用于查询指定字段包含某个词项的文档。这个查询不知道分词器的存在,所以搜索的值不会进行分词。只会拿搜索的值去倒排索引中找。

GET /bank/account/_search
{
	"query":{
		"term":{
			"address":{
				"value":"heath"
			}
		}
	}
}
  • match:
    知道分词器的存在,所以搜索的值会被分词在去查询。
GET /bank/account/_search
{
	"query":{
		"match":{
			"address":"511 Heath Place"
		}
	}
}
  • multi_match
    可以指定多个字段,意思是:查找fields字段值的字段中包含query字段中对应的值
GET /bank/account/_search
{
	"query":{
		"multi_match":{
			"query":"Worcester",
			"fields":["city", "address"]
		}
	}
}
  • match_phrase
    短语搜索,就是搜索含有指定的短语的数据。意思是搜索的值经过分词之后和es中分词保存的一致,顺序也一致,两头的可以少,中间的不可以少
GET /bank/account/_search
{
	"query":{
		"match_phrase":{
			"address":"511 Heath Place"
		}
	}
}
  • _source:
    用来指定返回的字段:
GET /bank/account/_search
{
	"query":{
		"multi_match":{
			"query":"Worcester",
			"fields":["city", "address"]
		}
	},
	"_source": ["firstname", "age"]
}

_可以写个数组来指定,也可以在 "source" 字段中加"includes"和"excludes"

GET /bank/account/_search
{
	"query":{
		"multi_match":{
			"query":"Worcester",
			"fields":["city", "address"]
		}
	},
	"_source": {
		"includes": ["age", "balance", "gen*"],
		"excludes": ["gender"]
	}
}
  • sort
    用来排序,和关系型数据库的排序类似
GET /bank/account/_search
{
	"query":{
		"match_all":{}
	},
	"sort":[
		{
			"balance":{
				"order":"desc"
			}
		},
		{
			"age":{
				"order":"asc"
			}
		}
	]
}
  • match_phrase_prefix:
    前缀匹配(查询的值不会分词,但是忽略大小写)
    前缀匹配结果
  • range:
    范围查询:
GET /bank/account/_search
{
	"query":{
		"range":{
			"age":{
				"gte": 20,
				"lt": 30
			}
		}
	}
}
  • wildcard:
    通配符匹配:
    通配符:
    * 代表任意多字符
    ? 代表一个字符
GET /bank/account/_search
{
	"query":{
		"wildcard":{
			"city":{
				"value": "nicho*n"
			}
		}
	}
}
  • highlight:
    高亮显示:
GET /bank/account/_search
{
	"query":{
		"wildcard":{
			"city":{
				"value": "nicho*n"
			}
		}
	},
	"highlight":{
		"fields":{
			"city":{}
		}
	}
}

高亮结果

  • fuzzy:
    模糊匹配,这个可不是mysql中的like,是可以错误的输入一些字 来进行匹配
GET /bank/account/_search
{
	"query":{
		"fuzzy":{
			"city": "Nicho1so"
		}
	}
}

  • filter查询:
    过滤查询:
    过滤查询结果
    过滤结果2
  • must,should,must_not:
GET /bank/account/_search
{
	"query":{
		"bool":{
			"must": [
				{
				  "term":{
				    "age":{
				      "value" :20
				    }
				  }
				}
			]
		}
	}
}
  • exists:
    查询某个字段不为空
GET /bank/account/_search
{
	"query":{
		"bool":{
			"filter": {
			  "exists":{
			    "field": "age"
			  }
			}
		}
	}
}
  • 聚合查询:
    1.sum
    sum结果
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值