前言
忽然想写一个对于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
了解两个概念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深层次的货色