乐趣区

Elasticsearch入门到放弃系列秒精通Elasticsearch入门查询

前言

忽然想写一个对于 Elasticsearch 根本应用的文档,因为 Elasticsearch 入门的门槛特地低,加上本人很久没有应用了。最近我的项目接入 Elasticsearch 想了想还是写一篇对于根本应用,前面写文章掰开揉碎了剖析Elasticsearch
本文不会再有表情包呈现,是个比拟正经的小白入门手册。大佬就请绕道吧!!!低微在线祷告。

看完本篇你对 Elasticsearch 还是无所不知 哈哈哈哈哈哈哈哈哈
本篇讲的官网文档全都有 惟一的是能够依据代码装个环境本人入手

环境筹备

1. 首先你要有个 docker

docker pull elasticsearch:6.7.2
docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:6.7.2
// 就曾经启动胜利了 不须要再任何操作

2. 其次你 会点 php 事实上 demo 换成任何语言都很简略
3.git clone https://github.com/hongg-coder/es.git
4. 用的官网的 sdk 对应链接地址 packagist 务必提前看下 readme
5.debug 的数据源大略有 1000 条 依据上面走 执行脚本主动构建 数据文件在data/user_list.json

数据筹备

如果你习惯 mysql 能够转变下概念
mysql -> databases -> talbes -> rows -> Colums
elasticsearch-> Inices -> Types -> Documents -> Fields

来自 elasticsearch 权威指南阐明

demo 以简略用户为例子

user_id 用户 id 须要范畴查问
nickname 用户昵称 须要准确查问
tag 用户标签 须要多条件查问
birthday 用户出世日 须要日期查问
mail 用户邮箱 须要准确查问
description 用户简介须要分词查问

{
    // 用户 id
   "user_id":1,
   // 用户昵称
   "nickname":"洪二光",
   // 用户标签
   "tag":[
       "渣男",
       "菜鸟"
   ],
   // 出生日期
   "birthday":"1994-11-30",
   // 邮箱
   "mail":"1569498875@qq.com",
   // 用户备注
   "description":"oh shit"

}

index定义为 user
type 定义为_doc

构建索引

// 依照命令执行 数据主动构建胜利
php src/build_index.php

了解两个概念 mappinganalysis
艰深的解释
mapping 决定你定义的文档字段类型
analysis决定对应的文档字段怎么被搜寻解析

对应的 mapping

{
   "user": {
       "mappings": {
           "_doc": {
               "properties": {
                   "birthday": {
                       "type": "date",
                       "format": "yyyy-MM-dd"
                   },
                   "description": {
                       "type": "text",
                       "analyzer": "standard"
                   },
                   "mail": {"type": "keyword"},
                   "nickname": {"type": "keyword"},
                   "tag": {"type": "keyword"},
                   "user_id": {"type": "integer"}
               }
           }
       }
   }
}

简略了解 keywordtext
keyword
反对

  1. 准确搜寻
  2. 含糊搜寻
  3. 聚合查问

不反对

  1. 分词

text
反对

  1. 准确搜寻
  2. 含糊搜寻
  3. 分词搜寻

不反对

  1. 聚合查问

构建完

curl http://127.0.0.1:9200/user/_doc/_search
// 或者
php src/all_search.php 如果有数据返回阐明构建胜利

查问篇

查问性能过滤语句 > 查问语句
那么 查问语句 常用语全文本搜寻(简略了解就是须要用到 分词搜寻

过滤语句

1. 准确查问

查问用户 id 为 2 的用户
对标 mysql 查问
select * from user where user_id=2
对应的 es 语法

GET /user/_doc/_search
{
    "query" : {"term" : { "user_id" : 2}
    }
}

对应的 demo
php src/search1.php

2. 字符串查问

查问邮箱为 WcQT9YHGXb@mail.com 的用户
对标 mysql 查问
select * from user where mail='WcQT9YHGXb@mail.com'

GET /user/_doc/_search
{
  "query": {
    "term": {"mail": "WcQT9YHGXb@mail.com"}
  }
}

如果查问字符串含有中文 见下方查问语句 1

对应的 demo
php src/search2.php

3. 依据工夫查问

查问出生日期 > 1994 年 11 月 30 日的所有用户
对标 mysql 查问
select * from user where birthday > '1994-11-30'

GET /user/_doc/_search
{
  "query": {
    "range": {
      "birthday": {"gt": "1994-11-30"}
    }
  }
}

对应的 demo
php src/search3.php

gt : >
gte : >=
lt : c
lte : <=

4. 依据范畴查问

查问用户 id 在 1~10 的区间内
对标 mysql 查问
select * from user where user_id in (1,2,3,4,5,6,7,8,9,10)

GET /user/_doc/_search
{
  "query": {
    "terms": {
      "user_id": [
        1,
        2,
        3,
        4,
        5,
        6,
        7,
        8,
        9,
        10
      ]
    }
  }
}

php src/search4.php

5. 单标签查问

查问出标签含有 渣男 的所有用户
对标 mysql 查问
不想对标了!如果业务波及标签查问别想用 mysql 去设计!!

GET /user/_doc/_search
{
  "query": {
    "term": {
      "tag": 
        "渣男"
    }
  }
}

php src/search8.php

查问语句

1. 准确查问中文字符串 mapping 对应为keyword

查问用户昵称为 洪 2 光 的用户
对标 mysql 查问
select * from user where realname = '洪 2 光'

GET /user/_doc/_search
{
    "query":{
        "match":{"nickname":"洪 2 光"} 
    }

}

php src/search5.php

2. 分词查问字符串 mapping 对应 text

查问用户形容 opportunity R.M. Nixon 相干
对标 mysql 查问
对标个球球

GET /user/_doc/_search
{
    "query":{
        "match":{"description":"opportunity R.M. Nixon"} 
    }

}

php src/search6.php

3. 准确查问中文字符串 mapping 对应 text (心田 能不必就别用 如果真有这个场景思考是不是不要定义为 text)

准确查问用户形容为 Better an open enemy than a false friend.
对标 mysql 查问
select * from user where description = 'Be honest rather clever.'
能够试着用上述任何办法去查问 会发现返回没有任何后果。
如果 mapping 定义 text 分词还须要同时满足准确搜寻 咱们须要批改下 mapping

"description": {
  "type": "text",
  "analyzer": "standard",
  "fields": {
    "keyword": {
      "type": "keyword",
      "ignore_above": 256
    }
  }

批改后设置两个 field,一个是 field 倒排索引后的自身, 还有一个就是 field.keyword(description.keyword),这个字段默认是不分词的,并且最多保留 ignore_above 设定长度(字符)

php src/build_index2.php

而后

GET /user/_doc/_search
{
  "query": {
    "term": {"description.keyword": "Be honest rather clever."}
  }
}

php src/search7.php

复合查问

1. 多标签且查问

查问出标签同时含有 渣男 宅男 的所有用户

GET /user/_doc/_search
{
    "query":{
        "bool":{
            "must":[{"term":{"tag":"渣男"}},
                {"term":{"tag":"宅男"}}
            ]
        }
        
    }

}

php src/search9.php

2. 多标签或查问

查问出标签含有 渣男 宅男 其中一个的所有用户

GET /user/_doc/_search
{
  "query": {
    "terms": {
      "tag": [ 
        "渣男",
        "宅男"
       ]
    }
  }
}

php src/search10.php

3.OR 查问

查问邮箱为 MGyY5VRs9r@mail.comWvJTELTX9d@mail.com
对标 mysql
select * from user where mail ='MGyY5VRs9r@mail.com' or mail = 'WvJTELTX9d@mail.com'

GET /user/_doc/_search
{
    "query":{
        "bool":{
            "should":[{"term":{"mail":"MGyY5VRs9r@mail.com"}},
                {"term":{"mail":"WvJTELTX9d@mail.com"}}
            ]
        }
        
    }

}

php src/search11.php

4. 简单查问 1

查问用户 id 1 到 100 内 且出世年 大于 1994-11-30 且 标签为 渣男的用户

GET /user/_doc/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "range": {
            "birthday": {"gt": "1994-11-30"}
          }
        },
        {
            "term":{"tag":"渣男"}
        },
        {
            "range":{
                "user_id":{
                    "gte":1,
                    "lte":100
                }
            }
        }
      ]
    }
  }
}

php src/search12.php

5. 简单查问 2

查问用户 id 1 到 100 内 或 200 到 400 内 且 标签为 渣男的用户 且 个人简介分词蕴含 lifetrust

GET /user/_doc/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "range": {
            "user_id": {
              "gte": 1,
              "lte": 100
            }
          }
        },
        {
          "range": {
            "user_id": {
              "gte": 200,
              "lte": 400
            }
          }
        }
      ],
      "must": [
        {
          "term": {"tag": "渣男"}
        },
        {
          "match": {"description": "trust life"}
        }
      ]
    }
  }
}

php src/search13.php
就写到这了,对于 es 不到 20%,然而写 demo 手敲累了(是的,单纯本人累了),剩下本人去摸索吧。

写个最初

先学会用 Elasticsearch 再去学原理,上面几篇会把构建索引、解析器包含如何自定义解析器,最初在去学习一些 Elasticsearch 深层次的货色

退出移动版