laravel 连接ES

1、安装扩展包
composer require laravel/scout
composer require tamayo/laravel-scout-elastic
composer require Guzzlehttp/guzzle
2、在 config/app.php 的 providers 数组添加:
Laravel\Scout\ScoutServiceProvider::class,
ScoutEngines\Elasticsearch\ElasticsearchProvider::class,
3、发布配置文件:
php artisan vendor:publish --provider="Laravel\Scout\ScoutServiceProvider"
发布生成的 config/scout.php 文件添加'driver' => env('SCOUT_DRIVER', 'elasticsearch'),'elasticsearch' => ['index' => env('ELASTICSEARCH_INDEX', 'laravel'),//索引名称'hosts' => [env('ELASTICSEARCH_HOST', 'http://127.0.0.1:9200'),],],
4、连接es,增删改查新建一个测试接口use Elasticsearch\ClientBuilder;public $client = null;public function __construct(){$this-> client = ClientBuilder::create()->build();}$this->client->create()   [update\get\delete]参考文档https://learnku.com/articles/30812https://blog.csdn.net/qq_29677867/article/details/92839388

解释ES

Elasticsearch 是一个基于 Lucene 的搜索引擎。它提供了具有 HTTP Web 界面和无架构 JSON 文档的分布式,多租户能力的全文搜索引擎。
Elasticsearch 是用 Java 开发的,根据 Apache 许可条款作为开源发布。映射关系
- 其就是对创建索引的时候给字段建立类型,随后要插入的字段必须遵循以定义好的字段类型进行插入
- keyword类型不能被分词,text可以被分词

倒排索引

ES是一个倒排索引进行检索的
倒排索引指的是:通过关键字,查询主键id,随后查询关联的内容

es的关系理解

索引 ---- 数据库类型 ----- 数据表文档 -----  行字段 ------   列

基础命令

PUT      localhost:9200/索引名称/类型名称/文档id                                                                   创建(指定id)文档
POST    localhost:9200/索引名称/类型名称                                                                         创建(随机id)文档
POST    localhost:9200/索引名称/类型名称/文档id/_update                                                           修改文档
DELETE  localhost:9200/索引名称/类型名称/文档id                                                                   删除文档
GET     localhost:9200/索引名称/类型名称/文档id                                                                   查询文档
POST    localhost:9200/索引名称/类型名称/_search                                                                 查询所有数据
GET     127.0.0.1:9200/索引名称/_analyze  {"analyzer":"ik_max_word","text":"asd泡面很好吃"}                       查看分词器
POST    127.0.0.1:9200/索引名称/_reindex                                                                        复制索引及内容{"source": {"index": "dwk1_item_index"  //旧索引},"dest": {"index": "dwk1_copy_item_index", //新索引"op_type": "create"}   }POST   127.0.0.1:9200/索引名称/_aliases                                                                        设置别名{"actions": [{"add": {"index": "my_index2", "alias": "my_index"}}]}

最普通的查询

//最普通的查询是全文检索,只要你的关键词存在,则匹配
{"query":{"match":{"字段":{"query":"我是帅哥"}}}
}

限定返回字段查询:

GET /索引名/类型名/_search
{"_source": ["字段1","字段2"]
}

排序查询:

  • 排序字段必须为long类型
GET /索引名/类型名/_search
{"sort": [{"FIELD": {"order": "desc"}}]
}

分页查询:

GET /索引名/类型名/_search
{"query": {},"from": 0,"size": 20
}

bool查询:

  • 所有的条件查询都可以基于bool查询,也就是bool里面写其他的条件查询
关键字                              描述
must                    必须匹配, 相当于mysql中的and
should                  至少有一个匹配, 相当于mysql中的or
must_not                必须不匹配,相当于mysql中的not
filter                  条件过滤   相当于must
GET /索引名/类型名/_search
{"query": {"bool": {"must": [   //关键字{"match": {"FIELD": "TEXT"   //字段 : 值}},{"match": {"FIELD": "TEXT"}}  ]}}
}

精确查询

//前提条件keyword类型
{"query": {“bool”:{"must":[{"term": {"字段": "字段1值 }}}]}
}
// text类型时的等值查询
{"query": {“bool”:{"must":[{"match_phrase  ": {"字段": "字段1值 }}}]}

范围查询

gte:大于等于
gt:大于
lte:小于等于
lt:小于
boost:设置查询的推动值(boost),默认为1.0
//数值范围查询,必须使用long类型
{"query": {"range" : {"字段" : {"gte" : 2,"lt" :  100}}}
}
//时间日期范围查询
//必须为时间类型字段:"endTime": {"type": "date","ignore_malformed": true,"format": "yyyy-MM-dd HH:mm:ss"}
//查询语法:
{"query": {"range" : {"字段" : {"gte" : 2,"lt" :  100,'format'=>'yyyy-MM-dd HH:mm:ss'}}}
}

数组查询

//当保存的字段为数组时例如:
"category": ["135835","112870","135839"
]
//查询语法
{"query": {"term" : {"字段" : {"value":135835}}}
}

多字段模糊查询

  • 用于一个值模糊匹配多个规定的字段

    {
    "query": {"bool": {"should": [{"multi_match": {"query": "IDC","fields": ["form_name", "form_title", "form_serial"]}}]}}
    }
    

聚合查询

//分组查询
{"aggs":{  //聚合操作"别名":{  //随意起名字"terms":{   //分组,这里有很多聚合函数,例如avg terms sum等具体可以百度"field":{"字段名"}}}}
}

分词器

// 字段设置分词器,前提条件必须是text类型,keyword类型不能被分词
{"mappings":{"properties": {"title": {"type": "text","fields": {"keyword": {"type": "keyword","ignore_above": 256}},"analyzer" : "ik_max_word",  "search_analyzer": "ik_max_word","index" : true}}}
}
IK分词器包含两种analyzer,一般用ik_max_wordik_max_word:会将文本做最细粒度的拆分ik_smart:会做最粗粒度的拆分// 设置搜索关键字权重
{
"query": {"bool": {"should": [{"multi_match": {"query": "IDC","fields": ["form_name", "form_title", "form_serial"],"minimum_should_match":100%}}]}}
}

批量操作

  • 批量操作可以一次性操作多条数据,它是把请求在加载到子节点里,所有批量的越多请求越大,可以根据服务器的大小来确定一个最大值,正常一次性文档数量最大为:1000—5000个,或者5-15M
  • 好处就是相同的文档id不会重复插入,即就是文档id唯一
// 批量修改{"update": {"_index": "test_dwk_item_index",  //索引名"_id": "44980567"    //文档id,可以自己定义的}},{"doc": {    //文档值"promotion_wording": "哈哈",   //具体修改字段"user_id": "24","goodsTime": 1628082800}}//php 格式,多个请用循环$res['body'][] = ['update'=>['_index'=> env('ELASTICSEARCH_INDEX'),'_id'=> $v['productId'],],];             $res['body'][] = ['doc'=>['productId'=>intval($v['productId']),'productIds'=>strval($v['productId']),'user_id'=>$user_id,'goodsTime'=>strtotime($goodsTime->created_at)]];// 如果是多个,重复上面的格式操作// 批量添加{"create": {  //或者index也行"_index": "test_dwk_item_index",  //索引名"_id": "44980567"    //文档id}},{"promotion_wording": "哈哈",   //具体修改字段"user_id": "24","goodsTime": 1628082800}//php 格式,多个请用循环$res['body'][] = ['create'=>['_index'=> env('ELASTICSEARCH_INDEX'),'_id'=> $v['productId'],],];$res['body'][] = ['productId'=>intval($v['productId']),'endTime'=>date('Y-m-d H:i:s',time() + (60*60*24*365)),'goodsTime'=>time()];// 如果是多个,重复上面的格式操作,对比更新,创建则不需要”doc“// 批量删除{"delete": {  "_index": "test_dwk_item_index",  //索引名"_id": "44980567"    //文档id}}................

在bool中must和should条件同时满足

{"query": {"bool": {"must": [{"term": {"color": "red"}}],#当must存在的时候,should中的条件是可有可无的,就是must条件满足就行,should的一个都不用满足也可以#当must不存在的时候,should中的条件至少要满足一个"should": {{"term": {"size": 33}},{"term": {"size": 55}}},#所以当must存在,又想让should的条件至少满足一个地加这个参数#也可以再must》term统计再加一个bool》must》should"minimum_should_match":1       //这个比较实用}}
}//代码实现
$goodsCats = json_decode(Redis::get('goodsCatsLogs'),true);
$goodsCats = array_column($goodsCats,$pan['categoryId']);
if(isset($goodsCats) && !empty($goodsCats)){foreach ($goodsCats as $k => $v){$body['query']['bool']['should'][]['term']['category'] = ['value'=>strval($v)];}}
$body['query']['bool']['minimum_should_match'] = 1;   //至少生效一个条件或多个

php使用ElasticSearch相关推荐

  1. Elasticsearch学习之路(一)

    一.前序 1.1正向索引和倒排索引 ** 正向索引通常用于数据库中,在搜索引擎领域使用的最多的就是倒排索引 ** 通过例子表示: 我爱编程, 我爱编程,我是小码农 1.1.1 正向索引 假设我们使用m ...

  2. 2021年大数据ELK(二十五):添加Elasticsearch数据源

    全网最详细的大数据ELK文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 添加Elasticsearch数据源 一.Kibana索引模式 添加Elast ...

  3. 2021年大数据ELK(十九):使用FileBeat采集Kafka日志到Elasticsearch

    全网最详细的大数据ELK文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 使用FileBeat采集Kafka日志到Elasticsearch 一.需求分 ...

  4. 2021年大数据ELK(十七):Elasticsearch SQL 订单统计分析案例

    全网最详细的大数据ELK文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 订单统计分析案例 一.案例介绍 二.创建索引 三.导入测试数据 四.统计不同支 ...

  5. 2021年大数据ELK(十六):Elasticsearch SQL(职位查询案例)

    全网最详细的大数据ELK文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 职位查询案例 一.查询职位索引库中的一条数据 二.将SQL转换为DSL 三.职 ...

  6. 2021年大数据ELK(十五):Elasticsearch SQL简单介绍

    全网最详细的大数据ELK文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 Elasticsearch SQL简单介绍 一.SQL与Elasticsear ...

  7. 2021年大数据ELK(十三):Elasticsearch编程(添加职位数据)

    全网最详细的大数据ELK文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 Elasticsearch编程 一.添加职位数据 1.初始化客户端连接 2.实 ...

  8. 2021年大数据ELK(十二):Elasticsearch编程(环境准备)

    全网最详细的大数据ELK文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 Elasticsearch编程 一.环境准备 1.准备IDEA项目结构 2.准 ...

  9. 2021年大数据ELK(十一):Elasticsearch架构原理

    全网最详细的大数据ELK文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 Elasticsearch架构原理 一.Elasticsearch的节点类型 ...

  10. 2021年大数据ELK(八):Elasticsearch安装IK分词器插件

    全网最详细的大数据ELK文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 系列历史文章 安装IK分词器 一.下载Elasticsearch IK分词器 ...

最新文章

  1. SQL语言之数据控制语言(Oracle)
  2. windows 2008创建群集“xxx”时出错。由于超时时间已过,该操作返回
  3. .NET编程-----------------------Web.config配置文件详解
  4. SQL SERVER 2008数据库管理与维护总结
  5. MySQL的JDBC下载
  6. 本特利电涡流传感器 330876-02-90-01-CN
  7. c语言定时器实验程序,89C51单片机实验三 定时器实验
  8. Macbook 2021 M1pro 安装 SentencePiece
  9. 1195 口袋的天空
  10. poj 1845 Sumdiv (等比求和+逆元)
  11. OSPF协议邻居(Neighbor)与邻接(Adjacency)关系
  12. 【C#】字体增大、减小、改变颜色
  13. JavaWeb:HTML
  14. 图示机构受力f作用_工程力学试题以及答案
  15. 5分钟,关于Python 解包,你需要知道的一切
  16. python3 怎么安装 PIL
  17. 纯Java搭建SS开发环境
  18. [藏]疯狂的极端,20款IM,UI比比看
  19. debian linux win7,win7debian双系统
  20. 动态 V2 基础配置命令

热门文章

  1. 穆穆推荐-软件销售行业软件公司销售参考操作手册-之2-软件公司销售团队的组建及岗位分类
  2. SuperMap三维复杂模型建模之3D极坐标建模——原理篇
  3. Arduino学习笔记——数字输入
  4. 软件设计模式--软件设计演变过程
  5. Redis Zset的实现为什么用跳表,而不用平衡树?
  6. 初入Shell编程,了解规范与变量
  7. dz邮箱验证怎么设置_如何设置discuz qq邮箱验证
  8. 考研数学 之 汤家凤老师来校讲座摘记 (拉格朗日定理等干货 )
  9. 2019汤家凤考研数学资料【超全】
  10. Zotero文献管理工具使用指南