elasticsearch7安装和简单查询

2023年 8月 13日 114.9k 0

什么是全文搜索引擎

The Elastic Stack, 包括 Elasticsearch、Kibana、Beats 和 Logstash(也称为 ELK Stack)。能够安全可靠地获取任何来源、任何格式的数据,然后实时地对数据进行搜索、分析和可视化。Elaticsearch,简称为ES, ES是一个开源的高扩展的分布式全文搜索引擎,是整个Elastic Stack技术栈的核心。它可以近乎实时的存储、检索数据;本身扩展性很好,可以扩展到上百台服务器,处理PB级别的数据。
Google,百度类的网站搜索,它们都是根据网页中的关键字生成索引,我们在搜索的时候输入关键字,它们会将该关键字即索引匹配到的所有网页返回;还有常见的项目中应用日志的搜索等等。对于这些非结构化的数据文本,关系型数据库搜索不是能很好的支持。

一般传统数据库,全文检索都实现的很鸡肋,因为一般也没人用数据库存文本字段。进行全文检索需要扫描整个表,如果数据量大的话即使对SQL的语法优化,也收效甚微。建立了索引,但是维护起来也很麻烦,对于 insert 和 update 操作都会重新构建索引。

基于以上原因可以分析得出,在一些生产环境中,使用常规的搜索方式,性能是非常差的:

搜索的数据对象是大量的非结构化的文本数据。

文件记录量达到数十万或数百万个甚至更多。

支持大量基于交互式文本的查询。

需求非常灵活的全文搜索查询。

对高度相关的搜索结果的有特殊需求,但是没有可用的关系数据库可以满足。

对不同记录类型、非文本数据操作或安全事务处理的需求相对较少的情况。

为了解决结构化数据搜索和非结构化数据搜索性能问题,我们就需要专业,健壮,强大的全文搜索引擎,这里说到的全文搜索引擎指的是目前广泛应用的主流搜索引擎。它的工作原理是计算机索引程序通过扫描文章中的每一个词,对每一个词建立一个索引,指明该词在文章中出现的次数和位置,当用户查询时,检索程序就根据事先建立的索引进行查找,并将查找的结果反馈给用户的检索方式。这个过程类似于通过字典中的检索字表查字的过程。

elasticsearch的安装(docker)

elasticsearch与spring boot版本存在兼容性,其实就是与spring中的data必须版本匹配才行。
这里我使用的是spring boot2.7.12,elasticsearch则使用7.17.3

image.png

  • 安装es
  • docker run --name es7 
    -p 9200:9200 -p 9300:9300  
    -e "discovery.type=single-node"  
    -e ES_JAVA_OPTS="-Xms256m -Xmx256m"  
    -d elasticsearch:7.17.3
    

    -d:后台启动

    --name:容器名称

    -p:端口映射

    -e:设置环境变量

    discovery.type=single-node:单机运行

    如果启动不了,可以加大内存设置:-e ES_JAVA_OPTS="-Xms512m -Xmx512m"

    注意: es默认内存占用是1G以上,但是在平常测试使用中不会用这么大的,我们修改为256m者512m

  • 进入容器修改config下的elasticsearch.yml配置,修改
  • cluster.name: "docker-cluster"
    network.host: 0.0.0.0
    http.cors.enabled: true
    xpack.security.enabled: false
    http.cors.allow-origin: "*"
    
  • 进入容器安装ik分词器。默认分词不好用,在plugins下去下载ik分词器
  • elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.17.3/elasticsearch-analysis-ik-7.17.3.zip

    上面步骤完成后重启 容器 docker restart 容器id

    4.安装kibana界面,或者使用api工具软件等

    docker run --name kibana 
     -e ELASTICSEARCH_HOSTS=http://esIP地址:9200 
     -p 5601:5601 -d kibana:7.17.3
    
  • 进入容器修改config下的kibana.yml配置,重启容器
  • server.name: kibana
    server.host: "0"
    elasticsearch.hosts: [ "http://esIP地址:9200" ]
    xpack.monitoring.ui.container.elasticsearch.enabled: true
    i18n.locale: zh-CN
    

    elasticsearch的基本查询

    索引创建,查询,删除

    对比关系型数据库,创建索引就等同于创建数据库,索引(index)就是文档数据的开始,也必须要有索引。

    在接口测试工具中,创建索引必须使用put请求,也就是http://ip地址:端口号/索引名称。

    查看全部索引
    GET _cat/indices?v   ?V可以查看更全的信息
    
    创建索引
    PUT index  注意:索引名不能参杂大写字母,可以写中文
    
    删除索引
    DELETE index
    
    索引查询
    GET index
    

    查看索引对应头的含义

    image.png

    创建文档,修改文档,删除文档,

    索引创建好了,接下来我们创建文档,并添加数据,这里的文档,可以类比关系数据库中的表数据,添加数据的格式是json格式。发起post和put请求,其中post不是密等性的,put是密等性的,这里我们就使用post。IP地址:9200/shopping/_doc 其中_doc表示创建文档的意思,使用post请求创建文档必须要由json格式的请求体,否则会报错。

    创建文档

    post  http://localhost:9200/index/_doc
    {
        "name":"张三",
        "age": 20
    }
    -----------------------------------------
    {
        "_index": "index",
        "_type": "_doc",
        "_id": "Qr5N1YkBmrPK3k6pyF3T",
        "_version": 1,
        "result": "created",
        "_shards": {
            "total": 2,
            "successful": 1,
            "failed": 0
        },
        "_seq_no": 2,
        "_primary_term": 1
    }
    

    上面这种请求方式必须是post,也就是说请求没有指定明确的主键id,没有保证幂等性,所以不能使用put,但是下面这种就可以使用put,因为指定了id。

    post/put  http://localhost:9200/index/_doc/1
    {
        "name": "张三",
        "age": 20
    }
    ----------------------------------
    {
        "_index": "index",
        "_type": "_doc",
        "_id": "1",
        "_version": 1,
        "result": "created",
        "_shards": {
            "total": 2,
            "successful": 1,
            "failed": 0
        },
        "_seq_no": 3,
        "_primary_term": 1
    }
    

    查看文档

  • 查询全部文档
  • GET  http://localhost:9200/index/_search
    ------------------------------------------
    {
        "took": 837,
        "timed_out": false,
        "_shards": {
            "total": 1,
            "successful": 1,
            "skipped": 0,
            "failed": 0
        },
        "hits": {
            "total": {
                "value": 2,
                "relation": "eq"
            },
            "max_score": 1.0,
            "hits": [
                {
                    "_index": "index",
                    "_type": "_doc",
                    "_id": "1",
                    "_score": 1.0,
                    "_source": {
                        "name": "张三",
                        "age": 20
                    }
                },
                {
                    "_index": "index",
                    "_type": "_doc",
                    "_id": "2",
                    "_score": 1.0,
                    "_source": {
                        "name": "李四",
                        "age": 20
                    }
                }
            ]
        }
    }
    
  • 根据文档的唯一id查询文档
  • GET  http://localhost:9200/index/_doc/1
    -----------------------------
    {
        "_index": "index",
        "_type": "_doc",
        "_id": "1",
        "_version": 1,
        "_seq_no": 0,
        "_primary_term": 1,
        "found": true,
        "_source": {
            "name": "张三",
            "age": 20
        }
    }
    

    修改文档

  • 全局修改
  • POST  http://localhost:9200/index/_doc/1
    {
        "name":"张大炮",
        "age": 40,
        "sex": "未知",
        "address": "轮回转世"
    }
    -----------------------
    {
        "_index": "index",
        "_type": "_doc",
        "_id": "1",
        "_version": 2,
        "result": "updated",  对一个文档中的id反复post请求,只会是updated
        "_shards": {
            "total": 2,
            "successful": 1,
            "failed": 0
        },
        "_seq_no": 2,
        "_primary_term": 1
    }
    

    上面这种指挥对这个文档中对应的id全部修改

  • 修改字段
  • POST http://localhost:9200/index/_update/1
    {
        "doc":{
            "age": 200
        }
    }
    -------------------------------
    {
        "_index": "index",
        "_type": "_doc",
        "_id": "1",
        "_version": 3,
        "result": "updated",
        "_shards": {
            "total": 2,
            "successful": 1,
            "failed": 0
        },
        "_seq_no": 3,
        "_primary_term": 1
    }
    

    删除文档

    DELETE http://localhost:9200/index/_doc/1
    -----------------------------
    {
        "_index": "index",
        "_type": "_doc",
        "_id": "2",
        "_version": 2,  对数据库的操作都会更新版本(前面我已经删除一个了)
        "result": "deleted",  删除一个不存在的文档显示  not_found
        "_shards": {
            "total": 2,
            "successful": 1,
            "failed": 0
        },
        "_seq_no": 6,
        "_primary_term": 1
    }
    

    条件删除文档

    一般删除数据都是根据文档的唯一性标识进行删除,实际操作时,也可以根据条件对多条数据进行删除

    POST  http://localhost:9200/index/_delete_by_query
    {
        "query":{  查询
            "match":{   精确匹配
                "category": "华为"
            }
        }
    }
    --------------------------------
    {
        "took": 7,
        "timed_out": false,  是否超时
        "total": 1,  删除后剩余总数
        "deleted": 1,  删除数量
        "batches": 1,
        "version_conflicts": 0,
        "noops": 0,
        "retries": {
            "bulk": 0,
            "search": 0
        },
        "throttled_millis": 0,
        "requests_per_second": -1.0,
        "throttled_until_millis": 0,
        "failures": []
    }
    

    相关文章

    JavaScript2024新功能:Object.groupBy、正则表达式v标志
    PHP trim 函数对多字节字符的使用和限制
    新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
    使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
    为React 19做准备:WordPress 6.6用户指南
    如何删除WordPress中的所有评论

    发布评论