ElasticSearch 基础
持续更新…
什么是ElasticSearch?
Elasticsearch 是一个高扩展的分布式全文检索免费开源搜索和分析引擎,适用于包括文本、数字、地理空间、结构化和非结构化数据等在内的所有类型的数据。
Elasticsearch 在 Apache Lucene 的基础上开发而成,由 Elasticsearch N.V.(即现在的Elastic)于 2010 年首次发布。Elasticsearch 以其简单的 REST 风格 API、分布式特性、速度和可扩展性而闻名,是 Elastic Stack 的核心组件;Elastic Stack 是一套适用于数据采集、扩充、存储、分析和可视化的免费开源工具。
ES是利用Java开发并且是当前最流行的开源企业级搜索引擎。能够达到实时搜索,稳定,可靠,快速,安装使用方便。
ElasticSearch安装
ES启动这个有点占用内存…
9300端口为ElasticSearch集群间组件的通信端口,9200端口为浏览器访问的HTTP协议的RESTful风格端口
输入相应的URL,结果为:
读者可以直接在/config目录下的jvm.options文件中修改JVM虚拟内存配置:
-Xmx1g
-Xmx1g
基本概念
ElasticSearch与关系型数据库对比(8.x版本及以上版本将废弃Type…):
什么是倒排索引?
在倒排索引中关键词是主键,每个关键词都对应着一系列文件,这些文件中都出现了这个关键词。这样当用户搜索某个关键词时,排序程序在倒排索引中定位到这个关键词,就可以马上找出所有包含这个关键词的文件。
简单使用
基本Rest命令:
PUT方式创建索引(遵循幂等性):
http://localhost:9200/test
PUT方式创建特定映射类型的索引(遵循幂等性):
PUT /students
{
"mappings": {
"properties": {
"naem": {
"type": "text"
},
"age": {
"type": "long"
},
"grade": {
"type": "text"
},
"date": {
"type": "date"
}
}
}
}
PUT方式创建文档(遵循幂等性):
如果文档字段没有指定,那么ES会自动的配置属性…
PUT /test/_doc/1
{
"name":"张三",
"age": 20,
"date": "2021-10-19"
}
GET方式获取索引信息:
http://localhost:9200/test
DELETE方式删除索引:
http://localhost:9200/test
DELETE删除文档:
http://localhost:9200/test/_doc/2000
POST方式添加文档(默认不遵循幂等性):
POST方式添加自定义_id的文档:
http://localhost:9200/students/_doc/2000
{
"name":"张三",
"age":"20",
"grade":"一班"
}
GET方式主键查询文档:
http://localhost:9200/students/_doc/2000
GET方式全查询所有文档:
http://localhost:9200/students/_doc/_search
PUT方式全量修改文档:
http://localhost:9200/students/_doc/2000
{
"grade":"三班"
}
POST方式局部修文档字段信息(或者新增字段…):
http://localhost:9200/students/_update/2000
{
"doc":{
"grade":"三班"
}
}
GET条件查询:
term: 精确查询
match: 使用分词器查询
结果分词匹配,只查询"name"字段带有"一"和”班“值的所有文档
GET /students/_doc/_search
{
"query":{
"match": {
"grade": "一班"
}
}
}
结果精确匹配,返回name包含"张四"的所有文档
GET /students/_search
{
"query": {
"term": {
"name": "张四"
}
}
}
结果过滤,结果返回字段名为"name"的文档
GET /students/_doc/_search
{
"query":{
"match": {
"grade": "一班"
}
},
"_source": ["name"]
}
结果排序,按照降序排序(升序排列为"asc")输出
GET /students/_doc/_search
{
"query":{
"match": {
"grade": "一班"
}
},
"sort":{
"age":{
"order":"desc"
}
}
}
分页查找,页从0开始,页面大小为2
GET /students/_doc/_search
{
"query":{
"match": {
"grade": "一班"
}
},
"from": 0,
"size": 2
}
多条件查询,查询所有"name"字段包含"张",“三”,并且"grade"字段包含"一","班"的所有文档(should字段具有’or’的意思,must_not字段是must字段的补集… )
GET /students/_doc/_search
{
"query":{
"bool": {
"must": [
{
"match":{
"name":"张三"
}
},
{
"match":{
"grade":"一班"
}
}
]
}
}
}
区间查询,查找所有"age"字段大于20并且小于25的文档(lt字段是小于,gte大于等于,lte小于等于)
GET /students/_search
{
"query":{
"bool": {
"filter": {
"range":{
"age": {
"gt": 20,
"lt": 25
}
}
}
}
}
}
高亮显示,对所有desc属性包含了"三"进行高亮显示
GET /students/_search
{
"query": {
"match": {
"desc": "三"
}
},
"highlight": {
"fields": {
"desc": {}
}
}
}
高亮显示,对所有的包含了"三"的desc属性进行添加自定义标签
GET /students/_search
{
"query": {
"match": {
"desc": "三"
}
},
"highlight": {
"pre_tags": "<p style='color:red'>",
"post_tags": "</p>",
"fields": {
"desc": {}
}
}
}
可视化界面安装
Elasticsearch-Head
首先需要安装Node.js以及npm(版本尽量不能太高),然后才能安装该插件…
git clone git://github.com/mobz/elasticsearch-head.git
cd elasticsearch-head
npm install # 依赖包下载
npm run start # 启动
结果:
跨域问题解决:
进入elasticsearch安装目录下的config,找到elasticsearch.yml文件,添加内容
## 跨域问题解决 ##
http.cors.enabled: true
http.cors.allow-origin: "*"
Kibana
简单地说,就是开源的数据分析和可视化平台…
安装路径下的bin目录下执行kibana.bat文件启动
修改为母语(config/kibana.yml):
i18n.locale: "zh-CN"
IK分词器插件
什么是IK分词器?
分词:即把一段中文或者别的词汇分成一个一个的关键字,我们在搜索时会把自己的信息进行分词,会把数据库中或索引库中的数据进行分词,然后进行一个匹配操作,默认的中文分词是将每个字看成一个词,当时这显然不合理,如:“给岁月以文明"会被分为"给”,“岁”,“月”,“以”,“文”,“明”,这个时候就需要IK分词器来解决这个问题…
下载后放入到elasticsearch中的plugins目录然后重启ES即可
自定义分词器分词配置
进入到IK分词器的config目录下,创建==.dic==后缀文件:
添加内容到my.dic,保存:
修改IKAnalyzer.cfg.xml内容,保存:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
<comment>IK Analyzer 扩展配置</comment>
<!--用户可以在这里配置自己的扩展字典 -->
<entry key="ext_dict">my.dic</entry>
<!--用户可以在这里配置自己的扩展停止词字典-->
<entry key="ext_stopwords"></entry>
<!--用户可以在这里配置远程扩展字典 -->
<!-- <entry key="remote_ext_dict">words_location</entry> -->
<!--用户可以在这里配置远程扩展停止词字典-->
<!-- <entry key="remote_ext_stopwords">words_location</entry> -->
</properties>
最后记得不要忘记重启ES了…
结果测试:
可以看到中国空间站已经是一个整体,是一个最小划分…