ElasticSearch

Posted 我的紫霞辣辣

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ElasticSearch相关的知识,希望对你有一定的参考价值。

Elasticsearch 概述

ELK Stack技术栈, 包括 Elasticsearch、Kibana(展示数据)、Beats(轻量级采集传输数据) 和 Logstash(采集传输数据)。能够安全可靠地获取任何来源、任何格式的数据,然后实时地对数据进行搜索、分析和可视化。Elaticsearch,简称为 ES,ES 是一个开源的高扩展的分布式全文搜索引擎,是整个 Elastic Stack 技术栈的核心。它可以近乎实时的存储、检索数据;本身扩展性很好,可以扩展到上百台服务器,处理 PB 级别的数据。

Elasticsearch 入门

ELK官网

Elasticsearch全文搜索引擎windows服务端直接下载解压后,进入 bin 文件目录,点击 elasticsearch.bat 文件启动 ES 服务端

目录含义
bin可执行脚本目录
config配置目录
jdk内置 JDK 目录
lib类库
logs日志目录
modules模块目录
plugins插件目录

启动后如下所示

注意:9300 端口为 Elasticsearch 集群间组件的通信端口,9200 端口为浏览器访问的 http 协议 RESTful 端口。

打开浏览器(推荐使用谷歌浏览器),输入地址:http://localhost:9200,测试结果。

客户端Postman安装

如果直接通过浏览器向 Elasticsearch 服务器发请求,那么需要在发送的请求中包含HTTP 标准的方法,而 HTTP 的大部分特性且仅支持 GET 和 POST 方法。所以为了能方便地进行客户端的访问,可以使用 Postman 软件。
Postman 是一款强大的网页调试工具,提供功能强大的 Web API 和 HTTP 请求调试。软件功能强大,界面简洁明晰、操作方便快捷,设计得很人性化。Postman 中文版能够发送任何类型的 HTTP 请求 (GET, HEAD, POST, PUT…),不仅能够表单提交,且可以附带任意类型请求体。

Postman 官网

数据格式

Elasticsearch 是面向文档型数据库,一条数据在这里就是一个文档。为了方便大家理解,我们将 Elasticsearch 里存储文档数据和关系型数据库 mysql 存储数据的概念进行一个类比。

索引相关操作

HTTP 创建索引

对比关系型数据库,创建索引就等同于创建数据库。在 Postman 中,向 ES 服务器发 PUT(创建) 请求 :http://127.0.0.1:9200/shopping

PS:幂等性就是用户对于同一操作发起的一次请求或者多次请求的结果是一致的,不会因为多次点击而产生了副作用。

HTTP 查询索引

查询索引,向 ES 服务器发起GET请求

获取索引的详细信息

http://127.0.0.1:9200/_cat/indices?v

HTTP 删除索引

删除索引,向 ES 服务器发起DELETE请求

文档相关操作

索引已经创建好了,接下来我们来创建文档,并添加数据。这里的文档可以类比为关系型数据库中的表数据,添加的数据格式为 JSON 格式。

HTTP 创建文档

创建文档,在 Postman 中,向 ES 服务器发 POST 请求http://127.0.0.1:9200/shopping/_doc

{
    "title":"小米手机",
    "category":"小米",
    "images":"http://www.lala.com/xm.jpg",
    "price":3900
}



HTTP 查询文档

查询文档,在 Postman 中,向 ES 服务器发 GET 请求

HTTP 修改文档

全量修改文档,在 Postman 中,向 ES 服务器发 PUT 请求

{
    "title":"小米手机",
    "category":"小米",
    "images":"http://www.lala.com/xm.jpg",
    "price":1000
}

局部修改文档,在 Postman 中,向 ES 服务器发 POST 请求,url地址需要将 _doc 修改成 _update

http://127.0.0.1:9200/shopping/_update/1002
{
    "_doc":{
        "title":"华为"
    }
}

HTTP 删除文档

删除文档,在 Postman 中,向 ES 服务器发 DELETE 请求

HTTP 查询的多种方法

url地址,条件查询

http://127.0.0.1:9200/shopping/_search?q=category:小米

请求体,条件查询

{
    "query":{
        "match":{
            "category":"小米"
        }
    }
}

分页查询

from表示当前页数据的起始位置,第一页第一条数据的起始位置为0
size表示每页查询数据的条数

{
    "query":{
        "match_all":{
        }
    },
    "from":0,		// from表示当前页数据的起始位置,第一页第一条数据的起始位置为0
    "size":3		// size表示每页查询数据的条数 
}


起始位置计算公式

from : (页码-1) * 每页数据条数

例如:查询第二页的两条数据记录

 from: (2-1)*2=2
 size:2

分页查询并指定字段查询,只显示指定的字段

{
    "query":{
        "match_all":{
        }
    },
    "from":2,		// from表示当前页数据的起始位置,第一页第一条数据的起始位置为0
    "size":2,		// size表示每页查询数据的条数 
    "_source":["title"]		// 指定字段查询,只显示指定的字段 
}

分页查询并指定字段,对查询结果进行排序

{
    "query":{
        "match_all":{
        }
    },
    "from":0,		// from表示当前页数据的起始位置,第一页第一条数据的起始位置为0
    "size":3,		// size表示每页查询数据的条数 
    "_source":["title"],		// 指定字段查询 
    "sort":{
		"price":{
		    "order":"desc"		// 排序
		}
	}
}

多条件查询,指定多个条件进行查询

{
    "query":{
        "bool":{
            "must":[			// must条件同时成立
                {
                    "match":{
                        "category":"小米"
                    }
                },
                {
                    "match":{
                        "price":1000
                    }
                }
            ]
        }   
    }
}

{
    "query":{
        "bool":{
            "should":[			// should任意一个条件成立即可
                {
                    "match":{
                        "_id":1002
                    }
                },
                {
                    "match":{
                        "price":1000
                    }
                }
            ]
        }   
    }
}

{
    "query":{
        "bool":{
            "should":[			// should任意一个条件成立即可		
                {
                    "match":{
                        "_id":1002
                    }
                },
                {
                    "match":{
                        "category":"小米"
                    }
                }
            ],
            "filter":{			// 范围查询
                "range":{
                    "price":{
                        "gt":2000		// 价格大于2000
                    }
                }
            }
        }   
    }
}

HTTP 全文检索匹配规则

match模式,分词进行全文检索

{
    "query":{
        "match":{				// match默认是分词进行全文检索
            "category":"小华"			
        }
    }
}

match_phrase模式,完全匹配进行全文检索

{
    "query":{
        "match_phrase":{		// match_phrase 默认是不分词,完全匹配
            "category":"小华"
        }
    }
}


高亮显示

{
    "query":{
        "match_phrase":{		
            "category":"小米"
        }
    },
    "highlight":{			// 高亮显示
        "fields":{
            "category":{}
        }
    }
}

HTTP 聚合查询

{
    "aggs":{    //聚合操作
        "price_group":{     //名称,随意起名
            "terms":{   //分组
                "field":"price" //分组字段
            }
        }
    },
    "size":0    //不要原始数据
}

{
    "aggs":{    //聚合操作
        "price_avg":{     //名称,随意起名
            "avg":{   //平均值
                "field":"price" //分组字段
            }
        }
    },
    "size":0    //不要原始数据
}

HTTP 映射关系

{
    "properties":{
        "name":{
            "type":"text",      //text文本可以分词查询
            "index":true        //index支持索引查询
        },
        "sex":{
            "type":"keyword",   //keyword不能分词,必须完整匹配
            "index":true        //index支持索引查询
        },
            "tel":{
                "type":"keyword",   //keyword不能分词,必须完整匹配
                "index":false       //index不支持索引查询
            }
        }
}






以上是关于ElasticSearch的主要内容,如果未能解决你的问题,请参考以下文章

Elasticsearch笔记九之优化

使用标准库Ruby将数据标记到Elasticsearch批量中

Elasticsearch:如何在 Elasticsearch 中正确使用同义词功能

Elasticsearch:如何在 Elasticsearch 中正确使用同义词功能

Elasticsearch-PHP 索引操作

elasticsearch 特殊字段