Initial commit

This commit is contained in:
Donny
2019-04-22 20:46:32 +08:00
commit 49ab8aadd1
25441 changed files with 4055000 additions and 0 deletions

View File

@@ -0,0 +1,21 @@
filegroup(
name = "package-srcs",
srcs = glob(["**"]),
tags = ["automanaged"],
visibility = ["//visibility:private"],
)
filegroup(
name = "all-srcs",
srcs = [
":package-srcs",
"//app/service/main/search/cmd:all-srcs",
"//app/service/main/search/conf:all-srcs",
"//app/service/main/search/dao:all-srcs",
"//app/service/main/search/http:all-srcs",
"//app/service/main/search/model:all-srcs",
"//app/service/main/search/service:all-srcs",
],
tags = ["automanaged"],
visibility = ["//visibility:public"],
)

View File

@@ -0,0 +1,48 @@
运营后台搜索项目-Service
===============
v1.2.1
1. 修改xhttp为bm
2. 移除identify
v1.2.0
1. 换成bm的binding
v0.1.3
1. fix build
v0.1.2
1. 加大Ps
v0.1.1
1. 添加测试路由
v0.1.0
1. 迁至bm框架
2. dm history oidstr
v0.0.9
1. update default ps
v0.0.8
1. dm date add params
v0.0.7
1. add bazel
2. replyrecord_
v0.0.6
1. 新增externalPublic集群
v0.0.5
1. add reply record update
v0.0.4
1. add go
v0.0.3
1. 修改pgc_media集群
v0.0.2
1. pgc_media影视
v0.0.1
1. 稿件检查查询接口

View File

@@ -0,0 +1,13 @@
# Owner
liweijia
zhapuyu
renwei
guanhuaxin
# Author
guanhuaxin
zhoushuguang
# Reviewer
zhapuyu
renwei

View File

@@ -0,0 +1,19 @@
# See the OWNERS docs at https://go.k8s.io/owners
approvers:
- guanhuaxin
- liweijia
- renwei
- zhapuyu
- zhoushuguang
labels:
- main
- service
- service/main/search
options:
no_parent_owners: true
reviewers:
- guanhuaxin
- renwei
- zhapuyu
- zhoushuguang

View File

@@ -0,0 +1,13 @@
#### search-service
##### 项目简介
> 1.主站运营搜索服务
##### 编译环境
> 请只用golang v1.7.x以上版本编译执行。
##### 依赖包
> 1.公共包go-common
##### 特别说明
> 1.model目录可能会被其他项目引用请谨慎更改并通知各方。

View File

@@ -0,0 +1,43 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_binary",
"go_library",
)
go_binary(
name = "cmd",
embed = [":go_default_library"],
tags = ["automanaged"],
)
go_library(
name = "go_default_library",
srcs = ["main.go"],
data = ["search-service-test.toml"],
importpath = "go-common/app/service/main/search/cmd",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/service/main/search/conf:go_default_library",
"//app/service/main/search/http:go_default_library",
"//app/service/main/search/service:go_default_library",
"//library/log:go_default_library",
"//library/net/trace:go_default_library",
],
)
filegroup(
name = "package-srcs",
srcs = glob(["**"]),
tags = ["automanaged"],
visibility = ["//visibility:private"],
)
filegroup(
name = "all-srcs",
srcs = [":package-srcs"],
tags = ["automanaged"],
visibility = ["//visibility:public"],
)

View File

@@ -0,0 +1,48 @@
package main
import (
"flag"
"os"
"os/signal"
"syscall"
"time"
"go-common/app/service/main/search/conf"
"go-common/app/service/main/search/http"
"go-common/app/service/main/search/service"
"go-common/library/log"
"go-common/library/net/trace"
)
func main() {
flag.Parse()
// init conf,log,trace,stat,perf.
if err := conf.Init(); err != nil {
panic(err)
}
log.Init(conf.Conf.Xlog)
defer log.Close()
trace.Init(conf.Conf.Tracer)
defer trace.Close()
// service init
svr := service.New(conf.Conf)
http.Init(conf.Conf, svr)
// signal handler
log.Info("search-interface start")
c := make(chan os.Signal, 1)
signal.Notify(c, syscall.SIGHUP, syscall.SIGQUIT, syscall.SIGTERM, syscall.SIGINT)
for {
s := <-c
log.Info("search-interface get a signal %s", s.String())
switch s {
case syscall.SIGQUIT, syscall.SIGTERM, syscall.SIGSTOP, syscall.SIGINT:
time.Sleep(time.Second * 2)
log.Info("search-interface exit")
return
case syscall.SIGHUP:
// TODO reload
default:
return
}
}
}

View File

@@ -0,0 +1,68 @@
version = "0.0.1"
user = "nobody"
pid = "/tmp/search-service.pid"
dir = "./"
perf = "127.0.0.1:7320"
trace = false
debug = false
[xlog]
dir = "/data/log/search-service/"
[HTTPServer]
addr = "0.0.0.0:7322"
maxListen = 1000
timeout = "1s"
readTimeout = "1s"
writeTimeout = "1s"
[pagination]
pageNum = 1
pageSize = 30
maxPageNum = 5000
maxPageSize = 1000
[es]
[es.archiveInternal]
addr = ["http://172.18.33.71:9200"]
[es.dmInternal]
addr = ["http://172.18.33.71:9200"]
[es.dmExternal]
addr = ["http://172.18.33.71:9200"]
[es.replyInternal]
addr = ["http://172.18.33.71:9200"]
[es.replyExternal]
addr = ["http://172.18.33.71:9200"]
[es.articleInternal]
addr = ["http://172.18.33.71:9200"]
[redis]
name = "search-api"
proto = "tcp"
addr = "172.18.33.71:6379"
active = 10
idle = 5
dialTimeout = "1s"
readTimeout = "1s"
writeTimeout = "1s"
idleTimeout = "10s"
expire = "24h"
[SMS]
phone = "17621966518"
token = "f5a658b2-5926-4b71-96c3-7d3777b7d256"
[httpClient]
key = "app key"
secret = "app secret"
dial = "100ms"
timeout = "1s"
keepAlive = "60s"
timer = 128
[httpClient.breaker]
window ="10s"
sleep ="10ms"
bucket = 10
ratio = 0.5
request = 100

View File

@@ -0,0 +1,36 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
)
go_library(
name = "go_default_library",
srcs = ["conf.go"],
importpath = "go-common/app/service/main/search/conf",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//library/conf:go_default_library",
"//library/ecode/tip:go_default_library",
"//library/log:go_default_library",
"//library/net/http/blademaster:go_default_library",
"//library/net/trace:go_default_library",
"//vendor/github.com/BurntSushi/toml:go_default_library",
],
)
filegroup(
name = "package-srcs",
srcs = glob(["**"]),
tags = ["automanaged"],
visibility = ["//visibility:private"],
)
filegroup(
name = "all-srcs",
srcs = [":package-srcs"],
tags = ["automanaged"],
visibility = ["//visibility:public"],
)

View File

@@ -0,0 +1,111 @@
package conf
import (
"errors"
"flag"
"go-common/library/conf"
ecode "go-common/library/ecode/tip"
"go-common/library/log"
bm "go-common/library/net/http/blademaster"
"go-common/library/net/trace"
"github.com/BurntSushi/toml"
)
var (
confPath string
// Conf .
Conf = &Config{}
client *conf.Client
)
// Pagination .
type Pagination struct {
PageNum int
PageSize int
MaxPageNum int
MaxPageSize int
}
// Config .
type Config struct {
// base
// xlog
Xlog *log.Config
// rpc server2
//RPCServer2 *conf.RPCServer2
// tracer
Tracer *trace.Config
// xhttp
HTTPServer *bm.ServerConfig
// es cluster
Es map[string]*EsInfo
// ecode
Ecode *ecode.Config
// pagination
Pagination *Pagination
// httpClinet
HTTPClient *bm.ClientConfig
SMS *SMS
}
// EsInfo .
type EsInfo struct {
Addr []string
}
// SMS config
type SMS struct {
Phone string
Token string
Interval int64
}
func init() {
flag.StringVar(&confPath, "conf", "", "default config path")
}
// Init init config.
func Init() (err error) {
if confPath != "" {
_, err = toml.DecodeFile(confPath, &Conf)
return
}
err = remote()
return
}
func remote() (err error) {
if client, err = conf.New(); err != nil {
return
}
if err = load(); err != nil {
return
}
go func() {
for range client.Event() {
log.Info("config reload")
if load() != nil {
log.Error("config reload error (%v)", err)
}
}
}()
return
}
func load() (err error) {
var (
s string
ok bool
tmpConf = &Config{}
)
if s, ok = client.Toml2(); !ok {
return errors.New("load config center error")
}
if _, err = toml.Decode(s, tmpConf); err != nil {
return errors.New("could not decode config")
}
*Conf = *tmpConf
return
}

View File

@@ -0,0 +1,59 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_test",
"go_library",
)
go_test(
name = "go_default_test",
srcs = ["dao_test.go"],
embed = [":go_default_library"],
rundir = ".",
tags = ["automanaged"],
deps = [
"//app/service/main/search/conf:go_default_library",
"//app/service/main/search/model:go_default_library",
"//vendor/github.com/smartystreets/goconvey/convey:go_default_library",
],
)
go_library(
name = "go_default_library",
srcs = [
"dao.go",
"dm_date.go",
"dm_history.go",
"dm_search.go",
"es.go",
"pgc.go",
"reply.go",
"sms.go",
],
importpath = "go-common/app/service/main/search/dao",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/service/main/search/conf:go_default_library",
"//app/service/main/search/model:go_default_library",
"//library/ecode:go_default_library",
"//library/log:go_default_library",
"//library/stat/prom:go_default_library",
"//vendor/gopkg.in/olivere/elastic.v5:go_default_library",
],
)
filegroup(
name = "package-srcs",
srcs = glob(["**"]),
tags = ["automanaged"],
visibility = ["//visibility:private"],
)
filegroup(
name = "all-srcs",
srcs = [":package-srcs"],
tags = ["automanaged"],
visibility = ["//visibility:public"],
)

View File

@@ -0,0 +1,94 @@
package dao
import (
"context"
"fmt"
"go-common/app/service/main/search/conf"
"go-common/library/log"
"go-common/library/stat/prom"
elastic "gopkg.in/olivere/elastic.v5"
)
type Dao struct {
// conf
c *conf.Config
// esPool
esPool map[string]*elastic.Client
// sms
sms *sms
}
// New init dao
func New(c *conf.Config) (d *Dao) {
d = &Dao{
c: c,
}
d.sms = newSMS(d)
// cluster
d.esPool = newEsPool(c, d)
return
}
// BulkItem .
type BulkItem interface {
IndexName() string
IndexType() string
IndexID() string
}
// BulkMapItem .
type BulkMapItem interface {
IndexName() string
IndexType() string
IndexID() string
PField() map[string]interface{}
}
// newEsCluster cluster action
func newEsPool(c *conf.Config, d *Dao) (esCluster map[string]*elastic.Client) {
esCluster = make(map[string]*elastic.Client)
for esName, e := range c.Es {
if client, err := elastic.NewClient(elastic.SetURL(e.Addr...)); err == nil {
esCluster[esName] = client
} else {
PromError("es:集群连接失败", "cluster: %s, %v", esName, err)
if err := d.SendSMS(fmt.Sprintf("[search-job]%s集群连接失败", esName)); err != nil {
PromError("es:集群连接短信失败", "cluster: %s, %v", esName, err)
}
}
}
return
}
// PromError prometheus error count.
func PromError(name, format string, args ...interface{}) {
prom.BusinessErrCount.Incr(name)
log.Error(format, args...)
}
// Ping health of db.
func (d *Dao) Ping(c context.Context) (err error) {
if err = d.pingESCluster(c); err != nil {
PromError("es:ping", "Ping %v", err)
}
return
}
// pingESCluster ping es cluster
func (d *Dao) pingESCluster(ctx context.Context) (err error) {
for name := range d.c.Es {
client, ok := d.esPool[name]
if !ok {
continue
}
_, _, err = client.Ping(d.c.Es["replyExternal"].Addr[0]).Do(ctx)
if err != nil {
PromError("archiveESClient:Ping", "dao.pingESCluster error(%v) ", err)
return
}
}
return
}

View File

@@ -0,0 +1,60 @@
package dao
import (
"context"
"flag"
"path/filepath"
"testing"
"go-common/app/service/main/search/conf"
"go-common/app/service/main/search/model"
. "github.com/smartystreets/goconvey/convey"
)
func WithDao(f func(d *Dao)) func() {
return func() {
dir, _ := filepath.Abs("../cmd/goconvey.toml")
flag.Set("conf", dir)
flag.Parse()
conf.Init()
d := New(conf.Conf)
f(d)
}
}
func Test_PgcMedia(t *testing.T) {
Convey("open app", t, WithDao(func(d *Dao) {
var (
err error
c = context.TODO()
p *model.PgcMediaParams
)
_, err = d.PgcMedia(c, p)
So(err, ShouldBeNil)
}))
}
func Test_ReplyRecord(t *testing.T) {
Convey("reply record", t, WithDao(func(d *Dao) {
var (
err error
c = context.TODO()
p *model.ReplyRecordParams
)
_, err = d.ReplyRecord(c, p)
So(err, ShouldBeNil)
}))
}
func Test_DmHistory(t *testing.T) {
Convey("DmHistory", t, WithDao(func(d *Dao) {
var (
err error
c = context.TODO()
p *model.DmHistoryParams
)
_, err = d.DmHistory(c, p)
So(err, ShouldBeNil)
}))
}

View File

@@ -0,0 +1,35 @@
package dao
import (
"context"
"fmt"
"strings"
"go-common/app/service/main/search/model"
elastic "gopkg.in/olivere/elastic.v5"
)
func (d *Dao) DmDateSearch(c context.Context, p *model.DmDateParams) (res *model.SearchResult, err error) {
query := elastic.NewBoolQuery()
indexName := "dm_date_" + strings.Replace(p.Month, "-", "_", -1)
if p.Bsp.KW != "" {
query = query.Must(elastic.NewRegexpQuery(p.Bsp.KwFields[0], ".*"+p.Bsp.KW+".*"))
}
if p.Oid != -1 {
query = query.Filter(elastic.NewTermQuery("oid", p.Oid))
}
if p.Month != "" {
query = query.Filter(elastic.NewTermQuery("month", p.Month))
}
if p.MonthFrom != "" {
query = query.Filter(elastic.NewRangeQuery("month").Gte(p.MonthFrom))
}
if p.MonthTo != "" {
query = query.Filter(elastic.NewRangeQuery("month").Lte(p.MonthTo))
}
if res, err = d.searchResult(c, "dmExternal", indexName, query, p.Bsp); err != nil {
PromError(fmt.Sprintf("es:%s ", p.Bsp.AppID), "%v", err)
}
return
}

View File

@@ -0,0 +1,42 @@
package dao
import (
"context"
"fmt"
"go-common/app/service/main/search/model"
elastic "gopkg.in/olivere/elastic.v5"
)
func (d *Dao) DmHistory(c context.Context, p *model.DmHistoryParams) (res *model.SearchResult, err error) {
var (
query = elastic.NewBoolQuery()
indexName = fmt.Sprintf("dm_search_%03d", p.Oid%1000)
)
if p.Bsp.KW != "" {
query = query.Must(elastic.NewMultiMatchQuery(p.Bsp.KW, p.Bsp.KwFields...).Type("best_fields").TieBreaker(0.6))
}
if p.Oid != -1 {
query = query.Filter(elastic.NewTermQuery("oidstr", p.Oid))
}
if len(p.States) > 0 {
interfaceSlice := make([]interface{}, len(p.States))
for k, m := range p.States {
interfaceSlice[k] = m
}
query = query.Filter(elastic.NewTermsQuery("state", interfaceSlice...))
}
if p.CtimeFrom != "" {
query = query.Filter(elastic.NewRangeQuery("ctime").Gte(p.CtimeFrom))
}
if p.CtimeTo != "" {
query = query.Filter(elastic.NewRangeQuery("ctime").Lte(p.CtimeTo))
}
fmt.Println(indexName)
if res, err = d.searchResult(c, "dmExternal", indexName, query, p.Bsp); err != nil {
PromError(fmt.Sprintf("es:%s ", p.Bsp.AppID), "%v", err)
}
return
}

View File

@@ -0,0 +1,63 @@
package dao
import (
"context"
"fmt"
"go-common/app/service/main/search/model"
elastic "gopkg.in/olivere/elastic.v5"
)
// DmSearch .
func (d *Dao) DmSearch(c context.Context, p *model.DmSearchParams) (res *model.SearchResult, err error) {
var (
query = elastic.NewBoolQuery()
indexName = fmt.Sprintf("dm_search_%03d", p.Oid%1000)
)
if p.Bsp.KW != "" {
query = query.Must(elastic.NewRegexpQuery(p.Bsp.KwFields[0], ".*"+p.Bsp.KW+".*"))
}
if p.Oid != -1 {
query = query.Filter(elastic.NewTermQuery("oid", p.Oid))
}
if p.Mid != -1 {
query = query.Filter(elastic.NewTermQuery("mid", p.Mid))
}
if p.Mode != -1 {
query = query.Filter(elastic.NewTermQuery("mode", p.Mode))
}
if p.Pool != -1 {
query = query.Filter(elastic.NewTermQuery("pool", p.Pool))
}
if p.Progress != -1 {
query = query.Filter(elastic.NewTermQuery("progress", p.Progress))
}
if len(p.States) > 0 {
interfaceSlice := make([]interface{}, len(p.States))
for k, m := range p.States {
interfaceSlice[k] = m
}
query = query.Filter(elastic.NewTermsQuery("state", interfaceSlice...))
}
if p.Type != -1 {
query = query.Filter(elastic.NewTermQuery("type", p.Type))
}
if len(p.AttrFormat) > 0 {
interfaceSlice := make([]interface{}, len(p.AttrFormat))
for k, m := range p.AttrFormat {
interfaceSlice[k] = m
}
query = query.Filter(elastic.NewTermsQuery("attr_format", interfaceSlice...))
}
if p.CtimeFrom != "" {
query = query.Filter(elastic.NewRangeQuery("ctime").Gte(p.CtimeFrom))
}
if p.CtimeTo != "" {
query = query.Filter(elastic.NewRangeQuery("ctime").Lte(p.CtimeTo))
}
if res, err = d.searchResult(c, "dmExternal", indexName, query, p.Bsp); err != nil {
PromError(fmt.Sprintf("es:%s ", p.Bsp.AppID), "%v", err)
}
return
}

View File

@@ -0,0 +1,129 @@
package dao
import (
"context"
"encoding/json"
"fmt"
"strings"
"go-common/app/service/main/search/model"
"go-common/library/ecode"
"go-common/library/log"
elastic "gopkg.in/olivere/elastic.v5"
)
// UpdateMapBulk .
func (d *Dao) UpdateMapBulk(c context.Context, esName string, bulkData []BulkMapItem) (err error) {
if _, ok := d.esPool[esName]; !ok {
PromError(fmt.Sprintf("es:集群不存在%s", esName), "s.dao.searchResult indexName:%s", esName)
err = ecode.SearchUpdateIndexFailed
return
}
bulkRequest := d.esPool[esName].Bulk()
for _, b := range bulkData {
request := elastic.NewBulkUpdateRequest().Index(b.IndexName()).Type(b.IndexType()).Id(b.IndexID()).Doc(b.PField()).DocAsUpsert(true)
bulkRequest.Add(request)
}
if _, err = bulkRequest.Do(context.TODO()); err != nil {
log.Error("esName(%s) bulk error(%v)", esName, err)
}
return
}
func (d *Dao) UpdateBulk(c context.Context, esName string, bulkData []BulkItem) (err error) {
if _, ok := d.esPool[esName]; !ok {
PromError(fmt.Sprintf("es:集群不存在%s", esName), "s.dao.searchResult indexName:%s", esName)
err = ecode.SearchUpdateIndexFailed
return
}
bulkRequest := d.esPool[esName].Bulk()
for _, b := range bulkData {
request := elastic.NewBulkUpdateRequest().Index(b.IndexName()).Type(b.IndexType()).Id(b.IndexID()).Doc(b).DocAsUpsert(true)
//fmt.Println(request)
bulkRequest.Add(request)
}
if bulkRequest.NumberOfActions() == 0 {
return
}
if _, err = bulkRequest.Do(context.TODO()); err != nil {
log.Error("esName(%s) bulk error(%v)", esName, err)
}
return
}
// searchResult get result from ES.
func (d *Dao) searchResult(c context.Context, esClusterName, indexName string, query elastic.Query, bsp *model.BasicSearchParams) (res *model.SearchResult, err error) {
res = &model.SearchResult{Debug: ""}
if bsp.Debug {
var src interface{}
if src, err = query.Source(); err == nil {
var data []byte
if data, err = json.Marshal(src); err == nil {
res = &model.SearchResult{Debug: string(data)}
}
}
}
if _, ok := d.esPool[esClusterName]; !ok {
PromError(fmt.Sprintf("es:集群不存在%s", esClusterName), "s.dao.searchResult indexName:%s", indexName)
res = &model.SearchResult{Debug: fmt.Sprintf("es:集群不存在%s, %s", esClusterName, res.Debug)}
return
}
// multi sort
sorterSlice := []elastic.Sorter{}
if bsp.KW != "" {
sorterSlice = append(sorterSlice, elastic.NewScoreSort().Desc())
}
for i, d := range bsp.Order {
if len(bsp.Sort) < i+1 {
if bsp.Sort[0] == "desc" {
sorterSlice = append(sorterSlice, elastic.NewFieldSort(d).Desc())
} else {
sorterSlice = append(sorterSlice, elastic.NewFieldSort(d).Asc())
}
} else {
if bsp.Sort[i] == "desc" {
sorterSlice = append(sorterSlice, elastic.NewFieldSort(d).Desc())
} else {
sorterSlice = append(sorterSlice, elastic.NewFieldSort(d).Asc())
}
}
}
fsc := elastic.NewFetchSourceContext(true).Include(bsp.Source...)
searchResult, err := d.esPool[esClusterName].
Search().Index(indexName).
Query(query).
SortBy(sorterSlice...).
From((bsp.Pn - 1) * bsp.Ps).
Size(bsp.Ps).
Pretty(true).
FetchSourceContext(fsc).
Do(c)
if err != nil {
PromError(fmt.Sprintf("es:执行查询失败%s ", esClusterName), "%v", err)
res = &model.SearchResult{Debug: res.Debug + "es:执行查询失败"}
return
}
var data []json.RawMessage
for _, hit := range searchResult.Hits.Hits {
var t json.RawMessage
e := json.Unmarshal(*hit.Source, &t)
if e != nil {
PromError(fmt.Sprintf("es:%s 索引有脏数据", esClusterName), "s.dao.SearchArchiveCheck(%d,%d) error(%v) ", bsp.Pn*bsp.Ps, bsp.Ps, e)
continue
}
data = append(data, t)
}
res = &model.SearchResult{
Order: strings.Join(bsp.Order, ","),
Sort: strings.Join(bsp.Sort, ","),
Result: data,
Debug: res.Debug,
Page: &model.Page{
Pn: bsp.Pn,
Ps: bsp.Ps,
Total: searchResult.Hits.TotalHits,
},
}
return
}

View File

@@ -0,0 +1,138 @@
package dao
import (
"context"
"fmt"
"go-common/app/service/main/search/model"
elastic "gopkg.in/olivere/elastic.v5"
)
// PgcMedia .
func (d *Dao) PgcMedia(c context.Context, p *model.PgcMediaParams) (res *model.SearchResult, err error) {
query := elastic.NewBoolQuery()
if p.Bsp.KW != "" {
query = query.Must(elastic.NewMultiMatchQuery(p.Bsp.KW, "title").Type("best_fields").TieBreaker(0.3))
}
if len(p.MediaIds) > 0 {
interfaceSlice := make([]interface{}, len(p.MediaIds))
for i, d := range p.MediaIds {
interfaceSlice[i] = d
}
query = query.Filter(elastic.NewTermsQuery("media_id", interfaceSlice...))
}
if len(p.SeasonIds) > 0 {
interfaceSlice := make([]interface{}, len(p.SeasonIds))
for i, d := range p.SeasonIds {
interfaceSlice[i] = d
}
query = query.Filter(elastic.NewTermsQuery("season_id", interfaceSlice...))
}
if len(p.SeasonTypes) > 0 {
interfaceSlice := make([]interface{}, len(p.SeasonTypes))
for i, d := range p.SeasonTypes {
interfaceSlice[i] = d
}
query = query.Filter(elastic.NewTermsQuery("season_type", interfaceSlice...))
}
if len(p.StyleIds) > 0 {
interfaceSlice := make([]interface{}, len(p.StyleIds))
for i, d := range p.StyleIds {
interfaceSlice[i] = d
}
query = query.Filter(elastic.NewTermsQuery("style_id", interfaceSlice...))
}
if p.Status > -1000 {
query = query.Filter(elastic.NewTermQuery("status", p.Status))
}
if p.ReleaseDateFrom != "" {
query = query.Filter(elastic.NewRangeQuery("release_date").Gte(p.ReleaseDateFrom))
}
if p.ReleaseDateTo != "" {
query = query.Filter(elastic.NewRangeQuery("release_date").Lte(p.ReleaseDateTo))
}
if p.ReleaseDateFrom != "" {
query = query.Filter(elastic.NewRangeQuery("release_date").Gte(p.ReleaseDateFrom))
}
if p.ReleaseDateTo != "" {
query = query.Filter(elastic.NewRangeQuery("release_date").Lte(p.ReleaseDateTo))
}
if p.SeasonIDFrom > 0 {
query = query.Filter(elastic.NewRangeQuery("season_id").Gte(p.SeasonIDFrom))
}
if p.SeasonIDTo > 0 {
query = query.Filter(elastic.NewRangeQuery("season_id").Lte(p.SeasonIDTo))
}
if len(p.ProducerIds) > 0 {
interfaceSlice := make([]interface{}, len(p.ProducerIds))
for i, d := range p.ProducerIds {
interfaceSlice[i] = d
}
query = query.Filter(elastic.NewTermsQuery("producer_id", interfaceSlice...))
}
if p.IsDeleted == 0 {
query = query.MustNot(elastic.NewTermQuery("is_deleted", 1))
}
if len(p.AreaIds) > 0 {
interfaceSlice := make([]interface{}, len(p.AreaIds))
for i, o := range p.AreaIds {
interfaceSlice[i] = o
}
query = query.Filter(elastic.NewTermsQuery("area_id", interfaceSlice...))
}
if p.ScoreFrom > 0 {
query = query.Filter(elastic.NewRangeQuery("score_from").Gte(p.ScoreFrom))
}
if p.ScoreTo > 0 {
query = query.Filter(elastic.NewRangeQuery("score_to").Lte(p.ScoreTo))
}
if p.IsFinish != "" {
query = query.Filter(elastic.NewTermsQuery("is_finish", p.IsFinish))
}
if len(p.SeasonVersions) > 0 {
interfaceSlice := make([]interface{}, len(p.SeasonVersions))
for i, o := range p.SeasonVersions {
interfaceSlice[i] = o
}
query = query.Filter(elastic.NewTermsQuery("season_version", interfaceSlice...))
}
if len(p.SeasonStatuses) > 0 {
interfaceSlice := make([]interface{}, len(p.SeasonStatuses))
for i, o := range p.SeasonStatuses {
interfaceSlice[i] = o
}
query = query.Filter(elastic.NewTermsQuery("season_status", interfaceSlice...))
}
if p.PubTimeFrom != "" {
query = query.Filter(elastic.NewRangeQuery("pub_time").Gte(p.PubTimeFrom))
}
if p.PubTimeTo != "" {
query = query.Filter(elastic.NewRangeQuery("pub_time").Lte(p.PubTimeTo))
}
if len(p.SeasonMonths) > 0 {
interfaceSlice := make([]interface{}, len(p.SeasonMonths))
for i, o := range p.SeasonMonths {
interfaceSlice[i] = o
}
query = query.Filter(elastic.NewTermsQuery("season_month", interfaceSlice...))
}
if p.LatestTimeFrom != "" {
query = query.Filter(elastic.NewRangeQuery("latest_time").Gte(p.LatestTimeFrom))
}
if p.LatestTimeTo != "" {
query = query.Filter(elastic.NewRangeQuery("latest_time").Lte(p.LatestTimeTo))
}
if len(p.CopyrightInfos) > 0 {
interfaceSlice := make([]interface{}, len(p.CopyrightInfos))
for i, o := range p.CopyrightInfos {
interfaceSlice[i] = o
}
query = query.Filter(elastic.NewTermsQuery("copyright_info", interfaceSlice...))
}
p.Bsp.Source = []string{"media_id", "season_id", "season_type", "dm_count", "play_count", "fav_count", "score", "latest_time", "pub_time", "release_date"}
if res, err = d.searchResult(c, "externalPublic", "pgc_media", query, p.Bsp); err != nil {
PromError(fmt.Sprintf("es:%s ", p.Bsp.AppID), "%v", err)
}
return
}

View File

@@ -0,0 +1,46 @@
package dao
import (
"context"
"fmt"
"go-common/app/service/main/search/model"
elastic "gopkg.in/olivere/elastic.v5"
)
// ReplyRecord search reply record from ES.
func (d *Dao) ReplyRecord(c context.Context, p *model.ReplyRecordParams) (res *model.SearchResult, err error) {
query := elastic.NewBoolQuery()
if p.Mid > 0 {
query = query.Must(elastic.NewTermQuery("mid", p.Mid))
} else {
return
}
if len(p.Types) > 0 {
interfaceSlice := make([]interface{}, len(p.Types))
for i, d := range p.Types {
interfaceSlice[i] = d
}
query = query.Must(elastic.NewTermsQuery("type", interfaceSlice...))
}
if len(p.States) > 0 {
interfaceSlice := make([]interface{}, len(p.States))
for i, d := range p.States {
interfaceSlice[i] = d
}
query = query.Must(elastic.NewTermsQuery("state", interfaceSlice...))
}
if p.CTimeFrom != "" {
query = query.Must(elastic.NewRangeQuery("ctime").Gte(p.CTimeFrom))
}
if p.CTimeTo != "" {
query = query.Must(elastic.NewRangeQuery("ctime").Lte(p.CTimeTo))
}
indexName := fmt.Sprintf("replyrecord_%d", p.Mid%100)
if res, err = d.searchResult(c, "replyExternal", indexName, query, p.Bsp); err != nil {
PromError(fmt.Sprintf("es:%s ", p.Bsp.AppID), "%v", err)
return
}
return
}

View File

@@ -0,0 +1,71 @@
package dao
import (
"net/http"
"net/url"
"strconv"
"time"
"go-common/library/log"
)
const _smsURL = "http://ops-mng.bilibili.co/api/sendsms"
type sms struct {
d *Dao
client *http.Client
lastTime int64
interval int64
params *url.Values
}
func newSMS(d *Dao) (s *sms) {
s = &sms{
d: d,
client: &http.Client{},
lastTime: time.Now().Unix() - d.c.SMS.Interval, //如果不想让初始化的时候告警,把减号去掉
interval: d.c.SMS.Interval,
params: &url.Values{
"phone": []string{d.c.SMS.Phone},
"token": []string{d.c.SMS.Token},
},
}
return
}
func (d *Dao) SendSMS(msg string) (err error) {
if !d.sms.IntervalCheck() {
log.Error("发短信太频繁啦, msg%s", msg)
return
}
if err = d.sms.Send(msg); err != nil {
log.Error("发短信失败, msg%s, error(%v)", msg, err)
}
return
}
func (sms *sms) Send(msg string) (err error) {
var req *http.Request
sms.params.Set("message", msg)
if req, err = http.NewRequest("GET", _smsURL+"?"+sms.params.Encode(), nil); err != nil {
return
}
req.Header.Set("x1-bilispy-timeout", strconv.FormatInt(int64(time.Duration(1)/time.Millisecond), 10))
if _, err = sms.client.Do(req); err != nil {
log.Error("ops-mng sendsms url(%s) error(%v)", _smsURL+"?"+sms.params.Encode(), err)
}
return
}
// IntervalCheck accessible or not to send msg at present time
func (sms *sms) IntervalCheck() (send bool) {
now := time.Now().Unix()
if (now - sms.lastTime) >= sms.interval {
send = true
sms.lastTime = now
} else {
send = false
}
return
}

View File

@@ -0,0 +1,47 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
)
go_library(
name = "go_default_library",
srcs = [
"dm_date.go",
"dm_search.go",
"dm_update.go",
"dmhistory_search.go",
"http.go",
"pgc_search.go",
"pgc_update.go",
"reply_search.go",
"reply_update.go",
],
importpath = "go-common/app/service/main/search/http",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/service/main/search/conf:go_default_library",
"//app/service/main/search/dao:go_default_library",
"//app/service/main/search/model:go_default_library",
"//app/service/main/search/service:go_default_library",
"//library/ecode:go_default_library",
"//library/log:go_default_library",
"//library/net/http/blademaster:go_default_library",
],
)
filegroup(
name = "package-srcs",
srcs = glob(["**"]),
tags = ["automanaged"],
visibility = ["//visibility:private"],
)
filegroup(
name = "all-srcs",
srcs = [":package-srcs"],
tags = ["automanaged"],
visibility = ["//visibility:public"],
)

View File

@@ -0,0 +1,33 @@
package http
import (
"go-common/app/service/main/search/model"
"go-common/library/ecode"
"go-common/library/log"
bm "go-common/library/net/http/blademaster"
)
func dmDate(c *bm.Context) {
var (
err error
sp = &model.DmDateParams{
Bsp: &model.BasicSearchParams{},
}
res *model.SearchResult
)
if err = c.Bind(sp); err != nil {
c.JSON(nil, ecode.RequestErr)
return
}
if err = c.Bind(sp.Bsp); err != nil {
c.JSON(nil, ecode.RequestErr)
return
}
res, err = svr.DmDate(c, sp)
if err != nil {
log.Error("srv.DmDate(%v) error(%v)", sp, err)
c.JSON(nil, ecode.ServerErr)
return
}
c.JSON(res, err)
}

View File

@@ -0,0 +1,34 @@
package http
import (
"go-common/app/service/main/search/model"
"go-common/library/ecode"
"go-common/library/log"
bm "go-common/library/net/http/blademaster"
)
func dmSearch(c *bm.Context) {
var (
err error
sp = &model.DmSearchParams{
Bsp: &model.BasicSearchParams{},
}
res *model.SearchResult
)
if err = c.Bind(sp); err != nil {
c.JSON(nil, ecode.RequestErr)
return
}
if err = c.Bind(sp.Bsp); err != nil {
c.JSON(nil, ecode.RequestErr)
return
}
sp.Bsp.Source = []string{"id"}
res, err = svr.DmSearch(c, sp)
if err != nil {
log.Error("srv.DmSearch(%v) error(%v)", sp, err)
c.JSON(nil, ecode.ServerErr)
return
}
c.JSON(res, err)
}

View File

@@ -0,0 +1,81 @@
package http
import (
"encoding/json"
"go-common/app/service/main/search/dao"
"go-common/app/service/main/search/model"
"go-common/library/ecode"
"go-common/library/log"
bm "go-common/library/net/http/blademaster"
)
// dmUpdate .
func dmUpdate(c *bm.Context) {
params := c.Request.Form
appid := params.Get("appid")
if appid == "" {
c.JSON(nil, ecode.RequestErr)
return
}
switch appid {
case "dm_search":
dmMediaUpdate(c)
default:
c.JSON(nil, ecode.RequestErr)
}
}
func dmMediaUpdate(c *bm.Context) {
var (
err error
bulkItem []dao.BulkMapItem
)
params := c.Request.Form
data := params.Get("data")
if data == "" {
return
}
var arr []map[string]interface{}
if err = json.Unmarshal([]byte(data), &arr); err != nil {
log.Error("json.Unmarshal error(%v)", err)
return
}
key := []string{"attr", "attr_format", "ctime", "mid", "mode", "msg", "mtime",
"pool", "progress", "state", "type", "oidstr"}
for _, v := range arr {
item := &model.DmUptParams{}
var (
ok bool
id float64
oid float64
)
if _, ok = v["id"]; !ok {
continue
}
if id, ok = v["id"].(float64); !ok {
continue
}
if _, ok = v["oid"]; !ok {
continue
}
if oid, ok = v["oid"].(float64); !ok {
continue
}
item.ID = int64(id)
item.Oid = int64(oid)
itemField := make(map[string]interface{})
for _, k := range key {
var it interface{}
if it, ok = v[k]; ok && v[k] != nil {
itemField[k] = it
}
}
item.Field = itemField
bulkItem = append(bulkItem, item)
}
if err = svr.UpdateMap(c, "dmExternal", bulkItem); err != nil {
log.Error("srv.Update erro(%v)", err)
}
c.JSON(nil, nil)
}

View File

@@ -0,0 +1,39 @@
package http
import (
"go-common/app/service/main/search/model"
"go-common/library/ecode"
"go-common/library/log"
bm "go-common/library/net/http/blademaster"
)
func dmHistorySearch(c *bm.Context) {
var (
err error
params = c.Request.Form
sp = &model.DmHistoryParams{
Bsp: &model.BasicSearchParams{},
}
res *model.SearchResult
)
if params.Get("appid") == "" || params.Get("oid") == "" {
c.JSON(nil, ecode.RequestErr)
return
}
if err = c.Bind(sp); err != nil {
c.JSON(nil, ecode.RequestErr)
return
}
if err = c.Bind(sp.Bsp); err != nil {
c.JSON(nil, ecode.RequestErr)
return
}
sp.Bsp.Source = []string{"id"}
res, err = svr.DmHistory(c, sp)
if err != nil {
log.Error("srv.DmHistory(%v) error(%v)", sp, err)
c.JSON(nil, ecode.ServerErr)
return
}
c.JSON(res, err)
}

View File

@@ -0,0 +1,53 @@
package http
import (
"go-common/app/service/main/search/conf"
"go-common/app/service/main/search/service"
"go-common/library/log"
bm "go-common/library/net/http/blademaster"
)
var (
svr *service.Service
)
// Init init http
func Init(c *conf.Config, s *service.Service) error {
svr = s
// init internal router
engine := bm.DefaultServer(c.HTTPServer)
route(engine)
// init internal server
if err := engine.Start(); err != nil {
log.Error("bm.Start error(%v)", err)
return err
}
return nil
}
func route(e *bm.Engine) {
e.Ping(ping)
searchG := e.Group("/x/internal/search")
{
//search
searchG.GET("/reply", replySearch)
searchG.GET("/dmhistory", dmHistorySearch)
searchG.GET("/dmhistory/test", dmHistorySearch)
searchG.GET("/dm", dmSearch)
searchG.GET("/dm/date", dmDate)
searchG.GET("/pgc", pgcSearch)
//update
searchG.POST("/reply/update", replyUpdate)
searchG.POST("/pgc/update", pgcUpdate)
searchG.POST("/dm/update", dmUpdate)
}
}
// ping check health
func ping(ctx *bm.Context) {
if err := svr.Ping(ctx); err != nil {
log.Error("ping error(%v)", err)
ctx.Error = err
ctx.AbortWithStatus(503)
}
}

View File

@@ -0,0 +1,45 @@
package http
import (
"go-common/app/service/main/search/model"
"go-common/library/ecode"
"go-common/library/log"
bm "go-common/library/net/http/blademaster"
)
func pgcSearch(c *bm.Context) {
params := c.Request.Form
appidStr := params.Get("appid")
switch appidStr {
case "pgc_media":
pgcMedia(c)
default:
c.JSON(nil, ecode.RequestErr)
return
}
}
func pgcMedia(c *bm.Context) {
var (
err error
sp = &model.PgcMediaParams{
Bsp: &model.BasicSearchParams{},
}
res *model.SearchResult
)
if err = c.Bind(sp); err != nil {
c.JSON(nil, ecode.RequestErr)
return
}
if err = c.Bind(sp.Bsp); err != nil {
c.JSON(nil, ecode.RequestErr)
return
}
res, err = svr.PgcMedia(c, sp)
if err != nil {
log.Error("srv.DmHistory(%v) error(%v)", sp, err)
c.JSON(nil, ecode.ServerErr)
return
}
c.JSON(res, err)
}

View File

@@ -0,0 +1,72 @@
package http
import (
"encoding/json"
"go-common/app/service/main/search/dao"
"go-common/app/service/main/search/model"
"go-common/library/ecode"
"go-common/library/log"
bm "go-common/library/net/http/blademaster"
)
// pgcUpdate .
func pgcUpdate(c *bm.Context) {
params := c.Request.Form
appid := params.Get("appid")
if appid == "" {
c.JSON(nil, ecode.RequestErr)
return
}
switch appid {
case "pgc_media":
go pgcMediaUpdate(c)
default:
c.JSON(nil, ecode.RequestErr)
}
}
func pgcMediaUpdate(c *bm.Context) {
var (
err error
bulkItem []dao.BulkMapItem
)
params := c.Request.Form
data := params.Get("data")
if data == "" {
return
}
var arr []map[string]interface{}
if err = json.Unmarshal([]byte(data), &arr); err != nil {
log.Error("json.Unmarshal error(%v)", err)
return
}
key := []string{"season_id", "copyright", "latest_time", "dm_count", "play_count", "fav_count", "area_id", "score",
"is_finish", "season_version", "season_status", "release_date", "pub_time", "season_month", "copyright_info"}
for _, v := range arr {
item := &model.PgcMediaUptParams{}
var (
ok bool
id float64
)
if _, ok = v["media_id"]; !ok {
continue
}
if id, ok = v["media_id"].(float64); !ok {
continue
}
item.MediaID = int64(id)
itemField := make(map[string]interface{})
for _, k := range key {
var it interface{}
if it, ok = v[k]; ok && v[k] != nil {
itemField[k] = it
}
}
item.Field = itemField
bulkItem = append(bulkItem, item)
}
if err = svr.UpdateMap(c, "externalPublic", bulkItem); err != nil {
log.Error("srv.Update erro(%v)", err)
}
}

View File

@@ -0,0 +1,49 @@
package http
import (
"go-common/app/service/main/search/model"
"go-common/library/ecode"
"go-common/library/log"
bm "go-common/library/net/http/blademaster"
)
func replySearch(c *bm.Context) {
params := c.Request.Form
appidStr := params.Get("appid")
switch appidStr {
case "reply_record":
replyRecord(c)
default:
c.JSON(nil, ecode.RequestErr)
return
}
}
func replyRecord(c *bm.Context) {
var (
err error
sp = &model.ReplyRecordParams{
Bsp: &model.BasicSearchParams{},
}
res *model.SearchResult
params = c.Request.Form
)
if params.Get("mid") == "" {
log.Error("mid is required")
c.JSON(nil, ecode.RequestErr)
return
}
if err = c.Bind(sp); err != nil {
c.JSON(nil, ecode.RequestErr)
return
}
if err = c.Bind(sp.Bsp); err != nil {
c.JSON(nil, ecode.RequestErr)
return
}
res, err = svr.ReplyRecord(c, sp)
if err != nil {
log.Error("svr.ArchiveCheck(%v,%d,%d) error(%v)", sp, sp.Bsp.Pn, sp.Bsp.Ps, err)
}
c.JSON(res, err)
}

View File

@@ -0,0 +1,53 @@
package http
import (
"encoding/json"
"go-common/app/service/main/search/dao"
"go-common/app/service/main/search/model"
"go-common/library/ecode"
"go-common/library/log"
bm "go-common/library/net/http/blademaster"
)
// replyUpdate
func replyUpdate(c *bm.Context) {
params := c.Request.Form
appid := params.Get("appid")
if appid == "" {
c.JSON(nil, ecode.RequestErr)
return
}
switch appid {
case "reply_record":
replyRecordUpdate(c)
default:
c.JSON(nil, ecode.RequestErr)
}
}
func replyRecordUpdate(c *bm.Context) {
var (
err error
bulkItem []dao.BulkItem
d []*model.ReplyRecordUpdateParams
)
params := c.Request.Form
data := params.Get("data")
if data == "" {
c.JSON(nil, ecode.RequestErr)
return
}
if err = json.Unmarshal([]byte(data), &d); err != nil {
log.Error("json.Unmarshal error(%v)", err)
c.JSON(nil, ecode.RequestErr)
return
}
for _, v := range d {
bulkItem = append(bulkItem, v)
}
if err = svr.Update(c, "replyExternal", bulkItem); err != nil {
log.Error("srv.Update error(%v)", err)
}
c.JSON(nil, err)
}

View File

@@ -0,0 +1,36 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
)
go_library(
name = "go_default_library",
srcs = [
"dm_date.go",
"dm_history.go",
"dm_search.go",
"es.go",
"pgc.go",
"reply.go",
"rpc.go",
],
importpath = "go-common/app/service/main/search/model",
tags = ["automanaged"],
visibility = ["//visibility:public"],
)
filegroup(
name = "package-srcs",
srcs = glob(["**"]),
tags = ["automanaged"],
visibility = ["//visibility:private"],
)
filegroup(
name = "all-srcs",
srcs = [":package-srcs"],
tags = ["automanaged"],
visibility = ["//visibility:public"],
)

View File

@@ -0,0 +1,10 @@
package model
// DmDateParams .
type DmDateParams struct {
Bsp *BasicSearchParams
Oid int64 `form:"oid" params:"oid" default:"-1"`
Month string `form:"month" params:"month" default:""`
MonthFrom string `form:"month_from" params:"month_from" default:""`
MonthTo string `form:"month_to" params:"month_to" default:""`
}

View File

@@ -0,0 +1,10 @@
package model
// DmHistoryParams .
type DmHistoryParams struct {
Bsp *BasicSearchParams
Oid int64 `form:"oid" params:"oid" default:"-1"`
States []int64 `form:"states,split" params:"states"`
CtimeFrom string `form:"ctime_from" params:"ctime_from"`
CtimeTo string `form:"ctime_to" params:"ctime_to"`
}

View File

@@ -0,0 +1,48 @@
package model
import (
"fmt"
"strconv"
)
// DmSearchParams .
type DmSearchParams struct {
Bsp *BasicSearchParams
Oid int64 `form:"oid" params:"oid" default:"-1"`
Mid int64 `form:"mid" params:"mid" default:"-1"`
Mode int `form:"mode" params:"mode" default:"-1"`
Pool int `form:"pool" params:"pool" default:"-1"`
Progress int `form:"progress" params:"progress" default:"-1"`
States []int `form:"states,split" params:"states"`
Type int `form:"type" params:"type" default:"-1"`
AttrFormat []int `form:"attr_format,split" params:"attr_format"`
CtimeFrom string `form:"ctime_from" params:"ctime_from"`
CtimeTo string `form:"ctime_to" params:"ctime_to"`
}
// DmUptParams .
type DmUptParams struct {
ID int64 `json:"id"`
Oid int64 `json:"oid"`
Field map[string]interface{}
}
// IndexName .
func (m *DmUptParams) IndexName() string {
return "dm_search_" + strconv.FormatInt(m.Oid%1000, 10)
}
// IndexType .
func (m *DmUptParams) IndexType() string {
return "base"
}
// IndexID .
func (m *DmUptParams) IndexID() string {
return fmt.Sprintf("%d", m.ID)
}
// PField .
func (m *DmUptParams) PField() map[string]interface{} {
return m.Field
}

View File

@@ -0,0 +1,42 @@
package model
import "encoding/json"
// ES .
type ES struct {
Addr string
}
// Page .
type Page struct {
Pn int `json:"num"`
Ps int `json:"size"`
Total int64 `json:"total"`
}
// SearchResult search result.
type SearchResult struct {
Order string `json:"order"`
Sort string `json:"sort"`
Result []json.RawMessage `json:"result"`
Page *Page `json:"page"`
Debug string `json:"debug"`
}
// BasicSearchParams .
type BasicSearchParams struct {
AppID string `form:"appid" params:"appid"`
KW string `form:"kw" params:"kw"`
KwFields []string `form:"kw_fields,split" params:"kw_fields"`
Order []string `form:"order,split" params:"order"`
Sort []string `form:"sort,split" params:"sort" default:"desc"`
Pn int `form:"pn" params:"pn;Range(1,5000)" default:"1"`
Ps int `form:"ps" params:"ps;Range(1,10000)" default:"50"`
Debug bool `form:"debug" params:"debug"`
Source []string
}
// BasicUpdateParams .
type BasicUpdateParams struct {
AppID string
}

View File

@@ -0,0 +1,61 @@
package model
import "fmt"
// PgcMediaParams .
type PgcMediaParams struct {
Bsp *BasicSearchParams
MediaIds []int64 `form:"media_ids,split" params:"media_ids"`
SeasonIds []int64 `form:"season_ids,split" params:"season_ids"`
SeasonTypes []int64 `form:"season_types,split" params:"season_types"`
StyleIds []int64 `form:"style_ids,split" params:"style_ids"`
Status int `form:"status" params:"status" default:"-1000"`
ReleaseDateFrom string `form:"release_date_from" params:"release_date_from"`
ReleaseDateTo string `form:"release_date_to" params:"release_date_to"`
SeasonIDFrom int `form:"season_id_from" params:"season_id_from"`
SeasonIDTo int `form:"season_id_to" params:"season_id_to"`
ProducerIds []int64 `form:"producer_ids,split" params:"producer_ids"`
IsDeleted int `form:"is_deleted" params:"is_deleted" default:"0"`
AreaIds []string `form:"area_ids,split" params:"area_ids"`
ScoreFrom int `form:"score_from" params:"score_from"`
ScoreTo int `form:"score_to" params:"score_to"`
IsFinish string `form:"is_finish" params:"is_finish"`
SeasonVersions []int64 `form:"season_versions,split" params:"season_versions"`
SeasonStatuses []int64 `form:"season_statuses,split" params:"season_statuses"`
PubTimeFrom string `form:"pub_time_from" params:"pub_time_from"`
PubTimeTo string `form:"pub_time_to" params:"pub_time_to"`
SeasonMonths []int64 `form:"season_months,split" params:"season_months"`
LatestTimeFrom string `form:"latest_time_from" params:"latest_time_from"`
LatestTimeTo string `form:"latest_time_to" params:"latest_time_to"`
CopyrightInfos []string `form:"copyright_infos,split" params:"copyright_infos"`
CTimeFrom string `form:"ctime_from" params:"ctime_from"`
CTimeTo string `form:"ctime_to" params:"ctime_to"`
MTimeFrom string `form:"mtime_from" params:"mtime_from"`
MTimeTo string `form:"mtime_to" params:"mtime_to"`
}
// PgcMediaUptParams .
type PgcMediaUptParams struct {
MediaID int64 `json:"media_id"`
Field map[string]interface{}
}
// IndexName .
func (m *PgcMediaUptParams) IndexName() string {
return "pgc_media"
}
// IndexType .
func (m *PgcMediaUptParams) IndexType() string {
return "base"
}
// IndexID .
func (m *PgcMediaUptParams) IndexID() string {
return fmt.Sprintf("%d", m.MediaID)
}
// PField .
func (m *PgcMediaUptParams) PField() map[string]interface{} {
return m.Field
}

View File

@@ -0,0 +1,36 @@
package model
import "fmt"
// ReplyRecordParams search params.
type ReplyRecordParams struct {
Bsp *BasicSearchParams
Mid int64 `form:"mid" params:"mid"`
Types []int64 `form:"types,split" params:"types"`
States []int64 `form:"states,split" params:"states"`
CTimeFrom string `form:"ctime_from" params:"ctime_from"`
CTimeTo string `form:"ctime_to" params:"ctime_to"`
}
// ReplyRecordUpdateParams search params.
type ReplyRecordUpdateParams struct {
ID int64 `json:"id"`
OID int64 `json:"oid"`
MID int64 `json:"mid"`
State int `json:"state"`
}
// IndexName .
func (m *ReplyRecordUpdateParams) IndexName() string {
return fmt.Sprintf("replyrecord_%d", m.MID%100)
}
// IndexType .
func (m *ReplyRecordUpdateParams) IndexType() string {
return "base"
}
// IndexID .
func (m *ReplyRecordUpdateParams) IndexID() string {
return fmt.Sprintf("%d_%d", m.ID, m.OID)
}

View File

@@ -0,0 +1,16 @@
package model
// ArgDMHistory .
type ArgDMHistory struct {
Oid int64
Date string
Pn int
Ps int
Order string
Sort string
}
// DMHistory .
type DMHistory struct {
ID int64 `json:"id"`
}

View File

@@ -0,0 +1,60 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_test",
"go_library",
)
go_test(
name = "go_default_test",
srcs = [
"pgc_test.go",
"reply_test.go",
"service_test.go",
],
embed = [":go_default_library"],
rundir = ".",
tags = ["automanaged"],
deps = [
"//app/service/main/search/conf:go_default_library",
"//app/service/main/search/model:go_default_library",
"//vendor/github.com/smartystreets/goconvey/convey:go_default_library",
],
)
go_library(
name = "go_default_library",
srcs = [
"dm_date.go",
"dm_history.go",
"dm_search.go",
"pgc.go",
"reply.go",
"service.go",
"update.go",
],
importpath = "go-common/app/service/main/search/service",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/service/main/search/conf:go_default_library",
"//app/service/main/search/dao:go_default_library",
"//app/service/main/search/model:go_default_library",
"//library/ecode:go_default_library",
],
)
filegroup(
name = "package-srcs",
srcs = glob(["**"]),
tags = ["automanaged"],
visibility = ["//visibility:private"],
)
filegroup(
name = "all-srcs",
srcs = [":package-srcs"],
tags = ["automanaged"],
visibility = ["//visibility:public"],
)

View File

@@ -0,0 +1,18 @@
package service
import (
"context"
"fmt"
"go-common/app/service/main/search/dao"
"go-common/app/service/main/search/model"
"go-common/library/ecode"
)
func (s *Service) DmDate(c context.Context, sp *model.DmDateParams) (res *model.SearchResult, err error) {
if res, err = s.dao.DmDateSearch(c, sp); err != nil {
dao.PromError(fmt.Sprintf("es:%s 搜索dm_date失败", sp.Bsp.AppID), "s.dao.DmSearch(%v) error(%v)", sp, err)
err = ecode.SearchDmFailed
}
return
}

View File

@@ -0,0 +1,19 @@
package service
import (
"context"
"fmt"
"go-common/app/service/main/search/dao"
"go-common/app/service/main/search/model"
"go-common/library/ecode"
)
// DMHistory .
func (s *Service) DmHistory(c context.Context, sp *model.DmHistoryParams) (res *model.SearchResult, err error) {
if res, err = s.dao.DmHistory(c, sp); err != nil {
dao.PromError(fmt.Sprintf("es:%s 搜索dm_history失败", sp.Bsp.AppID), "s.dao.DmHistory(%v) error(%v)", sp, err)
err = ecode.SearchDmFailed
}
return
}

View File

@@ -0,0 +1,18 @@
package service
import (
"context"
"fmt"
"go-common/app/service/main/search/dao"
"go-common/app/service/main/search/model"
"go-common/library/ecode"
)
func (s *Service) DmSearch(c context.Context, sp *model.DmSearchParams) (res *model.SearchResult, err error) {
if res, err = s.dao.DmSearch(c, sp); err != nil {
dao.PromError(fmt.Sprintf("es:%s 搜索dm_search失败", sp.Bsp.AppID), "s.dao.DmSearch(%v) error(%v)", sp, err)
err = ecode.SearchDmFailed
}
return
}

View File

@@ -0,0 +1,19 @@
package service
import (
"context"
"fmt"
"go-common/app/service/main/search/dao"
"go-common/app/service/main/search/model"
"go-common/library/ecode"
)
// PgcMedia .
func (s *Service) PgcMedia(c context.Context, sp *model.PgcMediaParams) (res *model.SearchResult, err error) {
if res, err = s.dao.PgcMedia(c, sp); err != nil {
dao.PromError(fmt.Sprintf("es:%s 搜索pgc番剧失败", sp.Bsp.AppID), "s.dao.PgcMedia(%v) error(%v)", sp, err)
err = ecode.SearchPgcMediaFailed
}
return
}

View File

@@ -0,0 +1,23 @@
package service
import (
"context"
"go-common/app/service/main/search/model"
"testing"
. "github.com/smartystreets/goconvey/convey"
)
func Test_PgcMedia(t *testing.T) {
var (
err error
c = context.TODO()
sp *model.PgcMediaParams
)
Convey("PgcMedia", t, WithService(func(s *Service) {
_, err = s.PgcMedia(c, sp)
So(err, ShouldBeNil)
}))
}

View File

@@ -0,0 +1,19 @@
package service
import (
"context"
"fmt"
"go-common/app/service/main/search/dao"
"go-common/app/service/main/search/model"
"go-common/library/ecode"
)
// ReplyRecord gets reply record.
func (s *Service) ReplyRecord(c context.Context, sp *model.ReplyRecordParams) (res *model.SearchResult, err error) {
if res, err = s.dao.ReplyRecord(c, sp); err != nil {
dao.PromError(fmt.Sprintf("es:%s 搜索replyrecord失败", sp.Bsp.AppID), "s.dao.ReplyRecord(%v,%d,%d) error(%v) ", sp, sp.Bsp.Pn, sp.Bsp.Ps, err)
err = ecode.SearchReplyRecordFailed
}
return
}

View File

@@ -0,0 +1,23 @@
package service
import (
"context"
"go-common/app/service/main/search/model"
"testing"
. "github.com/smartystreets/goconvey/convey"
)
func Test_Reply(t *testing.T) {
var (
err error
c = context.TODO()
sp *model.ReplyRecordParams
)
Convey("Reply", t, WithService(func(s *Service) {
_, err = s.ReplyRecord(c, sp)
So(err, ShouldBeNil)
}))
}

View File

@@ -0,0 +1,30 @@
package service
import (
"context"
"go-common/app/service/main/search/conf"
"go-common/app/service/main/search/dao"
)
// Service struct of service.
type Service struct {
// conf
c *conf.Config
// dao
dao *dao.Dao
}
// New create service instance and return.
func New(c *conf.Config) (s *Service) {
s = &Service{
c: c,
dao: dao.New(c),
}
return
}
// Ping
func (s *Service) Ping(c context.Context) error {
return s.dao.Ping(c)
}

View File

@@ -0,0 +1,19 @@
package service
import (
"flag"
"path/filepath"
"go-common/app/service/main/search/conf"
)
func WithService(f func(s *Service)) func() {
return func() {
dir, _ := filepath.Abs("../goconvey.toml")
flag.Set("conf", dir)
conf.Init()
s := New(conf.Conf)
// s.dao = dao.New(conf.Conf)
f(s)
}
}

View File

@@ -0,0 +1,26 @@
package service
import (
"context"
"fmt"
"go-common/app/service/main/search/dao"
"go-common/library/ecode"
)
// Update update some indices.
func (s *Service) Update(c context.Context, esName string, bulkData []dao.BulkItem) (err error) {
if err = s.dao.UpdateBulk(c, esName, bulkData); err != nil {
dao.PromError(fmt.Sprintf("es:%s 更新失败", esName), "s.dao.updateBulk error(%v) ", err)
err = ecode.SearchUpdateIndexFailed
}
return
}
func (s *Service) UpdateMap(c context.Context, esName string, bulkData []dao.BulkMapItem) (err error) {
if err = s.dao.UpdateMapBulk(c, esName, bulkData); err != nil {
dao.PromError(fmt.Sprintf("es:%s 更新失败", esName), "s.dao.updateBulk error(%v) ", err)
err = ecode.SearchUpdateIndexFailed
}
return
}