近期接触到搜索引擎ElasticSearch,简单做了一下学习记录。

 

ES的来源

ES全称ElasticSearch,是一种分布式全文搜索引擎,基于Lucene(全文搜索框架)封装和开元而来。

 

ES的基本概念

索引(Index):一个索引就是含有某些相似特性的文档的集合。

  • 一个索引需要有一个名称作为唯一标识
  • 名称必须是小写
  • 名通过文档去执行索引,搜索,更新和删除操作。

类型(Type):一个类型是索引中的一个分类,可以在同一索引中存储不同类型的文档。

文档(Document):一个文档必须指定一个在索引中的类型,文档是可被索引的数据的基础单元。文档可以用JSON格式表现。

 

理解索引

索引和DB的结构比较相似,一个ES集群可以包含多个索引(indices)(数据库),每个索引库可以包含多个类型(types)(表),每一个类型包含多个文档(documents)(行),然后每个文档包含多个字段(Fields)(列)。

即:

Elasticsearch -> 索引库Indices -> 类型Types -> 文档Documents -> 字段Fields
 关系数据库(MYSQL) -> 数据库DB-> 表TABLE-> 行ROW-> 列Column

 

DSL查询

ES提供的查询语言叫做DSL查询(Query DSL),DSL有一些特定的语法。

可以在终端使用命令去调用,也可以直接通过Jmeter或者Postman工具进行ES接口的调用。最常用的查询就是结构索引的查询,以及关键字结果的查询。

工具https请求语法:域名:端口/索引的名称/_search?pretty&q=city:"beijing"

终端调用语法:

  • 查询Index的结构

$ curl -XGET域名:端口/索引的名称/_doc/_mapping?pretty

{

  "index_name" : {

    "mappings" : {

      "_doc" : {

        "dynamic" : "strict",

        "properties" : {

          "city" : {

            "type" : "keyword"

          },

          "travel" : {

            "type" : "keyword"

          }

        }

      }

    }

  }

}

dynamic

dynamic是mapping的属性,定义了如何处理新增文档中包含的新增字段,有3个值可选:

  • true,允许新增文档中包含新增字段,并且新增字段也会被索引搜索,也是默认值
  • false, 允许新增文档包含新字段,但文档中包含的新增字段无法被索引
  • strict, 不允许新增文档中包含新增字段

 

  • 查询Index特定的关键字
$ curl -XGET域名:端口/索引的名称/_doc/_search?pretty\&size=10\&q=city:"beijing"
{

  "took":2,

  "timed_out":false,

  "_shards":{"total":5,"successful":5,"failed":0},

  "hits":{

    "total":2,

    "max_score":1.0,

    "hits":[

      {

        "_index":"product",

        "_type":"_doc",

        "_id":"1",

        "_score":1.0,

        "_source": {

          "has_ticket": "yes",

          "city": "beijing",

          "travel": "The Great Wall",

        }

      },

      {

        "_index":"accounts",

        "_type":"person",

        "_id":"2",

        "_score":1.0,

        "_source": {

          "has_ticket": "yes",

          "city" : "beijing",

          "travel" : "Forbidden City",

        }

      }

    ]

  }}

返回结果的释义:

took:返回的记录总数
timed_out:表示是否超时
hits:表示命中的记录,hit里面子字段的含义如下
         total:返回记录数,本例是2条
         max_score:最高的匹配程度,因为每条记录都会返回一个_score字段,表示匹配的程度,默认是按照这个字段降序排列
         hits:返回的详细记录组成的数组
               _index : “crm”,文档存储位置(索引)
               _type : “user”,文档映射类型 
               _id : “1”,文档唯一标识(可以自定义也可以自动生成)
               _score : 1.0,匹配度程度
               _source : 具体返回的数据明细