前言
忽然想写一个对于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深层次的货色
发表回复