ElasticSearch学习笔记
一、关系型数据库与非关系学数据库类比
关系型 Relational DB -> DataBases -> Tables -> Rows -> Columns Elasticsearch Elasticsearch -> Indices -> Types -> Documents -> Fields
Es如同SQL一样,有一套自己的查询语句,DSL查询
二、Elasticsearch增删改查
1、增
指定ID的情况下
代码语言:javascript复制PUT users/_doc/1
{
"username": "wupx",
"age": "18"
}
Create支持两种方式,一种是指定文档ID创建文档,另一种是让ES自动生成文档ID
自己指定文档ID创建文档,需要考虑ID的均衡性,避免产生分配不均衡的问题,Es的HASH函数会确保文档ID被均匀分配到不同的分片。
返回包中的_version
字段,每一次操作都会加1,这是一个锁的机制,当并行修改文档的时候,更新的版本号比文档当前的版本号小时就会报错,不允许修改。
创建文档的时候,如果索引不存在,ES会自动创建对应的Index和Type
不指定ID的情况下
不指定id创建文档,HTTP请求也会变为PSOT
代码语言:javascript复制POST users/_doc
{
"username": "huxy",
"age": "18"
}
index和Create区别为:如果文档不存在,就索引新的文档,否则现有文档就会被删除,新的文档被索引版本信息_version
1
2、查
使用GET犯法,只需要GET 索引名/文档名/文档ID
代码语言:javascript复制GET users/_doc/1
在返回信息中_index
为索引,_type
为类型,_id
为文档id,_version
为版本信息,_source
存储了文档的完整原始数据。
3、改
Update方法采用HTTP POST,在请求体重必须指名doc,在把具体文档提供在HTTP的body里,update和index犯法不同,update方法不会删除原来的文档,而是真正的数据更新
代码语言:javascript复制POST users/_update/1
{
"doc": {
"job": "coder",
"message": "hello world"
}
}
4、删
只需要把HTTP的方法换成Delete即可
代码语言:javascript复制Delete 索引名/_doc/文档id
三、Elasticsearch查询常见方法
Tips:在所有语法后面加上?pretty=true
,格式化显示
1、查询所有索引及其容量
代码语言:javascript复制GET _cat/indices
2、查询某一个索引的映射结构
代码语言:javascript复制GET 索引名/_mapping
3、查询所有的相同前缀索引,通配符匹配
代码语言:javascript复制GET sec*/_search
4、查询所有索引模板
代码语言:javascript复制GET _template
5、查询具体索引模板
代码语言:javascript复制GET _template/模板名
6、查询集群健康状态
代码语言:javascript复制GET _cluster/health
7、查询所有节点
代码语言:javascript复制GET _cat/nodes
8、查询索引及分片的分布
代码语言:javascript复制GET _cat/shards
9、查询所有插件
代码语言:javascript复制GET _cat/plugins
四、Elasticsearch高级查询常见方法
1、查询某个索引的全部数据
代码语言:javascript复制GET /index/type/_search
{
"query": {
"match_all": {}
}
}
2、根据某一字段精确查询
代码语言:javascript复制GET /index/type/_search
{
"query": {
"term" : {"字段名": "值"}
}
}
3、根据某一字段模糊匹配
代码语言:javascript复制GET /index/tpe/_search
{
"query": {
"match": {"字段名": "值"}
}
}
4、根据某一字段值进行范围查找
代码语言:javascript复制GET /index/type/_search
{
"query":{
"range": {
"age": {"gte": 15, "lte": 25}
}
}
}
gte是大于等于 lte是小于等于
5、根据条件进行过滤查询
代码语言:javascript复制GET /index/type/_search
{
"query":{
"bool":{
"filter": {
"term": {"字段": "值"}
}
}
}
}
五、DSL查询方法
DSL查询使用Json格式的请求体与Elasticsearch交互
DSL查询主要包括两种类型的查询语句
- 叶子查询语句:用于查询特殊字段的特殊值,例如:match,term,range等
- 复合查询语句:可以合并其他的叶子查询或复合查询,从而实现非常复杂的查询逻辑
1、基本语法
使用DSL查询,需要用query参数
代码语言:javascript复制GET /_search
{
"query": <quer clause>
}
没有查询条件的查询,就是空查询,他会匹配所有的文档
代码语言:javascript复制GET /_search
{
"query": {}
}
以上语句等价于
代码语言:javascript复制GET /_search
基本查询案例
使用match查询full_name字段包含john的记录
代码语言:javascript复制GET /_search
{
"query": {
"match": {
"full_name": "john"
}
}
}
查询与过滤
DSL查询根据使用目的的不同分为两种类型
- 上下文查询(Query Context),简称查询
- 上下文过滤(Filter Context),简称过滤
查询Query
在上下文查询语境中,查询语句会询问文档与查询语句的匹配出程度,此外,它还会判断文档是否匹配并计算相关性评分_scoure
的值
过滤Filter
在上下文过滤语境中,查询语句主要解决文档是否匹配的问题,而不会在意匹配程度,过滤主要用于结构化的数据
一般来说,过滤语句比查询语句的执行效率更高,因为它不用计算文档的相关性评分Score
全文搜索或需要用到相关性评分Score的场景采用查询Query,其他的全部用过滤Filter
代码语言:javascript复制GET /_search
{
"query": {
"bool": {
"must": [
{ "match": { "title": "Search" }},
{ "match": { "content": "Elasticsearch" }}
],
"filter": [
{ "term": { "status": "published" }},
{ "range": { "publish_date": { "gte": "2015-01-01" }}}
]
}
}
}
全文查询
全文查询语句通常用于全文本字段的查询
match
查询可操作文本,数值和日期类型的数据,分期它们并构建查询语句
实例:查询full_name字段包含John或smith的文档
代码语言:javascript复制GET /_search
{
"query" : {
"match" : {
"full_name" : "John Smith"
}
}
}
Tips:Elasticsearch会先使用分析器分析John Smith为两个独立的项,然后再去构建查询,这里的full_name字段可以替换为任何你想要查询的字段,甚至是_all字段
match属于boolean的类型,也就是说,分析器会对提供的查询文本进行分析并构建boolean查询语句,由match构建的boolean查询语句默认是逻辑或or,当然可以通过operator参数来改变这个默认行为
代码语言:javascript复制GET /_search
{
"query": {
"match" : {
"full_name" : {
"query" : "John Smith",
"operator" : "and"
}
}
}
}
说明: full_name 是字段名称,query 参数的值是提供的查询文本,operator 参数用于设置 match 的逻辑(or 还是 and)。