前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >分布式搜索--elasticsearch

分布式搜索--elasticsearch

原创
作者头像
忆遂愿
发布2024-07-26 14:20:14
550
发布2024-07-26 14:20:14

实用篇

  1. ES==elasticsearch--开源分布式搜索引擎。
  2. elasticsearch:用来实现搜索、日志统计、分析、系统监控等功能。
  3. elasticsearch+kibana、Logstash、Beats == elastic stack(ELK)。
  4. elasticsearch--**核心**-存储、计算、搜索数据;可替换组件--kibana - **数据可视化**;可替换组件--Logstash、Beats - **数据抓取**。
  5. Lucene--Apache的搜索引擎类库-易扩展、高性能、基于**倒排索引**-提供搜索引擎核心API-仅支持Java语言。
  6. 数据库表--**文档**:每一条数据就是一个文档;**词条**:对文档中的内容分词,得到的词语就是词条。
  7. **正向索引**--基于**文档id创建索引**;查询词条时必须先找到文档,然后判断是否包含词条 - 数据库的模糊查询-逐条查询判断。
  8. **倒排索引**--对文档内容分词,对**词条创建索引**,并记录词条所在文档的id;查询是先根据词条查询文档id,而后获取文档。
  9. ES--**存储**-面向文档存储的,文档数据会被序列化为JSON格式;**索引**-相同类型的文档的集合;**映射**-索引中文档的字段约束信息,类似表的结构约束。
  10. MySQL与elasticsearch的概念对比、架构分析、关系。
  11. 安装部署es、kibana,需要先让es和kibana容器互联,部署单点es或kibana都是运行上传的tar包将数据导入,再运行docker命令,即可访问,具体的命令整理如下,外加注释,清晰明了。
代码语言:sh
复制
# 创建网络

docker network create es-net

# 关闭虚拟机后,查看局域网络(已配置过,重启后不影响)

docker network ls

# 导入数据

docker load -i es.tar

# 运行docker命令,部署单点es

docker run -d \

    --name es \

    -e "ES\_JAVA\_OPTS=-Xms512m -Xmx512m" \

    -e "discovery.type=single-node" \

    -v es-data:/usr/share/elasticsearch/data \

    -v es-plugins:/usr/share/elasticsearch/plugins \

    --privileged \

    --network es-net \

    -p 9200:9200 \

    -p 9300:9300 \

elasticsearch:7.12.1

# 重启后,重启容器

docker start es

# 输入地址加端口即可访问es

http://192.168.226.139:9200



# 导入数据

docker load -i kibana.tar

# 运行docker命令,部署kibana

docker run -d \

--name kibana \

-e ELASTICSEARCH\_HOSTS=http://es:9200 \

--network=es-net \

-p 5601:5601  \

kibana:7.12.1

# 重启后重启容器

docker start kibana

# 输入地址加端口即可访问kibana

http://192.168.226.139:5601

ps:(1)重启后只需要重启容器即可;(2)如果没有删除容器,重新运行docker命令部署会报名字重复错误;(3)如果不删除容器,想修改名称创建容器的话,需要在ess和kibana中的请求连接要同步,否则会报Kibana server is not ready yet的问题。

  1. 分词器的作用--创建倒排索引时对文档分词、用户搜索时,对输入的内容分词。(P83)
  2. 测试分词器、安装IK分词器。
代码语言:sh
复制
# 在kibana中测试分词器

# english-默认分词器、standard-标准分词器

POST /\_analyze

{

    "text": "好好学习,天天向上",

    "analyzer": "english"

}



# 安装ik分词器

# 查看数据卷elasticsearch的plugins目录位置

docker volume inspect es-plugins

# 到这个目录下

cd /var/lib/docker/volumes/es-plugins/\_data

# 上传elasticsearch-analysis-ik-7.12.1.zip,然后解压

unzip elasticsearch-analysis-ik-7.12.1.zip

# 不太建议上面的方式,我试过发现启动会报错,后面改了很久都是报错,不知道哪里的配置文件被修改了,然后恢复快照重新来过

# 使用FileZillar直接传输Windows下解压的文件夹,结果是成功的

# 重启es容器

docker restart es

# 查看es日志

docker logs -f es



# 测试ik分词器

# IK分词器包含两种模式

# ik\_smart:最少切分   --  被搜索的概论低-粗粒度

# ik\_max\_word:最细切分 -- 内存占用高-细粒度

GET /\_analyze

{

  "analyzer": "ik\_max\_word",

  "text": "好好学习天天向上,奥利给,噢噢点赞"

}
  1. **ik分词器**-扩展词库、停用词库。

注意当前文件的编码必须是 UTF-8 格式,严禁使用Windows记事本编辑

代码语言:sh
复制
# 打开IK分词器config目录,在IKAnalyzer.cfg.xml配置文件内容添加

# 用户可以在这里配置自己的扩展字典

<entry key="ext\_dict">ext.dic</entry>

#用户可以在这里配置自己的扩展停止词字典  \*\*\* 添加停用词词典

<entry key="ext\_stopwords">stopword.dic</entry>



# 新建一个 ext.dic,可以参考config目录下复制一个配置文件进行修改

奥利给

# 在 stopword.dic 添加停用词

噢噢

# 修改过看效果,重启es容器即可

docker restart es

# 查看 日志

docker logs -f es
  1. **索引库操作**(P85)
  2. mapping属性--mapping是对索引库中文档的约束。
  3. mapping属性包括:type:字段数据类型、index:是后创建索引-默认为true;analyzer:使用哪种分词器;properties:该字段的子字段。
  4. type简单类型--字符串:text(可分词的文本)、keyword(精确值);数值:long、integer、short、byte、double、float;布尔:boolean;日期:date;对象:object。
  5. 创建索引库、查看索引库、删除索引库、禁止修改索引库。(P86)
代码语言:sh
复制
# DSL语法

# 创建索引库名

PUT /索引库名

# 创建索引库的DSL语法例子

PUT /a

{

    "mappings": {

        "properties": {

            "info": {

                "type": "text",

                "analyzer": "ik\_smart"

            },

            "name":{

                "type": "object",

                "properties": {

                    "firstName": {

                        "type": "keyword",

                        "index": false

                    }

                }

            }

        }

    }

}



# 查看索引库

GET /索引库名

# 删除索引库

DELETE /索引库名

# 索引库和mapping一旦创建就无法修改,但是可以添加新的字段

PUT /索引库名/\_mapping

{

    "properties":{

        "新字段名":{

            "type":"integer"

        }

    }

}
  1. **文档操作**--插入文档、查看文档、删除文档(P88)
  2. 修改文档--全量修改,会删除旧文档,添加新文档;局部修改,修改指定字段值。
代码语言:sh
复制
# 插入文档

POST /索引库名/\_doc/文档id

# 查看文档

GET /索引库名/\_doc/文档id

# 删除文档

DELETE /索引库名/\_doc/文档id



# 插入的DSL语法例子 -- 索引库名与上方创建相同

POST /a/\_doc/1

{

    "info": "好好学习天天向上",

    "name": {

        "firstName": "小",

        "lastName": "盈"

    }

}



# 修改文档 -- 全量修改,会删除旧文档,添加新文档

PUT /索引库名/\_doc/文档id

PUT /a/\_doc/1

{

    "info": "好好学习天天向上",

    "email": "45543563.qq.com",

    "name": {

        "firstName": "小",

        "lastName": "盈"

    }

}

# 局部修改,修改指定字段值 -- 只能修改一个指段

POST /索引库名/\_update/文档id

POST /a/\_update/1

{

    "doc":{

        "email": "xiaoying@qq.com"

    }

}
  1. **RestClient操作索引库**(P90)
  2. 导入hotel-demo,分析hotel的mapping数据结构-字段名、数据类型、是否参与搜索、是否分词、分词器。
  3. tip:ES中支持两种**地理坐标数据类型**--geo_point:由维度和经度确定的一个点;geo_shape:有多个geo_point组成的复杂几何图形。
  4. 字段拷贝可以使用**copy_to**属性将当前字段拷贝到指定字段。
  5. 创建索引库、删除索引库、判断索引库是否存在。
  6. 索引库操作基本步骤:初始化RestHighLevelClient;创建XxxIndexRequest。xxx是Create、Get、Delete;准备DSL(Crete时需要);发送请求,调用RestHighLevelClient#indices().xxx()方法。
代码语言:sh
复制
# 酒店的mapping

PUT /hotel

{

    "mappings":{

        "properties":{

            "id":{

                "type": "keyword"

            },

            "name":{

                "type": "text",

                "analyzer": "ik\_max\_word",

                "copy\_to": "all"

            },

            "address":{

                "type": "keyword",

                "index": false

            },

            "price":{

                "type": "integer"

            },

            "score":{

                "type": "integer"

            },

            "brand":{

                "type": "keyword",

                "copy\_to": "all"

            },

            "city":{

                "type": "keyword"

            },

            "starName":{

                "type": "keyword"

            },

            "business":{

                "type": "keyword",

                "copy\_to": "all"

            },

            "location":{

                "type": "geo\_point"

            },

            "pic":{

                "type": "keyword",

                "index": false

            },

            "all":{

                "type": "text",

                "analyzer": "ik\_max\_word"

            }

        }

    }

}
  1. **RestClient操作文档**--利用JavaRestClient实现文档的CRUD。
  2. 在数据库查询酒店数据,导入到hotel索引库,实现酒店数据的CRUD。
  3. 新增文档-index、根据id查询文档-get、根据id修改文档-update、根据id删除文档-delete。
  4. 文档操作的基本步骤:初始化RestHighLevelClient;创建XxxRequest;准备参数(Index和Update时需要);发送请求,调用RestHighLevelClient#.xxx()方法;解析结果(Get时需要)。
  5. 利用JavaRestClient批量导入酒店数据到ES。

记录每一个学习瞬间

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 实用篇
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档