在一些需要完全匹配,或者其他的一些情况,需要建立mapping,这个有点类似mysql的表定义
ActiveRecord的定义:
<?php namespace appadmin\code\Ta\models\elasticSearch; use yii\elasticsearch\ActiveRecord; class TraceData extends ActiveRecord { public static $currentIndex; # 定义db链接 public static function getDb() { return \Yii::$app->get('elasticsearch_TA'); } # 不同的website 使用的是不同的db ,使用前需要先初始化 # db的名字 public static function initDb($website_id){ if($website_id){ self::$currentIndex = 'ta'."_".$website_id; } } # db public static function index() { return self::$currentIndex; } # table public static function type() { return 'trace_data'; } public function attributes() { $mapConfig = self::mapConfig(); return array_keys($mapConfig['properties']); } public static function mapConfig(){ return [ 'properties' => [ 'id' => ['type' => 'string',"index" => "not_analyzed"], 'ip' => ['type' => 'string',"index" => "not_analyzed"], 'service_date_str' => ['type' => 'string',"index" => "not_analyzed"], 'service_datetime' => ['type' => 'string',"index" => "not_analyzed"], 'service_timestamp' => ['type' => 'integer',"index" => "not_analyzed"], 'devide' => ['type' => 'string',"index" => "not_analyzed"], 'user_agent' => ['type' => 'string',"index" => "not_analyzed"], 'browser_name' => ['type' => 'string',"index" => "not_analyzed"], 'browser_version' => ['type' => 'string',"index" => "not_analyzed"], 'browser_date' => ['type' => 'string',"index" => "not_analyzed"], 'browser_lang' => ['type' => 'string',"index" => "not_analyzed"], 'operate' => ['type' => 'string',"index" => "not_analyzed"], 'operate_relase' => ['type' => 'string',"index" => "not_analyzed"], 'domain' => ['type' => 'string',"index" => "not_analyzed"], 'url' => ['type' => 'string',"index" => "not_analyzed"], 'title' => ['type' => 'string',"index" => "not_analyzed"], 'refer_url' => ['type' => 'string',"index" => "not_analyzed"], 'first_referrer_domain' => ['type' => 'string',"index" => "not_analyzed"], 'is_return' => ['type' => 'integer',"index" => "not_analyzed"], 'uuid' => ['type' => 'string',"index" => "not_analyzed"], 'device_pixel_ratio'=> ['type' => 'string',"index" => "not_analyzed"], 'resolution' => ['type' => 'string',"index" => "not_analyzed"], 'color_depth' => ['type' => 'string',"index" => "not_analyzed"], 'website_id' => ['type' => 'integer',"index" => "not_analyzed"], 'sku' => ['type' => 'string',"index" => "not_analyzed"], 'country_code' => ['type' => 'string',"index" => "not_analyzed"], 'country_name' => ['type' => 'string',"index" => "not_analyzed"], 'order_status' => ['type' => 'string',"index" => "not_analyzed"], 'cart' => ['type' => 'string',"index" => "not_analyzed"], 'order' => ['type' => 'string',"index" => "not_analyzed"], 'category' => ['type' => 'string',"index" => "not_analyzed"], 'login_email' => ['type' => 'string',"index" => "not_analyzed"], 'register_email' => ['type' => 'string',"index" => "not_analyzed"], 'search' => ['type' => 'string',"index" => "not_analyzed"], 'currency' => ['type' => 'string',"index" => "not_analyzed"], 'url_new' => ['type' => 'string',"index" => "not_analyzed"], 'stay_seconds' => ['type' => 'integer',"index" => "not_analyzed"], 'first_visit_this_url' => ['type' => 'string',"index" => "not_analyzed"], ] ]; } public static function mapping() { return [ static::type() => self::mapConfig(), ]; } /** * Set (update) mappings for this model */ public static function updateMapping(){ $db = self::getDb(); $command = $db->createCommand(); if(!$command->indexExists(self::index())){ $command->createIndex(self::index()); } $command->setMapping(self::index(), self::type(), self::mapping()); } public static function getMapping(){ $db = self::getDb(); $command = $db->createCommand(); return $command->getMapping(); } }
使用:
public function actionMapping($websiteIds){ $arr = explode(",",$websiteIds); foreach($arr as $website_id){ TraceData::initDb($website_id); TraceData::updateMapping(); $map = TraceData::getMapping(); var_dump($map); } }
通过updateMapping来更新mapping
通过getMapping得到定义好的mapping
在这里的一个坑就是:在添加表(type)mapping的时候,需要提前定义Index(相当于mysql的db),才能添加type(相当于表),否则添加不上,或者报错。
其他资料:
https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-create-index.html
http://www.open-open.com/lib/view/open1455452874636.html