前言
忽然想写一个对于 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
了解两个概念 mapping
和analysis
艰深的解释 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"}
}
}
}
}
}
简略了解 keyword
和text
keyword
反对
- 准确搜寻
- 含糊搜寻
- 聚合查问
不反对
- 分词
text
反对
- 准确搜寻
- 含糊搜寻
- 分词搜寻
不反对
- 聚合查问
构建完
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}
}
}
对应的 demophp 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
对应的 demophp 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"}
}
}
}
对应的 demophp 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.com
或WvJTELTX9d@mail.com
对标 mysqlselect * 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 内 且 标签为 渣男的用户 且 个人简介分词蕴含 life
、trust
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 深层次的货色