分布式搜索--elasticsearch

2024-07-26 14:20:14 浏览数 (1)

实用篇

  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。

记录每一个学习瞬间

0 人点赞