专栏首页PHP专享栏tp5集成ElasticSearch

tp5集成ElasticSearch

Elasticsearch 建模

mappings有点类似我们定义 MySQL的 数据库表结构的时候,需要指定每个字段的名字,其数据类型一样。当然,这个定义过程,也指明了这个表结构一共含有多少个字段了。对于ES而言,就相当于指定了一个document有多少field,每个field的数据类型,注意,这个比MySQL定义表过程,还多了一个有用的操作,就是指定每个字段可用的分析器(analyzer). 当然,不指定的话,就是采用默认的standard analyzer,当然你也可以指定某个字段不需要分析器(not_analyzed).

ES支持的数据类型:

  • 简单数据类型:string, date, long, double,integer,boolean 以及ip等等
  • 层级结构类型:JSON型的object,嵌套类型 (都是JSON)
  • 特殊结构类型:geo_point, geo_shape以及completion。

这些数据类型,可以在创建索引的时候,指定

下面,再来说说分析器analyzer。

ES系统默认提供了很多的分析器,最著名的是standard analyzer。另外,还有下面的一些分析器,这些分析器,可以进入官网进行深入研究。

  • Simple Analyzer
  • Whitespace Analyzer
  • Stop Analyzer
  • Keyword Analyzer
  • Pattern Analyzer
  • Language Analyzers
  • Fingerprint Analyzer

这些分析器中,重点在于如何对待搜索的目标进行分词(token)。

下面,将通过一个简单的例子,来说说mapping的操作,以及基于standard analyzer

curl -XPUT  "localhost:9210/Test" -d '
{
  "mappings": {
    "Test_Type" : {
      "properties" : {
        "session" : {"type" :"string","index":"not_analyzed"},
        "id":{"type": "long"},
        "text" : {"type" :"string","analyzer": "chinese"},
        "username" : {"type" :"string","analyzer": "chinese"},
        "times":{"type": "date","format":"yyyy-MM-dd HH:mm:ss"},
        "type":{"type": "long"}
      }
    }
  }
}'

Elasticsearch 从TP中添加数据

引入客户端构建器

use Elasticsearch\ClientBuilder;

id 可指定也可无 ,会自动生成id

<?php
namespace Home\Model; 
use Think\Model; 
require 'vendor/autoload.php'; 
use Elasticsearch\ClientBuilder;class TestModel extends Model { 
	Protected $autoCheckFields = false;
	Protected $elkclient = null;   
	public function __construct(){   
		$hosts = ['10.27.34.1:9200'];  //连接ip 端口
		$this->elkclient = ClientBuilder::create()->setHosts($hosts) ->build();  
	}

	public function Add($index,$type,$data)
	 { 
	  	$params = [
		    'index' =>  $index,//索引
		    'type' =>  $type,//类型
		    'body' => $data
		];

	 	return $this->elkclient->index($params);

	 }	
 
}?>

TestController.class.php 中调用

public function add(){
    if(IS_POST){
      $post_data = I('post.');  
      $result = D('Test')->Add($post_data);   
      if($result){
        $this-> success("添加成功!",U('index'));
      }else{
        $this -> error("添加失败!");
      }
    }
    $this -> display();}

传入的数据格式

array(16) {
  ["session"]=>
  string(4) "Test"
  ["serverid"]=>
  string(1) "1"
  ["starttime"]=>
  string(10) "2017-05-03"
  ["endtime"]=>
  string(10) "2017-05-10"
  ["username"]=>
  string(4) "Test"
  ["agentname"]=>
  string(4) "Test"
  ["ip"]=>
  string(11) "192.168.2.1"}

本文分享自微信公众号 - 风帆(wdswhf),作者:风帆money

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-09-05

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • PHP项目中最常用的函数

    php007
  • Git神器-创建与合并分支

    一开始的时候,master分支是一条线,Git用master指向最新的提交,再用HEAD指向master,就能确定当前分支,以及当前分支的提交点:

    php007
  • 轻松解决PHPExcel导出10W行超时和内存溢出问题

    源码地址:https://gitee.com/nodestudy/The-PHP-Best-Practice

    php007
  • typescript叫anyscript?不存在的

    强烈建议使用vscode,因为都是同一家,对ts的支持和开发体验是非常棒的,大大增加了开发效率和质量,避免各种错误。

    lhyt
  • JSON Schema 介绍及应用

    本文作者:IMWeb jerytang 原文出处:IMWeb社区 未经同意,禁止转载 ? 一、如何描述 JSON ? JSON (JavaScript...

    IMWeb前端团队
  • A parameter verify tools for Egg

    最近接触EGG框架,刚接触,其中涉及到验证参数的一些运用,网上找的egg-validate 都不是很好用,最后找到了parameter插件,挺好用,推荐给大家...

    张炳
  • TypeScript 疑难杂症

    作者:阿伟 - 身在高楼心在北大荒,我就这副死样~https://zhuanlan.zhihu.com/p/82459341

    ConardLi
  • JSON Schema 介绍及应用

    JSON (JavaScript Object Notation) 缩写,JSON 是一种数据格式,具有简洁、可读性高、支持广泛的特点。JSON 有以下基本数据...

    IMWeb前端团队
  • 在 TS 中如何减少重复代码

    相信有些读者已经听说过 DRY 原则,DRY 的全称是 —— Don’t Repeat Yourself ,是指编程过程中不写重复代码,将能够公共的部分抽象出来...

    阿宝哥
  • oracle中的数组(第一篇)(r4笔记第9天)

    数组在各种编程语言中都是很重要的数据结构实现,在oracle中也有自己的一席之地。自己简单做了几个实验,发现很多东西还是眼高手低,真实去做的时候,里面还是有不少...

    jeanron100

扫码关注云+社区

领取腾讯云代金券