前言

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

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

环境筹备

1.首先你要有个docker

docker pull elasticsearch:6.7.2docker 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深层次的货色