ElasticSearch入门笔记

这篇博客介绍了Elasticsearch的安装、测试、配置以及Kibana的使用。详细讲解了如何新建和删除索引,设置中文分词,以及数据的增删改查操作。还探讨了全文搜索、逻辑运算等查询方法。适合初学者入门。
摘要由CSDN通过智能技术生成

ElasticSearch入门笔记

  • 在网上下载并安装ElasticSearch后进入目录打开cmd,在Windows上运行

    bin\elasticsearch.bat
    

    在linux或其他系统运行

    bin\elasticsearch
    
  • 如果已经安装了curl,要测试是ES否安装成功可以在另一个cmd命令上运行命令(之后的访问都使用另一个dev_tools工具)

    curl 'http://localhost:9200/?pretty'
    

    如果未安装可以直接使用浏览器访问上面的路径,成功则会返回一个Json响应类似于以下代码

    {
    name: "PC-20160716OWUU",
    cluster_name: "elasticsearch",
    cluster_uuid: "xmZT-FzjTcqALxfoopscww",
    version: {
    number: "7.12.0",
    build_flavor: "default",
    build_type: "zip",
    build_hash: "78722783c38caa25a70982b5b042074cde5d3b3a",
    build_date: "2021-03-18T06:17:15.410153305Z",
    build_snapshot: false,
    lucene_version: "8.8.0",
    minimum_wire_compatibility_version: "6.8.0",
    minimum_index_compatibility_version: "6.0.0-beta1"
    },
    tagline: "You Know, for Search"
    }
    
  • 默认情况下,Elastic 只允许本机访问,如果需要远程访问,可以修改 Elastic 安装目录的config/elasticsearch.yml文件,去掉network.host的注释,将它的值改成0.0.0.0,然后重新启动 Elastic。

    network.host: 0.0.0.0
    

安装Kibana

  • Kibana是一个开源的分析和可视化平台,设计用于和Elasticsearch一起工作。现在已不再安装Sence了,而是使用Dev Tools工具,所以Windows直接运行kibana.bat就行了Linux同理。

  • 如果你无法进入Dev Tools页面根据页面提示下载运行相对应ES版本就行了

  • 控制台UI分为两个窗格:编辑器窗格(左侧)和响应窗格(右侧)。使用编辑器键入请求并将其提交给Elasticsearch。结果将显示在右侧的响应窗格中。

  • 在输入请求时,控制台会根据Enter / Tab提出您可以接受的建议。这些建议基于请求结构以及你的索引和类型。

使用ES

一.基本概念

  • 以下基于Elastic 6.0
  • Elastic 本质上是一个分布式数据库,允许多台服务器协同工作,每台服务器可以运行多个 Elastic 实例。
  • 单个 Elastic 实例称为一个节点(node)。一组节点构成一个集群(cluster
  • Elastic 会索引所有字段,经过处理后写入一个反向索引(Inverted Index)。查找数据的时候,直接查找该索引。

Index

  • Elastic 数据管理的顶层单位就叫做 Index(索引)。它是单个数据库的同义词。每个 Index (即数据库)的名字必须是小写。

  • 下面的命令基于ES6.0可以查看当前节点的所有 Index。也可以使用cURL类似的实现

    GET _cat/indices?v
    

Document

  • Index 里面单条的记录称为 Document(文档)。许多条 Document 构成了一个 Index。

  • Document 使用 JSON 格式表示,下面是一个例子。

    {
      "user": "张三",
      "title": "工程师",
      "desc": "数据库管理"
    }
    

Type

  • Document 可以分组,比如weather这个 Index 里面,可以按城市分组(北京和上海),也可以按气候分组(晴天和雨天)。这种分组就叫做 Type,它是虚拟的逻辑分组,用来过滤 Document。

  • 不同的 Type 应该有相似的结构(schema),举例来说,id字段不能在这个组是字符串,在另一个组是数值。这是与关系型数据库的表的一个区别。性质完全不同的数据(比如productslogs)应该存成两个 Index,而不是一个 Index 里面的两个 Type(虽然可以做到)。

  • 下面的命令可以列出每个 Index 所包含的 Type。

    GET _mapping?pretty=true
    

二.新建和删除Index

  • 新建 Index,可以直接向 Elastic 服务器发出 PUT 请求。下面的例子是新建一个名叫weather的 Index。

    PUT weather
    
  • 服务器返回一个 JSON 对象,里面的acknowledged字段表示操作成功。

    {
      "acknowledged": true,
      "shards_acknowledged": true,
      "index": "weather"
    }
    
  • 然后,我们发出 DELETE 请求,删除这个 Index。

    DELETE weather
    
  • 成功后返回acknowledged字段。

    {
      "acknowledged": true
    }
    

三.中文分词设置

  • 首先,安装中文分词插件。这里使用的是 ik,也可以考虑其他插件(比如 smartcn)。

    ./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.0.0/elasticsearch-analysis-ik-6.0.0.zip
    
  • 上面代码安装的是6.0.0版的插件,与 Elastic 6.0.0 配合使用。

    接着,重新启动 Elastic,就会自动加载这个新安装的插件。

  • 然后,新建一个 Index,指定需要分词的字段。这一步根据数据结构而异,下面的命令只针对本文。基本上,凡是需要搜索的中文字段,都要单独设置一下。

    PUT /accounts
    {
      "mappings": {
        "person": {
          "properties": {
            "user": {
              "type": "text",
              "analyzer": "ik_max_word",
              "search_analyzer": "ik_max_word"
            },
            "title": {
              "type": "text",
              "analyzer": "ik_max_word",
              "search_analyzer": "ik_max_word"
            },
            "desc": {
              "type": "text",
              "analyzer": "ik_max_word",
              "search_analyzer": "ik_max_word"
            }
          }
        }
      }
    }
    

    返回的结果

    {
      "acknowledged": true,
      "shards_acknowledged": true,
      "index": "accounts"
    }
    

四.数据操作

新增记录

  • 向指定的 /Index/Type 发送 PUT 请求,就可以在 Index 里面新增一条记录。比如,向/accounts/person发送请求,就可以新增一条人员记录。

    PUT accounts/person/1
    {
      "user": "张三",
      "title": "工程师",
      "desc": "数据库管理"
    }
    
  • 服务器返回的 JSON 对象,会给出 Index、Type、Id、Version 等信息。

    {
      "_index": "accounts",
      "_type": "person",
      "_id": "1",
      "_version": 1,
      "result": "created",
      "_shards": {
        "total": 2,
        "successful": 1,
        "failed": 0
      },
      "_seq_no": 0,
      "_primary_term": 1
    }
    
  • 如果你仔细看,会发现请求路径是/accounts/person/1,最后的1是该条记录的 Id。它不一定是数字,任意字符串(比如abc)都可以。

  • 新增记录的时候,也可以不指定 Id,这时要改成 POST 请求。

    POST accounts/person
    {
      "user": "李四",
      "title": "工程师",
      "desc": "系统管理"
    }
    

    上面代码中,向/accounts/person发出一个 POST 请求,添加一个记录。这时,服务器返回的 JSON 对象里面,_id字段就是一个随机字符串。

    {
      "_index": "accounts",
      "_type": "person",
      "_id": "JOMdEnkBNi6vmKXZ1RkS",
      "_version": 1,
      "result": "created",
      "_shards": {
        "total": 2,
        "successful": 1,
        "failed": 0
      },
      "_seq_no": 0,
      "_primary_term": 1
    }
    

    注意,如果没有先创建 Index(这个例子是accounts),直接执行上面的命令,Elastic 也不会报错,而是直接生成指定的 Index。所以,打字的时候要小心,不要写错 Index 的名称。

查看记录

  • /Index/Type/Id发出 GET 请求,就可以查看这条记录

    GET accounts/person/1?pretty=true
    

    上面代码请求查看/accounts/person/1这条记录,URL 的参数pretty=true表示以易读的格式返回。

  • 返回的数据中,found字段表示查询成功,_source字段返回原始记录。

    {
      "_index": "accounts",
      "_type": "person",
      "_id": "1",
      "_version": 1,
      "found": true,
      "_source": {
        "user": "张三",
        "title": "工程师",
        "desc": "数据库管理"
      }
    }
    
  • 如果 Id 不正确,就查不到数据,found字段就是false

    GET accounts/person/abc?pretty=true
    
    {
      "_index": "accounts",
      "_type": "person",
      "_id": "abc",
      "found": false
    }
    

删除记录

  • 删除记录就是发出 DELETE 请求。

    DELETE accounts/person/1
    

    这里先不要删除这条记录,后面还要用到。

更新记录

  • 更新记录就是使用 PUT 请求,重新发送一次数据。

    PUT accounts/person/1
    {
      "user": "张三",
      "title": "工程师",
      "desc": "数据库管理,软件开发"
    }
    

    返回结果

    {
      "_index": "accounts",
      "_type": "person",
      "_id": "1",
      "_version": 2,
      "result": "updated",
      "_shards": {
        "total": 2,
        "successful": 1,
        "failed": 0
      },
      "_seq_no": 1,
      "_primary_term": 1
    }
    

    上面代码中,我们将原始数据从"数据库管理"改成"数据库管理,软件开发"。 返回结果里面,有几个字段发生了变化。

    "_version" : 2,
    "result" : "updated",
    "created" : false
    

    可以看到,记录的 Id 没变,但是版本(version)从1变成2,操作类型(result)从created变成updatedcreated字段变成false,因为这次不是新建记录。

五.查询数据

返回所有记录

使用 GET 方法,直接请求/Index/Type/_search,就会返回所有记录。

GET accounts/person/_search

返回结果

{
  "took": 14,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 2,
    "max_score": 1,
    "hits": [
      {
        "_index": "accounts",
        "_type": "person",
        "_id": "1",
        "_score": 1,
        "_source": {
          "user": "张三",
          "title": "工程师",
          "desc": "数据库管理,软件开发"
        }
      },
      {
        "_index": "accounts",
        "_type": "person",
        "_id": "JOMdEnkBNi6vmKXZ1RkS",
        "_score": 1,
        "_source": {
          "user": "李四",
          "title": "工程师",
          "desc": "系统管理"
        }
      }
    ]
  }
}

上面代码中,返回结果的 took字段表示该操作的耗时(单位为毫秒),timed_out字段表示是否超时,hits字段表示命中的记录,里面子字段的含义如下。

  • total:返回记录数,本例是2条。
  • max_score:最高的匹配程度,本例是1
  • hits:返回的记录组成的数组。

全文搜索

  • Elastic 的查询非常特别,使用自己的查询语法,要求 GET 请求带有数据体。

    GET accounts/person/_search
    {
      "query" : { "match" : { "desc" : "软件" }}
    }
    

    上面代码使用 Match 查询,指定的匹配条件是desc字段里面包含"软件"这个词。返回结果如下。

    {
      "took": 23,
      "timed_out": false,
      "_shards": {
        "total": 5,
        "successful": 5,
        "skipped": 0,
        "failed": 0
      },
      "hits": {
        "total": 1,
        "max_score": 0.2876821,
        "hits": [
          {
            "_index": "accounts",
            "_type": "person",
            "_id": "1",
            "_score": 0.2876821,
            "_source": {
              "user": "张三",
              "title": "工程师",
              "desc": "数据库管理,软件开发"
            }
          }
        ]
      }
    }
    
  • Elastic 默认一次返回10条结果,可以通过size字段改变这个设置。

    GET accounts/person/_search
    {
      "query" : { "match" : { "desc" : "管理" }},
      "size": 1
    }
    

    上面代码指定,每次只返回一条结果。

  • 还可以通过from字段,指定位移。

    GET accounts/person/_search
    {
      "query" : { "match" : { "desc" : "管理" }},
      "from": 1,
      "size": 1
    }
    

    上面代码指定,从位置1开始(默认是从位置0开始),只返回一条结果。

逻辑运算

  • 如果有多个搜索关键字, Elastic 认为它们是or关系。

    GET accounts/person/_search
    {
      "query" : { "match" : { "desc" : "软件 系统" }}
    }
    

    返回结果如下

    {
      "took": 9,
      "timed_out": false,
      "_shards": {
        "total": 5,
        "successful": 5,
        "skipped": 0,
        "failed": 0
      },
      "hits": {
        "total": 2,
        "max_score": 0.2876821,
        "hits": [
          {
            "_index": "accounts",
            "_type": "person",
            "_id": "1",
            "_score": 0.2876821,
            "_source": {
              "user": "张三",
              "title": "工程师",
              "desc": "数据库管理,软件开发"
            }
          },
          {
            "_index": "accounts",
            "_type": "person",
            "_id": "JOMdEnkBNi6vmKXZ1RkS",
            "_score": 0.2876821,
            "_source": {
              "user": "李四",
              "title": "工程师",
              "desc": "系统管理"
            }
          }
        ]
      }
    }
    

    上面代码搜索的是软件 or 系统

  • 如果要执行多个关键词的and搜索,必须使用布尔查询

    GET accounts/person/_search
    {
      "query": {
        "bool": {
          "must": [
            { "match": { "desc": "软件" } },
            { "match": { "desc": "系统" } }
          ]
        }
      }
    }
    

    结果如下

    {
      "took": 6,
      "timed_out": false,
      "_shards": {
        "total": 5,
        "successful": 5,
        "skipped": 0,
        "failed": 0
      },
      "hits": {
        "total": 0,
        "max_score": null,
        "hits": []
      }
    }
    

s/person/_search
{
“query”: {
“bool”: {
“must”: [
{ “match”: { “desc”: “软件” } },
{ “match”: { “desc”: “系统” } }
]
}
}
}


结果如下

```json
{
  "took": 6,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 0,
    "max_score": null,
    "hits": []
  }
}

参考链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值