123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401 |
- package dao
- import (
- "context"
- "encoding/json"
- "fmt"
- "time"
- "go-common/app/admin/main/search/model"
- "gopkg.in/olivere/elastic.v5"
- )
- // ArchiveCheck search archive check from ES.
- func (d *Dao) ArchiveCheck(c context.Context, p *model.ArchiveCheckParams) (res *model.SearchResult, err error) {
- query := elastic.NewBoolQuery()
- if len(p.Bsp.KWs) > 0 {
- for _, v := range p.Bsp.KWs {
- if p.Bsp.Pattern == "equal" {
- query = query.Must(elastic.NewMultiMatchQuery(v, p.Bsp.KwFields...).Type("best_fields").TieBreaker(0.3).MinimumShouldMatch("100%"))
- } else {
- query = query.Should(elastic.NewMultiMatchQuery(v, p.Bsp.KwFields...).Type("best_fields").TieBreaker(0.3).MinimumShouldMatch("80%")).MinimumNumberShouldMatch(1)
- }
- }
- } else if p.Bsp.KW != "" { //高级搜索比下面的高
- query = query.Must(elastic.NewMultiMatchQuery(p.Bsp.KW, p.Bsp.KwFields...).Type("best_fields").TieBreaker(0.3).MinimumShouldMatch("100%"))
- }
- if p.FromIP != "" {
- query = query.Must(elastic.NewQueryStringQuery("*" + p.FromIP + "*").AllowLeadingWildcard(true).Field("from_ip"))
- }
- if len(p.Aids) > 0 {
- interfaceSlice := make([]interface{}, len(p.Aids))
- for i, d := range p.Aids {
- interfaceSlice[i] = d
- }
- query = query.Filter(elastic.NewTermsQuery("aid", interfaceSlice...))
- }
- if len(p.TypeIds) > 0 {
- interfaceSlice := make([]interface{}, len(p.TypeIds))
- for i, d := range p.TypeIds {
- interfaceSlice[i] = d
- }
- query = query.Filter(elastic.NewTermsQuery("typeid", interfaceSlice...))
- }
- if len(p.Attrs) > 0 {
- interfaceSlice := make([]interface{}, len(p.Attrs))
- for i, d := range p.Attrs {
- interfaceSlice[i] = d
- }
- query = query.Filter(elastic.NewTermsQuery("attribute", interfaceSlice...))
- }
- if len(p.States) > 0 {
- interfaceSlice := make([]interface{}, len(p.States))
- for i, d := range p.States {
- interfaceSlice[i] = d
- }
- query = query.Filter(elastic.NewTermsQuery("state", interfaceSlice...))
- }
- if len(p.Mids) > 0 {
- interfaceSlice := make([]interface{}, len(p.Mids))
- for i, d := range p.Mids {
- interfaceSlice[i] = d
- }
- query = query.Filter(elastic.NewTermsQuery("mid", interfaceSlice...))
- }
- if p.MidFrom > 0 {
- query = query.Filter(elastic.NewRangeQuery("mid").Gte(p.MidFrom))
- }
- if p.MidTo > 0 {
- query = query.Filter(elastic.NewRangeQuery("mid").Lte(p.MidTo))
- }
- if p.DurationFrom > 0 {
- query = query.Filter(elastic.NewRangeQuery("duration").Gte(p.DurationFrom))
- }
- if p.DurationTo > 0 {
- query = query.Filter(elastic.NewRangeQuery("duration").Lte(p.DurationTo))
- }
- if p.TimeFrom != "" && (p.Time == "ctime" || p.Time == "mtime" || p.Time == "pubtime") {
- query = query.Filter(elastic.NewRangeQuery(p.Time).Gte(p.TimeFrom))
- }
- if p.TimeTo != "" && (p.Time == "ctime" || p.Time == "mtime" || p.Time == "pubtime") {
- query = query.Filter(elastic.NewRangeQuery(p.Time).Lte(p.TimeTo))
- }
- if res, err = d.searchResult(c, "ssd_archive", "archivecheck", query, p.Bsp); err != nil {
- PromError(fmt.Sprintf("es:%s ", p.Bsp.AppID), "%v", err)
- }
- return
- }
- // Video search video from ES (deprecated).
- func (d *Dao) Video(c context.Context, p *model.VideoParams) (res *model.SearchResult, err error) {
- query := elastic.NewBoolQuery()
- if p.Bsp.KW != "" {
- query = query.Must(elastic.NewMultiMatchQuery(p.Bsp.KW, p.Bsp.KwFields...).Type("best_fields").TieBreaker(0.3))
- }
- if len(p.VIDs) > 0 {
- interfaceSlice := make([]interface{}, len(p.VIDs))
- for i, d := range p.VIDs {
- interfaceSlice[i] = d
- }
- query = query.Filter(elastic.NewTermsQuery("vid", interfaceSlice...))
- }
- if len(p.AIDs) > 0 {
- interfaceSlice := make([]interface{}, len(p.AIDs))
- for i, d := range p.AIDs {
- interfaceSlice[i] = d
- }
- query = query.Filter(elastic.NewTermsQuery("aid", interfaceSlice...))
- }
- if len(p.CIDs) > 0 {
- interfaceSlice := make([]interface{}, len(p.CIDs))
- for i, d := range p.CIDs {
- interfaceSlice[i] = d
- }
- query = query.Filter(elastic.NewTermsQuery("cid", interfaceSlice...))
- }
- if len(p.TIDs) > 0 {
- interfaceSlice := make([]interface{}, len(p.TIDs))
- for i, d := range p.TIDs {
- interfaceSlice[i] = d
- }
- query = query.Filter(elastic.NewTermsQuery("arc_typeid", interfaceSlice...))
- }
- if len(p.FileNames) > 0 {
- interfaceSlice := make([]interface{}, len(p.FileNames))
- for i, d := range p.FileNames {
- interfaceSlice[i] = d
- }
- query = query.Filter(elastic.NewTermsQuery("filename", interfaceSlice...))
- }
- if len(p.RelationStates) > 0 {
- interfaceSlice := make([]interface{}, len(p.RelationStates))
- for i, d := range p.RelationStates {
- interfaceSlice[i] = d
- }
- query = query.Filter(elastic.NewTermsQuery("relation_state", interfaceSlice...))
- }
- if len(p.ArcMids) > 0 {
- interfaceSlice := make([]interface{}, len(p.ArcMids))
- for i, d := range p.ArcMids {
- interfaceSlice[i] = d
- }
- query = query.Filter(elastic.NewTermsQuery("arc_mid", interfaceSlice...))
- }
- if len(p.ArcMids) > 0 {
- interfaceSlice := make([]interface{}, len(p.ArcMids))
- for i, d := range p.ArcMids {
- interfaceSlice[i] = d
- }
- query = query.Filter(elastic.NewTermsQuery("arc_mid", interfaceSlice...))
- }
- if p.TagID > 0 {
- query = query.Filter(elastic.NewTermQuery("tag_id", p.TagID))
- }
- if len(p.Status) > 0 {
- interfaceSlice := make([]interface{}, len(p.Status))
- for i, d := range p.Status {
- interfaceSlice[i] = d
- }
- query = query.Filter(elastic.NewTermsQuery("status", interfaceSlice...))
- }
- if len(p.XCodeState) > 0 {
- interfaceSlice := make([]interface{}, len(p.XCodeState))
- for i, d := range p.XCodeState {
- interfaceSlice[i] = d
- }
- query = query.Filter(elastic.NewTermsQuery("xcode_state", interfaceSlice...))
- }
- // 不再查库过滤arc_mid
- if p.UserType > 0 {
- query = query.Filter(elastic.NewTermQuery("user_type", p.UserType))
- }
- if p.DurationFrom > 0 {
- query = query.Filter(elastic.NewRangeQuery("duration").Gte(p.DurationFrom))
- }
- if p.DurationTo > 0 {
- query = query.Filter(elastic.NewRangeQuery("duration").Lte(p.DurationTo))
- }
- if p.OrderType == 1 {
- diffs := time.Now().Unix() - 1420041600
- days := fmt.Sprintf("%dd", diffs/(3600*24))
- score := elastic.NewFunctionScoreQuery().Add(elastic.NewTermQuery("user_type", 1), elastic.NewExponentialDecayFunction().FieldName("arc_senddate").Origin("2015-01-01 00:00:00").Scale(days).Offset("1d").Decay(0.8).Weight(float64(10000))).Add(nil, elastic.NewExponentialDecayFunction().FieldName("arc_senddate").Origin("2015-01-01 00:00:00").Scale(days).Offset("1d").Decay(0.8).Weight(float64(1)))
- query = query.Must(score)
- p.Bsp.Order = []string{}
- }
- if res, err = d.searchResult(c, "ssd_archive", "archive_video", query, p.Bsp); err != nil {
- PromError(fmt.Sprintf("es:%s ", p.Bsp.AppID), "%v", err)
- }
- return
- }
- // TaskQa .
- func (d *Dao) TaskQa(c context.Context, p *model.TaskQa) (res *model.SearchResult, err error) {
- query := elastic.NewBoolQuery()
- if p.Bsp.KW != "" {
- query = query.Must(elastic.NewMultiMatchQuery(p.Bsp.KW, p.Bsp.KwFields...).Type("best_fields").TieBreaker(0.3))
- }
- if len(p.Ids) > 0 {
- interfaceSlice := make([]interface{}, len(p.Ids))
- for i, d := range p.Ids {
- interfaceSlice[i] = d
- }
- query = query.Filter(elastic.NewTermsQuery("id", interfaceSlice...))
- }
- if len(p.TaskIds) > 0 {
- interfaceSlice := make([]interface{}, len(p.TaskIds))
- for i, d := range p.TaskIds {
- interfaceSlice[i] = d
- }
- query = query.Filter(elastic.NewTermsQuery("task_id", interfaceSlice...))
- }
- if len(p.Uids) > 0 {
- interfaceSlice := make([]interface{}, len(p.Uids))
- for i, d := range p.Uids {
- interfaceSlice[i] = d
- }
- query = query.Filter(elastic.NewTermsQuery("uid", interfaceSlice...))
- }
- if len(p.ArcTagIds) > 0 {
- interfaceSlice := make([]interface{}, len(p.ArcTagIds))
- for i, d := range p.ArcTagIds {
- interfaceSlice[i] = d
- }
- query = query.Filter(elastic.NewTermsQuery("arc_tagid", interfaceSlice...))
- }
- if len(p.AuditTagIds) > 0 {
- interfaceSlice := make([]interface{}, len(p.AuditTagIds))
- for i, d := range p.AuditTagIds {
- interfaceSlice[i] = d
- }
- query = query.Filter(elastic.NewTermsQuery("audit_tagid", interfaceSlice...))
- }
- if len(p.UpGroups) > 0 {
- interfaceSlice := make([]interface{}, len(p.UpGroups))
- for i, d := range p.UpGroups {
- interfaceSlice[i] = d
- }
- query = query.Filter(elastic.NewTermsQuery("up_groups", interfaceSlice...))
- }
- if len(p.ArcTitles) > 0 {
- interfaceSlice := make([]interface{}, len(p.ArcTitles))
- for i, d := range p.ArcTitles {
- interfaceSlice[i] = d
- }
- query = query.Filter(elastic.NewTermsQuery("arc_title", interfaceSlice...))
- }
- if len(p.ArcTypeIds) > 0 {
- interfaceSlice := make([]interface{}, len(p.ArcTypeIds))
- for i, d := range p.ArcTypeIds {
- interfaceSlice[i] = d
- }
- query = query.Filter(elastic.NewTermsQuery("arc_typeid", interfaceSlice...))
- }
- if len(p.States) > 0 {
- interfaceSlice := make([]interface{}, len(p.States))
- for i, d := range p.States {
- interfaceSlice[i] = d
- }
- query = query.Filter(elastic.NewTermsQuery("state", interfaceSlice...))
- }
- if len(p.AuditStatuses) > 0 {
- interfaceSlice := make([]interface{}, len(p.AuditStatuses))
- for i, d := range p.AuditStatuses {
- interfaceSlice[i] = d
- }
- query = query.Filter(elastic.NewTermsQuery("audit_status", interfaceSlice...))
- }
- if p.FansFrom != "" {
- query = query.Filter(elastic.NewRangeQuery("fans").Gte(p.FansFrom))
- }
- if p.FansTo != "" {
- query = query.Filter(elastic.NewRangeQuery("fans").Lte(p.FansTo))
- }
- 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 p.FtimeFrom != "" {
- query = query.Filter(elastic.NewRangeQuery("ftime").Gte(p.FtimeFrom))
- }
- if p.FtimeTo != "" {
- query = query.Filter(elastic.NewRangeQuery("ftime").Lte(p.FtimeTo))
- }
- if res, err = d.searchResult(c, "ssd_archive", p.Bsp.AppID, query, p.Bsp); err != nil {
- PromError(fmt.Sprintf("es:%s ", p.Bsp.AppID), "%v", err)
- }
- return
- }
- // ArchiveCommerce .
- func (d *Dao) ArchiveCommerce(c context.Context, p *model.ArchiveCommerce) (res *model.SearchResult, err error) {
- query := elastic.NewBoolQuery()
- if p.Bsp.KW != "" {
- query = query.Must(elastic.NewMultiMatchQuery(p.Bsp.KW, p.Bsp.KwFields...).Type("best_fields").TieBreaker(0.3))
- }
- if len(p.Ids) > 0 {
- interfaceSlice := make([]interface{}, len(p.Ids))
- for i, d := range p.Ids {
- interfaceSlice[i] = d
- }
- query = query.Filter(elastic.NewTermsQuery("id", interfaceSlice...))
- }
- if len(p.Mids) > 0 {
- interfaceSlice := make([]interface{}, len(p.Mids))
- for i, d := range p.Mids {
- interfaceSlice[i] = d
- }
- query = query.Filter(elastic.NewTermsQuery("mid", interfaceSlice...))
- }
- if len(p.PTypeIds) > 0 {
- interfaceSlice := make([]interface{}, len(p.PTypeIds))
- for i, d := range p.PTypeIds {
- interfaceSlice[i] = d
- }
- query = query.Filter(elastic.NewTermsQuery("ptypeid", interfaceSlice...))
- }
- if len(p.TypeIds) > 0 {
- interfaceSlice := make([]interface{}, len(p.TypeIds))
- for i, d := range p.TypeIds {
- interfaceSlice[i] = d
- }
- query = query.Filter(elastic.NewTermsQuery("typeid", interfaceSlice...))
- }
- if len(p.States) > 0 {
- interfaceSlice := make([]interface{}, len(p.States))
- for i, d := range p.States {
- interfaceSlice[i] = d
- }
- query = query.Filter(elastic.NewTermsQuery("state", interfaceSlice...))
- }
- if len(p.Copyrights) > 0 {
- interfaceSlice := make([]interface{}, len(p.Copyrights))
- for i, d := range p.Copyrights {
- interfaceSlice[i] = d
- }
- query = query.Filter(elastic.NewTermsQuery("copyright", interfaceSlice...))
- }
- if len(p.OrderIds) > 0 {
- interfaceSlice := make([]interface{}, len(p.OrderIds))
- for i, d := range p.OrderIds {
- interfaceSlice[i] = d
- }
- query = query.Filter(elastic.NewTermsQuery("order_id", interfaceSlice...))
- }
- if p.IsOrder == 1 {
- query = query.Filter(elastic.NewRangeQuery("order_id").Gt(0))
- }
- if p.IsOrder == 0 {
- query = query.MustNot(elastic.NewRangeQuery("order_id").Gt(0))
- }
- if p.IsOriginal == 1 {
- query = query.Filter(elastic.NewTermsQuery("copyright", 1))
- }
- if p.IsOriginal == 0 {
- query = query.MustNot(elastic.NewTermsQuery("copyright", 1))
- }
- if p.Action == "get_ptypeids" {
- if res, err = d.ArchiveCommercePTypeIds(c, query); err != nil {
- PromError(fmt.Sprintf("es:%s ", p.Bsp.AppID), "%v", err)
- }
- return
- }
- if res, err = d.searchResult(c, "ssd_archive", "archive_commerce_v", query, p.Bsp); err != nil {
- PromError(fmt.Sprintf("es:%s ", p.Bsp.AppID), "%v", err)
- }
- return
- }
- // ArchiveCommercePTypeIds .
- func (d *Dao) ArchiveCommercePTypeIds(c context.Context, query *elastic.BoolQuery) (res *model.SearchResult, err error) {
- res = &model.SearchResult{
- Result: []json.RawMessage{},
- Page: &model.Page{},
- }
- aggs := elastic.NewTermsAggregation()
- aggs = aggs.Field("ptypeid").Size(1000)
- if _, ok := d.esPool["ssd_archive"]; !ok {
- PromError(fmt.Sprintf("es:集群不存在%s", "ssd_archive"), "s.dao.searchResult indexName:%s", "ssd_archive")
- res = &model.SearchResult{Debug: fmt.Sprintf("es:集群不存在%s, %s", "ssd_archive", res.Debug)}
- return
- }
- searchResult, err := d.esPool["ssd_archive"].Search().Index("archive_commerce_v").Query(query).Aggregation("group_by_ptypeid", aggs).Size(0).Do(context.Background())
- if err != nil {
- PromError(fmt.Sprintf("es:执行查询失败%s ", "ArchiveCommercePTypeIds"), "dao.log.ArchiveCommercePTypeIds(%v)", err)
- return
- }
- result, ok := searchResult.Aggregations.Terms("group_by_ptypeid")
- if !ok {
- PromError(fmt.Sprintf("es:Unmarshal%s ", "log"), "es:Unmarshal%v", err)
- return
- }
- for _, v := range result.Buckets {
- res.Result = append(res.Result, []byte(v.Key.(string)))
- }
- res.Page.Pn = 1
- res.Page.Ps = 1000
- res.Page.Total = int64(len(res.Result))
- return
- }
|