在一些需要完全匹配,或者其他的一些情况,需要建立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