IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> PHP知识库 -> php使用ElasticSearch -> 正文阅读

[PHP知识库]php使用ElasticSearch

解释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_word

ik_max_word:会将文本做最细粒度的拆分

ik_smart:会做最粗粒度的拆分

// 设置搜索关键字权重
{
"query": {
		"bool": {
			"should": [{
				"multi_match": {
					"query": "IDC",
					"fields": ["form_name", "form_title", "form_serial"],
					"minimum_should_match":100%
				}
			}]
		}
	}
}

在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;   //至少生效一个条件或多个

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/30812
	https://blog.csdn.net/qq_29677867/article/details/92839388

  PHP知识库 最新文章
Laravel 下实现 Google 2fa 验证
UUCTF WP
DASCTF10月 web
XAMPP任意命令执行提升权限漏洞(CVE-2020-
[GYCTF2020]Easyphp
iwebsec靶场 代码执行关卡通关笔记
多个线程同步执行,多个线程依次执行,多个
php 没事记录下常用方法 (TP5.1)
php之jwt
2021-09-18
上一篇文章      下一篇文章      查看所有文章
加:2021-08-11 11:55:25  更:2021-08-11 11:56:36 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/10 11:53:46-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码