• Elasticsearch入门教程(未完成)


    目录

    ES是什么?

    他的优点是什么?他的原理是什么?适用于什么场景?

    安装一个ES

    安装ES集群

    如何在浏览器上看ES界面?

    ES核心操作演示

    查看版本信息

    如果设置了密码怎么登陆和查询

    如何建立表(index索引来了)

    如何删除索引?

    添加数据,修改数据?

    效率低?请求大?批处理

    es查询

    ik安装

    基本查询

    查询特定的字段?

    查询的字段带高亮显示

    查询标题应该比查询内容更重要,如何做?提高某个字段的分值

    我写了一个相近的词,但是我写错了,他能查出来吗?模糊查询Fuzzy

    我只想匹配开头包含这个字符?wildcard 通配符匹配 或者 正则regex

    我想要完整的匹配怎么办?用正则?还是有更好的方法?短语匹配

    组合查询,OR AND 等

    查询某个范围

    过滤查询

    Java操作ES

    Spark操作ES


    ES是什么?

    在这里插入图片描述

    es是一个是一个【实时的分布式搜索分析】数据库引擎,索引相当于数据库,类型相当于表,文档相当于数据,列相当于字段。

    他建立在一个全文搜索引擎库 Apache Lucene™ 基础之上。

    Lucene 可以说是当下最先进、高性能、全功能的搜索引擎库—​无论是开源还是私有,但是唯一不足的就是这个东西,特别复杂。然后,ES就把它封装起来了。为的是让你,用的简单,并且快速投入生产。

    他的优点是什么?他的原理是什么?适用于什么场景?

    比方说,你有很多新闻数据,你想查询你感兴趣的某个女明星的,如果是写sql,你得对sql进行特殊处理,比如like语句内容或者标题要含有这个字段,这样还能勉强满足,再换个场景,稍微严厉一点,你现在想查询你感兴趣的某个男明星,但是你记不清他的名字,只记得一个叫菜什么坤的。

    于是你搜索了菜什么坤,于是就没有搜索到,因为模糊匹配也匹配不到菜什么坤。而es就可以搜索到,并且你还不需要想怎么去写代码。这就是es用了分词,将词语分成了多个,然后统计排序。到这里,mysql等已经很难用了,那现在我们再换个更严厉的场景,你有杂七杂八的千万条数据,然后客户的搜索需要在1-2秒左右返回。很多传统数据库在这里就更不可能了,而es照样可以。

    他的原理,封装了lucene,使用了倒排索引,将表中所有字段的内容,分词后,然后进行了标记。所以你查询内容,或者是间断的内容,也能查询到。最重要的是,这些东西,你不需要管,他已经自动给你搞好了,除非满足不了你,你可能需要更深层的去改。

    适合搜索功能,可以组成ELK(elastic公司就4个产品,elk是他的3个产品,k用于可视化,l用于采集日志,e用于搜索),还能用来做功能搜索,绝对比mysql什么的模糊查询强多了!

    他的缺点:不适合【关系复杂】的结构,【不适合存储非常重要】的数据,如果非要一致性会大大降低他的搜索和创建速度,固如果非得数据保持一致性请使用其他数据库。

    下面是局限性详情

    局限性

    处理关系数据集
    与 MySQL 等数据库不同,Elasticsearch 并非旨在处理关系数据。 Elasticsearch 允许你在数据中建立简单的关系,例如父子关系和嵌套关系,但会降低性能(分别在搜索时间和索引时间)。必须对 Elasticsearch 上的数据进行非规范化(在文档中复制或添加冗余字段,以避免必须加入数据)以改进搜索和
    索引/更新性能。

    如果你需要让数据库管理关系并在不同类型的链接数据之间强制执行一致性规则,以及维护规范化的数据记录,那么 Elasticsearch 可能不是适合这项工作的工具。


    执行 ACID 事务
    Elasticsearch 中的单个请求支持 ACID 属性。 但是 Elasticsearch 没有事务的概念,所以不提供 ACID 事务。

    在单个请求级别,ACID 属性可以实现如下:

    Atomictiy 是通过发送写入请求来实现的,该请求将在所有活动分片上成功或失败。请求无法部分成功。
    通过写入主分片来实现 Consistency。数据复制在返回成功响应之前同步发生。这意味着在写入请求之后所有分片上的所有读取请求都将看到相同的响应。
    提供 Isolation,因为可以成功处理并发写入或更新(即删除和写入)而不受任何干扰。
    实现了 Durability,因为一旦将文档写入 Elasticsearch,它就会持续存在,即使在系统发生故障的情况下也是如此。 Elasticsearch 上的写入不会立即持久化到磁盘上的 Lucene 段,因为 Lucene 提交是相对昂贵的操作。相反,文档被写入事务日志(称为 translog)并定期刷新到磁盘中。如果一个节点在数据刷新之前崩溃了,translog 中的操作将在启动时恢复到 Lucene 索引中。
    如果 ACID 事务对你的用例很重要,那么 Elasticsearch 可能不适合你。
    ————————————————
    版权声明:本文为CSDN博主「Elastic 中国社区官方博客」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/UbuntuTouch/article/details/98871531

    安装一个ES

    es是java写的,然后你要装个和es版本匹配的jdk版本

    elasticsearch搭建_我要用代码向我喜欢的女孩表白的博客-CSDN博客

    安装ES集群

    前提,你根据我的上个章节,将单节点安装完成后,在来看这章。

    es集群搭建_我要用代码向我喜欢的女孩表白的博客-CSDN博客

    如何在浏览器上看ES界面?

    谷歌浏览器安装ElaticSearch插件,对es进行crud

     点击下方直接下载(我的私有库)

    https://learningfriend.cn:8081/feedBack/hadoop/ad谷歌插件.rar

    解压后,放到英文目录,名称改成英文,然后

    开启开发者,加载解压文件,注意不要进到目录里面

    ES核心操作演示

    RESTful风格(指的是使用get或者post等请求去操作服务),这也是操作es最基础的方法,其他api如java(es主要是由java写的,对Java支持更好)、python等,操作方法可能不同但是最终的结果相同。固这里采用restful风格进行演示。

    • 查看版本信息

    在cmd中执行(也可以postman或者任何请求的方式)

    curl -XGET "http://192.168.9.102:9200" -H "Content-Type: application/json"

     从中我们能看到

    minimum_wire_compatibility_version 代表最低【通信】的版本,能勉强组成集群

    minimum_index_compatibility_version 不能通信了,只能读他的数据,最低读数据的版本

    【6.0以下】的数据他不兼容(所以如果你的其他节点有6.0的,赶紧迁移到7.9.3上吧,如果是老的es数据,你得手动进行数据清洗了)

    • 如果设置了密码怎么登陆和查询

    curl链接es

    通过-u (开头是账号,后面是密码,用:分开)

    curl -XGET -u "elastic:changeme" 'http://localhost:9200/' -H 'Content-Type: application/json'

    postman链接es

    ES——使用Postman连接Elasticsearch_es postman用户名密码_FlyLikeButterfly的博客-CSDN博客

    • 如何建立表(index索引来了)

    index是动名词,表示建立索引或索引名词

    索引你添加数据的时候,会自动创建,如果你想要更加规范你可以自己手动创建。

    添加数据自动创建

    curl写起来不太方便,我现在改用postman演示

    其中put请求是添加数据,192.168.9.102:9200/game/_doc/1

    game是索引名;_doc表示文档类型;1是id号

    在去插件中查看(索引建立成功了,并且自动备份了1份,到另一个节点上了)

    手动创建

    索引名称和分片数

    PUT /indexName
        { "settings": { "number_of_shards": 1 }} 
     

    创建一个索引 | Elasticsearch: 权威指南 | Elastic

    当然他还支持索引模板

    索引模板 | Elasticsearch: 权威指南 | Elastic

    将原来的put请求改成delete就可以了,索引是唯一的

    • 添加数据,修改数据?

    1.通过put方式添加,与自动建立索引相同。

    如果两次添加的id相同,那么则会替换原来的数据

    2. 修改数据,一般通过post,以及_update后缀修改(其实他的更新底层也是put方式,把原来的数据帮你复制下来了,然后把新加的内容更新过去,在重新创建)

    post请求,192.168.9.102:9200/game/_doc/1/_update

    牛逼的是,他还支持脚本的方式

    • 效率低?请求大?批处理

    批处理请求为post,请求url加 _bulk

    _doc/_bulk

    他的批量很有意思,是写两行才代表一个操作执行,第1个行是写的操作位置(如索引,类型,id),第2行是真正的内容

    发送内容如下

    {"actionName":{"_index":"indexName", "_type":"typeName","_id":"id"}}
    {"field1":"value1", "field2":"value2"}


    actionName:表示操作类型,主要有create,index,delete和update

    对应,新增数据,新增索引,删除,更新

    如新增2条数据 (这里最后一行要加1个空行,es是以末尾的空行【\\n】来识别他是结尾的)

    {"create":{"_index":"game", "_type":"_doc","_id":"2"}}

    {"name":"人在江湖飘", "date":"2023-01-29 13:36:15","introduction":"你在一个偏远的山村出生,没有见过什么世面,唯一相伴的只有奶奶,可是有一天奶奶消失了...","url":"5321234"}

    {"create":{"_index":"game", "_type":"_doc","_id":"3"}}

    {"name":"人在江湖飘2", "date":"2023-01-29 13:36:15","introduction":"你回来了,除掉狼妖后,将家里的房屋翻修了一下,决定...","url":"5321235"}


     

    es查询

    es的主要作用就是查询,这里内容较多,所以用大标题来介绍查询

    ik安装

    es会对中文进行分词,但是效果不理想,这里我们需要下载专门的中文分词器ik

    ik安装步骤:

    注意ik版本下载一定要与你的当前es的版本相同

    别下错包了,

    下载ik

    Releases · medcl/elasticsearch-analysis-ik · GitHub

    将ik解压后放入你的es目录/plugins/ik下(第一种安装方法,我们就用这种)

    重启es

    建立一个/install/ES/plugins,在plugins目录下创建一个ik,将刚下载的zip中的内容解压进去

    我用的是docker ,把之前的给停止掉,需要重新挂载(我是集群,不影响停止,他会自动恢复数据)

    这个是我之前的集群搭建中使用的docker方式

    docker run -e ES_JAVA_OPTS="-Xms256m -Xmx256m" -d -p 9200:9200 -p 9300:9300 \

    -v /install/ES/config/es1.yml:/usr/share/elasticsearch/config/elasticsearch.yml \

    -v /install/ES/data1:/usr/share/elasticsearch/data \

    -v /install/ES/plugins:/usr/share/elasticsearch/plugins \

    --name elasticsearch01 docker.io/elasticsearch:7.9.3

    docker run -e ES_JAVA_OPTS="-Xms256m -Xmx256m" -d -p 9201:9201 -p 9301:9301 \

    -v /install/ES/config/es2.yml:/usr/share/elasticsearch/config/elasticsearch.yml \

    -v /install/ES/data2:/usr/share/elasticsearch/data \

    -v /install/ES/plugins:/usr/share/elasticsearch/plugins \

    --name elasticsearch02 docker.io/elasticsearch:7.9.3

    docker run -e ES_JAVA_OPTS="-Xms256m -Xmx256m" -d -p 9202:9202 -p 9302:9302 \

    -v /install/ES/config/es3.yml:/usr/share/elasticsearch/config/elasticsearch.yml \

    -v /install/ES/data3:/usr/share/elasticsearch/data \

    -v /install/ES/plugins:/usr/share/elasticsearch/plugins \

    --name elasticsearch03 docker.io/elasticsearch:7.9.3

    启动完成后,测试分词效果。

    get请求,后面加_analyze

    索引名为game

    http://192.168.9.102:9200/game/_analyze

    内容为(ik_max_word代表细粒度中文分词)

    {

    "text":"中华人民共和国MN","analyzer":"ik_max_word"

    }

    成功

    基本查询

    这两种查询一样,一般我们用post,毕竟get的大小是有限制的

    get查询

    ip:9200/game/_doc/_search?q='刺子'

    post查询

    http://192.168.9.102:9200/game/_doc/_search

    {
        "query": {
            "multi_match" : {
                "query" : "小"
            }
        }
    }

    查询特定的字段?

     匹配有两种,多字段(multi_match)和单字段(match),由于多字段包含单字段,所以你可以全用多字段。

     post查询

    http://192.168.9.102:9200/game/_doc/_search

    {

        "query": {

            "multi_match" : {

                "query" : "社会",

                "fields" : ["introduction"]

            }

        }

    }

    多个字段用【逗号】分割并加上【引号】,如 "fields" : ["introduction","name"]

    查询的字段带高亮显示

    post请求

    http://192.168.9.102:9200/game/_doc/_search

    {

        "query": {

            "match" : {

                "name" : "刺字"

            }

        },

        "size": 2,

        "from": 0,

        "_source": [],

        "highlight": {

            "fields" : {

                "name" : {}

            }

        }

    }

    match是待搜索字段,highlight是对哪个匹配上的字段高亮显示,source代表返回哪些,不写就是返回全部字段。name是其中一个字段的名称,若name匹配了,会将他高亮出来

    多字段查询

    {
        "query": {
            "multi_match" : {
                "query" : "刺子 历险记",
                "fields": ["name", "date"]

            }
        }
    }
     

    查询标题应该比查询内容更重要,如何做?提高某个字段的分值

    POST http://192.168.9.102:9200/game/_doc/_search

    {
        "query": {
            "multi_match" : {
                "query" : "elasticsearch guide",
                "fields": ["title", "summary^3"]
            }
        },
        "_source": ["title", "summary", "publish_date"]
    }
    红色部分是将此字段的分数提高3倍

    我写了一个相近的词,但是我写错了,他能查出来吗?模糊查询Fuzzy

    如果是英文,可以根据字母的距离相似度查询,如果是中文,只能存在类似的字典中了。英文肯定没问题,es本身就可以,如果是中文呢?我们试一下我的ik有没有这种相似的词典。

    POST http://192.168.9.102:9200/game/_doc/_search

    {

        "query": {

            "multi_match" : {

                "query" : "字",

                "fields": [],

                "fuzziness": "AUTO"

            }

        },

        "_source": [],

        "size": 1

    }

    刺和次是拼音相同,测试后发现没有结果

    我们来测一下,字相同的,字和子和类似,还是没有查到。

    说明ik中默认没有开启这个字典或者没有这个字典
     

    我只想匹配开头包含这个字符?wildcard 通配符匹配 或者 正则regex

    POST http://192.168.9.102:9200/game/_doc/_search

    {
        "query": {
            "wildcard" : {
                "authors" : "t*"
            }
        },
        "_source": ["title", "authors"],
        "highlight": {
            "fields" : {
                "authors" : {}
            }
        }
    }

    正则匹配(包含通配符功能,并且强于通配符)

    {
        "query": {
            "regexp" : {
                "authors" : "t[a-z]*y"
            }
        },
        "_source": ["title", "authors"],
        "highlight": {
            "fields" : {
                "authors" : {}
            }
        }
    }

    我想要完整的匹配怎么办?用正则?还是有更好的方法?短语匹配

    POST /bookdb_index/book/_search
    {
        "query": {
            "multi_match" : {
                "query": "search engine",
                "fields": ["title", "summary"],
                "type": "phrase",
                "slop": 3
            }
        },
        "_source": [ "title", "summary", "publish_date" ]
    }
     

    组合查询,OR AND 等

    查询字符串 类型(query_string)的查询提供了一个方法,用简洁的简写语法来执行 多匹配查询、 布尔查询 、 提权查询、 模糊查询、 通配符查询、 正则查询 和范围查询。下面的例子中,我们在那些作者是 “grant ingersoll” 或 “tom morton” 的某本书当中,使用查询项 “search algorithm” 进行一次模糊查询,搜索全部字段,但给 summary 的权重提升 2 倍。
     

    _all代表其他字段,你可以自己写

    {
        "query": {
            "query_string" : {
                "query": "(saerch~1 algorithm~1) AND (grant ingersoll)  OR (tom morton)",
                "fields": ["_all", "summary^2"]
            }
        },
        "_source": [ "title", "summary", "authors" ],
        "highlight": {
            "fields" : {
                "summary" : {}
            }
        }
    }
     

    查询某个范围

    POST /bookdb_index/book/_search
    {
        "query": {
            "range" : {
                "publish_date": {
                    "gte": "2015-01-01",
                    "lte": "2015-12-31"
                }
            }
        },
        "_source" : ["title","publish_date","publisher"]
    }
     

    过滤查询

    Filtered

    过滤查询允许你可以过滤查询结果。对于我们的例子中,要在标题或摘要中检索一些书,查询项为 Elasticsearch,但我们又想筛出那些仅有 20 个以上评论的。

    POST /bookdb_index/book/_search
    {
        "query": {
            "bool": {
                "must" : {
                    "multi_match": {
                        "query": "elasticsearch",
                        "fields": ["title","summary"]
                    }
                },
                "filter": {
                    "range" : {
                        "num_reviews": {
                            "gte": 20
                        }
                    }
                }
            }
        },
        "_source" : ["title","summary","publisher", "num_reviews"]
    }
     

    多重过滤

    Multiple Filters

    多重过滤 可以结合 布尔查询 使用,下一个例子中,过滤查询决定只返回那些包含至少20条评论,且必须在 2015 年前出版,且由 O’Reilly 出版的结果。

    POST /bookdb_index/book/_search
    {
        "query": {
            "filtered": {
                "query" : {
                    "multi_match": {
                        "query": "elasticsearch",
                        "fields": ["title","summary"]
                    }
                },
                "filter": {
                    "bool": {
                        "must": {
                            "range" : { "num_reviews": { "gte": 20 } }
                        },
                        "must_not": {
                            "range" : { "publish_date": { "lte": "2014-12-31" } }
                        },
                        "should": {
                            "term": { "publisher": "oreilly" }
                        }
                    }
                }
            }
        },
        "_source" : ["title","summary","publisher", "num_reviews", "publish_date"]
    }

    Java操作ES

    SpringBoot(java)操作elasticsearch_我要用代码向我喜欢的女孩表白的博客-CSDN博客

    Spark操作ES

    spark读取elasticSerach_我要用代码向我喜欢的女孩表白的博客-CSDN博客_spark 连接es

    参考:

    基础入门 | Elasticsearch: 权威指南 | Elastic

    02-ElasticSearch创建索引_elasticsearch 手动创建索引_zhqlee的博客-CSDN博客

    ElasticSearch(二):索引、文档增删改查、批量操作_elasticsearch 批量修改_Men-DD的博客-CSDN博客

    ElasticSearch查询(一) - Martin8866 - 博客园

    ElasticSearch查看分词结果 - 简书

    17个有用的elasticsearch查询_小兜全糖(cxc)的博客-CSDN博客

  • 相关阅读:
    PPP协议(PPP协议链路建立过程、PAP、CHAP、华为虚拟网络设备配置)
    啊喂,Kafka懂了吗?会用吗?学习使用指南看过吗?
    蓝桥杯入门即劝退(九)罗马数字
    treap树:hdu 4585 Shaolin
    在UE5中制作UI环形进度条
    Minecraft 服务器安装Forge 并添加Mod
    Elasticsearch中RestClient使用
    RPA是什么?怎么成为RPA高手?
    湖仓一体技术解读|流式计算实现秒级数据入湖
    【Java 快速复习】垃圾回收算法 & 垃圾回收器
  • 原文地址:https://blog.csdn.net/qq_38403590/article/details/127428910