소스 검색

feat:搜索开发1

wangshan 2 년 전
부모
커밋
2013ecdfad

+ 4 - 1
jyBXCore/rpc/bxcore.proto

@@ -32,6 +32,9 @@ message SearchReq {
   string exclusionWords = 26;//关键词:排除词(副:五组,每组最多15个字符)
   string  userType = 27;//用户状态 fType:免费用户;pType:付费用户;vType:超级订阅用户;mType:大会员用户;eType:商机管理用户
   string  platform = 28;//请求平台
+  bool  isFree = 29;//是否是免费用户
+  string interceptKeyWords = 30;//关键词截取后的关键词;
+  string interceptOtherWords = 31;//关键词截取后 后面三个字
 }
 
 message SearchResp {
@@ -48,7 +51,7 @@ message SearchData {
   string numberMsg = 6;//查询总结果数量
   string remark = 7;//备注
   int64 interceptLimit = 8;//关键词截取长度
-  string interceptKeyWords= 9;//关键词截取结果
+  string interceptOtherWords= 9;//关键词截取剩余关键词
 }
 
 message  SearchList {

+ 57 - 11
jyBXCore/rpc/entity/search.go

@@ -1,6 +1,7 @@
 package entity
 
 import (
+	MC "app.yhyue.com/moapp/jybase/common"
 	"app.yhyue.com/moapp/jybase/redis"
 	"encoding/json"
 	"fmt"
@@ -9,11 +10,12 @@ import (
 	IC "jyBXCore/rpc/init"
 	"jyBXCore/rpc/service"
 	"jyBXCore/rpc/util"
+	"log"
 	"strings"
 )
 
 var (
-	SearchCacheKey   = "searchDataCache_%s_%d"
+	SearchCacheKey   = "searchDataCache_%s"
 	SearchCacheCount = "searchCountCache_%s"
 )
 
@@ -35,9 +37,9 @@ func (kws *KeyWordsSearch) IsEmptySearch(in *bxcore.SearchReq) bool {
 // GetBidListByCache  查询缓存数据
 func (kws *KeyWordsSearch) GetBidListByCache(in *bxcore.SearchReq) (list []*bxcore.SearchList, count int64) {
 	//缓存数据 最大量是500条  十页数据
-	list, count = func(in *bxcore.SearchReq) (list []*bxcore.SearchList, count int64) {
+	l, c := func(in *bxcore.SearchReq) (list []*bxcore.SearchList, count int64) {
 		//缓存数据: kws.Platform-平台;kws.PageNum-当前页
-		redisDataKey := fmt.Sprintf(SearchCacheKey, in.Platform, in.PageNum)
+		redisDataKey := fmt.Sprintf(SearchCacheKey, in.Platform)
 		//缓存数据总量 - 当前平台
 		redisCountKey := fmt.Sprintf(SearchCacheCount, in.Platform)
 		sCache, err := redis.GetNewBytes(util.RedisName, redisDataKey)
@@ -52,12 +54,10 @@ func (kws *KeyWordsSearch) GetBidListByCache(in *bxcore.SearchReq) (list []*bxco
 		}
 		//无缓存数据 或 缓存数据查询异常
 		//查库>存redis缓存
-		//缓存时间
-		pcstime := IC.C.PCSTime * 60 * 60
 		//缓存数据 默认查询分组 searchGroup = 1 ,
 		//不查超前信息--招标信息类型为拟建和采购意向的信息
 		in.SearchGroup = 1
-		in.TopType = IC.C.DefaultTopTypes[in.SearchGroup]
+		in.Subtype = IC.C.DefaultTopTypes[in.SearchGroup]
 		//缓存数据
 		count, list = service.SearchCacheData(in)
 		limitCount := int64(util.SearchPageSize * util.SearchMaxPageNum)
@@ -65,10 +65,10 @@ func (kws *KeyWordsSearch) GetBidListByCache(in *bxcore.SearchReq) (list []*bxco
 			count = limitCount
 		}
 		if len(list) > 0 {
-			redis.Put(util.RedisName, redisCountKey, count, pcstime)
+			redis.Put(util.RedisName, redisCountKey, count, MC.If(IC.C.DefaultSearchCacheTime > 0, IC.C.DefaultSearchCacheTime*60*60, 24*60*60).(int))
 			b, err := json.Marshal(list)
 			if err == nil {
-				redis.PutBytes(util.RedisName, redisDataKey, &b, pcstime)
+				redis.PutBytes(util.RedisName, redisDataKey, &b, MC.If(IC.C.DefaultSearchCacheTime > 0, IC.C.DefaultSearchCacheTime*60*60, 24*60*60).(int))
 			} else {
 				logx.Info("默认搜索查询结果保存redis缓存异常")
 			}
@@ -77,12 +77,17 @@ func (kws *KeyWordsSearch) GetBidListByCache(in *bxcore.SearchReq) (list []*bxco
 		}
 		return
 	}(in)
-	//是否收藏
-	util.MakeCollection(in.UserId, list)
+	if len(l) > 0 {
+		list = l[in.PageNum : (in.PageNum+1)*in.PageSize]
+		count = c
+		log.Println("list:", len(list))
+		//是否收藏
+		util.MakeCollection(in.UserId, list)
+	}
 	return
 }
 
-//保存历史记录
+// SaveKeyWordsToHistory 保存历史记录
 func (kws *KeyWordsSearch) SaveKeyWordsToHistory(in *bxcore.SearchReq) {
 	if in.KeyWords != "" {
 		//历史记录
@@ -95,3 +100,44 @@ func (kws *KeyWordsSearch) SaveKeyWordsToHistory(in *bxcore.SearchReq) {
 		}
 	}
 }
+
+//搜索条件 处理
+func (kws *KeyWordsSearch) SearchParamsHandle(in *bxcore.SearchReq) {
+	//默认每页数据量
+	if in.PageSize == 0 {
+		in.PageSize = 50
+	}
+	//行业格式化
+	if in.Industry != "" {
+		in.Industry = strings.TrimSpace(in.Industry)
+	}
+	//默认搜索范围
+	if in.SelectType == "" {
+		in.SelectType = "title,content"
+	}
+	//免费用户:高级筛选 采购单位类型、采购单位联系方式、中标企业联系方式、排除词、城市
+	if in.UserType == "fType" {
+		in.BuyerClass = ""
+		in.BuyerTel = ""
+		in.WinnerTel = ""
+		in.ExclusionWords = ""
+		in.City = ""
+	}
+	//判断是否有关键词
+	if in.KeyWords != "" {
+		//关键词处理
+		in.KeyWords = strings.TrimSpace(in.KeyWords)
+		//以后可能会出现 关键词 C++ 等带+的关键词
+		in.InterceptKeyWords, in.InterceptOtherWords, in.KeyWords = util.InterceptSearchKW(in.KeyWords, MC.IntAllDef(IC.C.KeywordsLimit, 35), len(in.Industry) == 0)
+		//更新关键词搜索历史记录
+		go kws.SaveKeyWordsToHistory(in)
+	}
+	//判断用户身份
+	userInfo := util.GetVipState(IC.MainMysql, IC.Mgo, in.UserId)
+	//是否是免费用户
+	in.IsFree = !userInfo.IsPayedUser()
+	//搜索范围
+	queryItems := userInfo.GetQueryItems(in.SelectType, IC.C.BidSearchOldUserLimit)
+	in.SelectType = strings.Join(queryItems, ",")
+
+}

+ 2 - 2
jyBXCore/rpc/etc/bxcore.yaml

@@ -11,7 +11,7 @@ LabelUrl:
   Area: /list/area/%s.html
   Stype: /list/stype/%s.html
   Industry: /list/industry/%s.html
-PCSTime: 24
+DefaultSearchCacheTime: 24
 LimitSearchText:
   Flag: true
   Count: 40
@@ -35,7 +35,7 @@ KeywordsLimit: 35 #主搜索框 关键词长度限制
 DefaultBidInfo: #默认搜索
   NumMsg: 超过1.8亿 #数据量提示
   PageNum: 10 #总页数
-  Count: 600 #查询数据量
+  Count: 1000 #查询数据量
 DefaultTopTypes:
   - 拟建,采购意向,招标预告,招标公告,招标结果,招标信用信息
   - 招标预告,招标公告,招标结果,招标信用信息

+ 2 - 2
jyBXCore/rpc/internal/config/config.go

@@ -14,8 +14,8 @@ type Config struct {
 		Stype    string
 		Industry string
 	}
-	PCSTime         int //清除搜索列表内存缓存 间隔时间
-	LimitSearchText struct {
+	DefaultSearchCacheTime int //清除搜索列表内存缓存 间隔时间
+	LimitSearchText        struct {
 		Flag       bool
 		Count      int
 		TimeOut    int

+ 51 - 121
jyBXCore/rpc/internal/logic/getsearchlistlogic.go

@@ -5,6 +5,8 @@ import (
 	"context"
 	"jyBXCore/rpc/entity"
 	IC "jyBXCore/rpc/init"
+	"jyBXCore/rpc/util"
+	"strings"
 	"time"
 
 	"jyBXCore/rpc/internal/svc"
@@ -45,6 +47,8 @@ func (l *GetSearchListLogic) GetSearchList(in *bxcore.SearchReq) (*bxcore.Search
 	}
 	//初始化搜索对象
 	ks := entity.NewKeyWordsSearch()
+	//处理搜索条件
+	ks.SearchParamsHandle(in)
 	//判断是否是空搜索,如果是空搜索,查缓存数据
 	if ks.IsEmptySearch(in) {
 		res.List, res.Count = ks.GetBidListByCache(in)
@@ -54,128 +58,54 @@ func (l *GetSearchListLogic) GetSearchList(in *bxcore.SearchReq) (*bxcore.Search
 			ErrCode: 0,
 		}, nil
 	}
-	//更新关键词搜索历史记录
-	go ks.SaveKeyWordsToHistory(in)
-	////判断搜索是否有查询条件
-	////判断用户身份
+	//异常付费用户
+	if in.UserType != "fType" && !in.IsFree {
+		return &bxcore.SearchResp{
+			ErrCode: -1,
+			ErrMsg:  "无权限",
+		}, nil
+	}
+	//招标信息有效查询
 	t := time.Now()
-	////
-	//if in.SelectType == "" {
-	//	in.SelectType = "title,content"
-	//}
-	//in.Industry = strings.TrimSpace(in.Industry)
-	//userInfo := util.GetVipState(IC.MainMysql, IC.Mgo, in.UserId)
-	////付费用户
-	//if in.UserType != "fType" && !userInfo.IsPayedUser() {
-	//	return &bxcore.SearchResp{
-	//		ErrCode: -1,
-	//		ErrMsg:  "无权限",
-	//	}, nil
-	//}
-	//if in.UserType == "fType" {
-	//	in.BuyerClass = ""
-	//	in.BuyerTel = ""
-	//	in.WinnerTel = ""
-	//	in.ExclusionWords = ""
-	//	in.City = ""
-	//}
-	//in.KeyWords = strings.TrimSpace(in.KeyWords)
-	////搜索范围
-	//queryItems := userInfo.GetQueryItems(in.SelectType, IC.C.BidSearchOldUserLimit)
-	//in.SelectType = strings.Join(queryItems, ",")
-	////b_word, s_word := "", ""
-	//res.IsLimit = 1
-	////以后可能会出现 关键词 C++ 等带+的关键词
-	//if in.KeyWords != "" {
-	//	res.InterceptKeywords, res.InterceptWord, in.KeyWords = util.InterceptSearchKW(in.KeyWords, MC.IntAllDef(IC.C.KeywordsLimit, 35), len(in.Industry) == 0)
-	//}
-	////查询数据
-	//if in.KeyWords != "" || in.Industry != "" {
-	//	//查询数据
-	//	searchLimit := util.IsSearchLimit(strings.Split(in.SelectType, ","))
-	//	//全文检索限制
-	//	if searchLimit {
-	//		res.IsLimit = util.IsLimited(in.UserId, in.UserType != "fType")
-	//		if res.IsLimit == 1 { //没有被限制
-	//			defer util.Limit()
-	//		}
-	//	}
-	//	//无限制
-	//	if res.IsLimit == 1 {
-	//		var count int64
-	//		var list = []*bxcore.SearchList{}
-	//		//付费用户搜索优化
-	//		publishTime := in.PublishTime
-	//		t1 := time.Now()
-	//		if b := util.IsOptimize(IC.C, in); b {
-	//			count, list = util.GetBidSearchData(in)
-	//			count += 1 //避免刚好50条 无法加载下一页数据
-	//		}
-	//		logx.Info("1查询耗时", time.Since(t1))
-	//		t2 := time.Now()
-	//		//分词后 第二页数据请求 先获取全部数据 再切割
-	//		if in.SplitKeywords != "" && strings.Contains(in.SplitKeywords, "+&&&") && in.PageNum == 2 {
-	//			in.KeyWords = strings.ReplaceAll(in.KeyWords, "+&&&", "")
-	//			in.PageNum = 1
-	//		}
-	//		//不够配置条 走原始查询
-	//		if count < IC.C.PaySearchLimit.PageSize {
-	//			in.PublishTime = publishTime
-	//			count, list = util.GetBidSearchData(in)
-	//		}
-	//		logx.Info("2查询耗时:", time.Since(t2))
-	//		res.KeyWords = in.KeyWords
-	//		//二次搜索- 一次搜索结果少于一页数据;关键词长度大于三;第一,二页请求;搜索范围包括title;四个条件
-	//		if len([]rune(in.KeyWords)) > 3 && int(count) < util.SearchPageSize && in.PageNum < 3 && strings.Contains(in.SelectType, "title") {
-	//			if iksk := util.HttpEs(in.KeyWords, "ik_smart", IC.DB.Es.Addr); iksk != "" {
-	//				t3 := time.Now()
-	//				iksk_temp := in.KeyWords
-	//				in.KeyWords = iksk
-	//				in.SelectType = "title"
-	//				//最多查两页数据
-	//				in.PageSize = 2 * in.PageSize
-	//				_, secondList := util.GetBidSearchData(in)
-	//				//数据合并 去重 排序
-	//				list = util.DelRepeatSearchData(list, secondList)
-	//				count = int64(len(list))
-	//				switch {
-	//				case count > util.SearchPageSize:
-	//					count = MC.If(count > int64(util.SearchPageSize*2), int64(util.SearchPageSize*2), count).(int64)
-	//					list = list[:util.SearchPageSize]
-	//					if in.SplitKeywords != "" {
-	//						list = list[util.SearchPageSize:count]
-	//					}
-	//				case count <= util.SearchPageSize:
-	//					list = list[:count]
-	//				}
-	//				var kbool = map[string]bool{}
-	//				var karr = []string{}
-	//				for _, v := range strings.Split(fmt.Sprintf("%s+%s", iksk_temp, iksk), "+") {
-	//					if kbool[v] {
-	//						continue
-	//					}
-	//					karr = append(karr, v)
-	//					kbool[v] = true
-	//				}
-	//				//+&&& 作为二次搜索第二页数据请求的标识(临时处理)
-	//				res.KeyWords = strings.Join(karr, "+") + "+&&&"
-	//				logx.Info("3查询耗时:", time.Since(t3))
-	//			}
-	//		}
-	//		limitCount := MC.If(in.UserType != "fType", int64(util.SearchPageSize*util.SearchMaxPageNum_PAYED), int64(util.SearchPageSize*util.SearchMaxPageNum)).(int64)
-	//		if count > limitCount {
-	//			count = limitCount
-	//		}
-	//		//是否收藏
-	//		//util.MakeCollection(in.UserId, list)
-	//		res.TotalPage = MC.If(in.PageNum == 1, (count+int64(util.SearchPageSize)-1)/int64(util.SearchPageSize), res.TotalPage).(int64)
-	//		res.Count = count
-	//		res.List = list
-	//	}
-	//	logx.Info("关键词 -0- 查询耗时:", time.Since(t).Seconds())
-	//} else if in.Platform == "PC" {
-	//
-	//}
+	res.IsLimit = 1
+	//查询数据
+	searchLimit := util.IsSearchLimit(strings.Split(in.SelectType, ","))
+	//全文检索限制
+	if searchLimit {
+		res.IsLimit = util.IsLimited(in.UserId, in.UserType != "fType")
+		if res.IsLimit == 1 { //没有被限制
+			defer util.Limit()
+		}
+	}
+	//无限制
+	if res.IsLimit == 1 {
+		//付费用户搜索优化
+		publishTime := in.PublishTime
+		t1 := time.Now()
+		if b := util.IsOptimize(IC.C, in); b {
+			res.Count, res.List = util.GetBidSearchData(in)
+			res.Count += 1 //避免刚好50条 无法加载下一页数据
+		}
+		logx.Info("1查询耗时", time.Since(t1))
+		t2 := time.Now()
+		//不够配置条 走原始查询
+		if res.Count < IC.C.PaySearchLimit.PageSize {
+			in.PublishTime = publishTime
+			res.Count, res.List = util.GetBidSearchData(in)
+		}
+		logx.Info("2查询耗时:", time.Since(t2))
+		limitCount := MC.If(in.UserType != "fType", int64(util.SearchPageSize*util.SearchMaxPageNum_PAYED), int64(util.SearchPageSize*util.SearchMaxPageNum)).(int64)
+		if res.Count > limitCount {
+			res.Count = limitCount
+		}
+		res.KeyWords = in.KeyWords
+		res.InterceptOtherWords = in.InterceptOtherWords
+		//是否收藏
+		//util.MakeCollection(in.UserId, list)
+		//res.TotalPage = MC.If(in.PageNum == 1, (count+int64(util.SearchPageSize)-1)/int64(util.SearchPageSize), res.TotalPage).(int64)
+		//res.Count = count
+		//res.List = list
+	}
 	logx.Info("关键词 -全部- 查询耗时:", time.Since(t).Seconds())
 	return &bxcore.SearchResp{
 		Data:    res,

+ 3 - 10
jyBXCore/rpc/model/es/search.go

@@ -12,16 +12,9 @@ import (
 )
 
 // GetSearchCacheData  查询es bidding 获取数据
-func GetSearchCacheData(industrys, query string) (count int64, list []*bxcore.SearchList) {
-	repl, repc := elastic.GetAllByNgramNew(INDEX, TYPE, query, DefaultFields, bidSearch_sort, bidSearch_field, 0, IC.C.DefaultBidInfo.Count, 0, false)
-	if repl != nil && *repl != nil && len(*repl) > 0 {
-		//util.BidListConvert(industrys, repl)
-		//list = util.SearchListFormart(repl, false)
-	}
-	if repc > 0 {
-		count = repc
-	}
-	return
+func GetSearchCacheData(query string) (*[]map[string]interface{}, int64) {
+	return elastic.GetAllByNgramNew(INDEX, TYPE, query, DefaultFields, bidSearch_sort, bidSearch_field, 0, IC.C.DefaultBidInfo.Count, 0, false)
+
 }
 
 //

+ 4 - 0
jyBXCore/rpc/model/es/searchQuery.go

@@ -19,6 +19,10 @@ const (
 	bidSearch_field_1 = `"_id","title","publishtime","dataweight","toptype","subtype","type","area","city","s_subscopeclass","bidamount","budget","buyerclass","spidercode","site"` //,"filetext"
 	bidSearch_field   = bidSearch_field_1 + `,"bidopentime","winner","buyer","projectname","projectcode","projectinfo"`
 
+	bidSearchFieldBase  = `"_id","title","publishtime","dataweight","toptype","subtype","type","area","city","s_subscopeclass","bidamount","budget","buyerclass","spidercode","site"` //搜索列表基础字段
+	bidSearchFieldOfVip = `"buyer","agency","s_winner","buyertel","winnertel","agencytel","signendtime","bidendtime","bidopentime","budget","bidamount","projectinfo"`                //付费列表字段
+	bidSearchFieldFile  = `,"isValidFile"`                                                                                                                                            //根据配置开关 选择是否显示 是否有附件提示,IC.C.FileSignBool
+
 	DefaultFields = `"title"` //最新招标信息
 )
 

+ 48 - 1
jyBXCore/rpc/service/search.go

@@ -1,11 +1,58 @@
 package service
 
 import (
+	"github.com/zeromicro/go-zero/core/logx"
 	"jyBXCore/rpc/bxcore"
 	"jyBXCore/rpc/model/es"
+	"jyBXCore/rpc/util"
 )
 
 // SearchCacheData  默认查询缓存数据
+// 默认搜索1000条数据,从搜索结果随机获取500条数据。
 func SearchCacheData(in *bxcore.SearchReq) (count int64, list []*bxcore.SearchList) {
-	return es.GetSearchCacheData(in.Industry, es.GetSearchQuery(in, es.GetBidSearchQuery(in)))
+	resList, _ := es.GetSearchCacheData(es.GetSearchQuery(in, es.GetBidSearchQuery(in)))
+	if resList != nil && len(*resList) > 0 {
+		*resList = append((*resList)[1:444], (*resList)[666:888]...)
+		//数据>500 ,从len(*resList)中随机抽取500
+		pageSize := int(in.PageSize)
+		if len(*resList) > pageSize*10 {
+			var (
+				ll        = len(*resList) / pageSize //数据分50等份
+				formatArr = make([][]map[string]interface{}, ll)
+			)
+			//插入二维数组
+			for i := 0; i < ll; i++ {
+				start := i * pageSize
+				end := (i + 1) * pageSize
+				if i == ll-1 {
+					end = len(*resList)
+				}
+				formatArr[i] = make([]map[string]interface{}, len((*resList)[start:end]))
+				formatArr[i] = (*resList)[start:end]
+			}
+			//判断二维码数组是否有值
+			if len(formatArr) > 0 {
+				//最后一个数组是否满整页数据(50)
+				if len(formatArr[ll-1]) != pageSize {
+					//不满50 抛弃
+					ll = ll - 1
+				}
+			}
+			//当前数据量 正常肯定能查到1000条
+			if ll > 10 {
+				*resList = []map[string]interface{}{}
+				for j := 0; j < ll; j++ {
+					if j%2 == 0 {
+						*resList = append(*resList, formatArr[j]...)
+					}
+				}
+			}
+		}
+		util.BidListConvert(in.Industry, resList)
+		list = util.SearchListFormart(resList, false)
+		count = int64(len(list))
+	} else {
+		logx.Info("查询缓存异常")
+	}
+	return
 }

+ 204 - 172
jyBXCore/rpc/type/bxcore/bxcore.pb.go

@@ -25,34 +25,37 @@ type SearchReq struct {
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 
-	AppId           string `protobuf:"bytes,1,opt,name=appId,proto3" json:"appId,omitempty"`                      //剑鱼默认10000
-	UserId          string `protobuf:"bytes,2,opt,name=userId,proto3" json:"userId,omitempty"`                    //用户id
-	Phone           string `protobuf:"bytes,3,opt,name=phone,proto3" json:"phone,omitempty"`                      //手机号
-	NewUserId       string `protobuf:"bytes,4,opt,name=newUserId,proto3" json:"newUserId,omitempty"`              //base_user_id 新用户id
-	EntId           int64  `protobuf:"varint,5,opt,name=entId,proto3" json:"entId,omitempty"`                     //企业id 没有企业 企业id=0
-	EntUserId       int64  `protobuf:"varint,6,opt,name=entUserId,proto3" json:"entUserId,omitempty"`             //企业用户id  当前企业下的员工id 没有企业默认0
-	PageNum         int64  `protobuf:"varint,7,opt,name=pageNum,proto3" json:"pageNum,omitempty"`                 //当前页码
-	PageSize        int64  `protobuf:"varint,8,opt,name=pageSize,proto3" json:"pageSize,omitempty"`               //每页数量
-	Province        string `protobuf:"bytes,9,opt,name=province,proto3" json:"province,omitempty"`                //省份
-	City            string `protobuf:"bytes,10,opt,name=city,proto3" json:"city,omitempty"`                       //城市
-	Subtype         string `protobuf:"bytes,11,opt,name=subtype,proto3" json:"subtype,omitempty"`                 //信息类型-二级
-	TopType         string `protobuf:"bytes,12,opt,name=topType,proto3" json:"topType,omitempty"`                 //信息类型-一级分类
-	PublishTime     string `protobuf:"bytes,13,opt,name=publishTime,proto3" json:"publishTime,omitempty"`         //发布时间
-	SelectType      string `protobuf:"bytes,14,opt,name=selectType,proto3" json:"selectType,omitempty"`           //搜索范围:标题;正文等
-	Price           string `protobuf:"bytes,15,opt,name=price,proto3" json:"price,omitempty"`                     //价格
-	Industry        string `protobuf:"bytes,16,opt,name=industry,proto3" json:"industry,omitempty"`               //行业
-	BuyerClass      string `protobuf:"bytes,17,opt,name=buyerClass,proto3" json:"buyerClass,omitempty"`           //采购单位类型
-	BuyerTel        string `protobuf:"bytes,18,opt,name=buyerTel,proto3" json:"buyerTel,omitempty"`               //采购单位联系方式
-	WinnerTel       string `protobuf:"bytes,19,opt,name=winnerTel,proto3" json:"winnerTel,omitempty"`             //中标单位联系方式
-	FileExists      string `protobuf:"bytes,20,opt,name=fileExists,proto3" json:"fileExists,omitempty"`           //是否有附件
-	SearchGroup     int64  `protobuf:"varint,21,opt,name=searchGroup,proto3" json:"searchGroup,omitempty"`        //搜索分组:默认0:全部;1:招标采购公告;2:超前项目
-	SearchMode      int64  `protobuf:"varint,22,opt,name=searchMode,proto3" json:"searchMode,omitempty"`          //搜索模式:0:精准搜索;1:模糊搜索
-	WordsMode       int64  `protobuf:"varint,23,opt,name=wordsMode,proto3" json:"wordsMode,omitempty"`            //搜索关键词模式;默认0:包含所有,1:包含任意
-	KeyWords        string `protobuf:"bytes,24,opt,name=keyWords,proto3" json:"keyWords,omitempty"`               //关键词:多个空格隔开(主)
-	AdditionalWords string `protobuf:"bytes,25,opt,name=additionalWords,proto3" json:"additionalWords,omitempty"` //关键词:附加关键词(副:五组,每组最多15个字符)
-	ExclusionWords  string `protobuf:"bytes,26,opt,name=exclusionWords,proto3" json:"exclusionWords,omitempty"`   //关键词:排除词(副:五组,每组最多15个字符)
-	UserType        string `protobuf:"bytes,27,opt,name=userType,proto3" json:"userType,omitempty"`               //用户状态 fType:免费用户;pType:付费用户;vType:超级订阅用户;mType:大会员用户;eType:商机管理用户
-	Platform        string `protobuf:"bytes,28,opt,name=platform,proto3" json:"platform,omitempty"`               //请求平台
+	AppId               string `protobuf:"bytes,1,opt,name=appId,proto3" json:"appId,omitempty"`                              //剑鱼默认10000
+	UserId              string `protobuf:"bytes,2,opt,name=userId,proto3" json:"userId,omitempty"`                            //用户id
+	Phone               string `protobuf:"bytes,3,opt,name=phone,proto3" json:"phone,omitempty"`                              //手机号
+	NewUserId           string `protobuf:"bytes,4,opt,name=newUserId,proto3" json:"newUserId,omitempty"`                      //base_user_id 新用户id
+	EntId               int64  `protobuf:"varint,5,opt,name=entId,proto3" json:"entId,omitempty"`                             //企业id 没有企业 企业id=0
+	EntUserId           int64  `protobuf:"varint,6,opt,name=entUserId,proto3" json:"entUserId,omitempty"`                     //企业用户id  当前企业下的员工id 没有企业默认0
+	PageNum             int64  `protobuf:"varint,7,opt,name=pageNum,proto3" json:"pageNum,omitempty"`                         //当前页码
+	PageSize            int64  `protobuf:"varint,8,opt,name=pageSize,proto3" json:"pageSize,omitempty"`                       //每页数量
+	Province            string `protobuf:"bytes,9,opt,name=province,proto3" json:"province,omitempty"`                        //省份
+	City                string `protobuf:"bytes,10,opt,name=city,proto3" json:"city,omitempty"`                               //城市
+	Subtype             string `protobuf:"bytes,11,opt,name=subtype,proto3" json:"subtype,omitempty"`                         //信息类型-二级
+	TopType             string `protobuf:"bytes,12,opt,name=topType,proto3" json:"topType,omitempty"`                         //信息类型-一级分类
+	PublishTime         string `protobuf:"bytes,13,opt,name=publishTime,proto3" json:"publishTime,omitempty"`                 //发布时间
+	SelectType          string `protobuf:"bytes,14,opt,name=selectType,proto3" json:"selectType,omitempty"`                   //搜索范围:标题;正文等
+	Price               string `protobuf:"bytes,15,opt,name=price,proto3" json:"price,omitempty"`                             //价格
+	Industry            string `protobuf:"bytes,16,opt,name=industry,proto3" json:"industry,omitempty"`                       //行业
+	BuyerClass          string `protobuf:"bytes,17,opt,name=buyerClass,proto3" json:"buyerClass,omitempty"`                   //采购单位类型
+	BuyerTel            string `protobuf:"bytes,18,opt,name=buyerTel,proto3" json:"buyerTel,omitempty"`                       //采购单位联系方式
+	WinnerTel           string `protobuf:"bytes,19,opt,name=winnerTel,proto3" json:"winnerTel,omitempty"`                     //中标单位联系方式
+	FileExists          string `protobuf:"bytes,20,opt,name=fileExists,proto3" json:"fileExists,omitempty"`                   //是否有附件
+	SearchGroup         int64  `protobuf:"varint,21,opt,name=searchGroup,proto3" json:"searchGroup,omitempty"`                //搜索分组:默认0:全部;1:招标采购公告;2:超前项目
+	SearchMode          int64  `protobuf:"varint,22,opt,name=searchMode,proto3" json:"searchMode,omitempty"`                  //搜索模式:0:精准搜索;1:模糊搜索
+	WordsMode           int64  `protobuf:"varint,23,opt,name=wordsMode,proto3" json:"wordsMode,omitempty"`                    //搜索关键词模式;默认0:包含所有,1:包含任意
+	KeyWords            string `protobuf:"bytes,24,opt,name=keyWords,proto3" json:"keyWords,omitempty"`                       //关键词:多个空格隔开(主)
+	AdditionalWords     string `protobuf:"bytes,25,opt,name=additionalWords,proto3" json:"additionalWords,omitempty"`         //关键词:附加关键词(副:五组,每组最多15个字符)
+	ExclusionWords      string `protobuf:"bytes,26,opt,name=exclusionWords,proto3" json:"exclusionWords,omitempty"`           //关键词:排除词(副:五组,每组最多15个字符)
+	UserType            string `protobuf:"bytes,27,opt,name=userType,proto3" json:"userType,omitempty"`                       //用户状态 fType:免费用户;pType:付费用户;vType:超级订阅用户;mType:大会员用户;eType:商机管理用户
+	Platform            string `protobuf:"bytes,28,opt,name=platform,proto3" json:"platform,omitempty"`                       //请求平台
+	IsFree              bool   `protobuf:"varint,29,opt,name=isFree,proto3" json:"isFree,omitempty"`                          //是否是免费用户
+	InterceptKeyWords   string `protobuf:"bytes,30,opt,name=interceptKeyWords,proto3" json:"interceptKeyWords,omitempty"`     //关键词截取后的关键词;
+	InterceptOtherWords string `protobuf:"bytes,31,opt,name=interceptOtherWords,proto3" json:"interceptOtherWords,omitempty"` //关键词截取后 后面三个字
 }
 
 func (x *SearchReq) Reset() {
@@ -283,6 +286,27 @@ func (x *SearchReq) GetPlatform() string {
 	return ""
 }
 
+func (x *SearchReq) GetIsFree() bool {
+	if x != nil {
+		return x.IsFree
+	}
+	return false
+}
+
+func (x *SearchReq) GetInterceptKeyWords() string {
+	if x != nil {
+		return x.InterceptKeyWords
+	}
+	return ""
+}
+
+func (x *SearchReq) GetInterceptOtherWords() string {
+	if x != nil {
+		return x.InterceptOtherWords
+	}
+	return ""
+}
+
 type SearchResp struct {
 	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
@@ -351,15 +375,15 @@ type SearchData struct {
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 
-	Count             int64         `protobuf:"varint,1,opt,name=count,proto3" json:"count,omitempty"`                        //返回数据量
-	KeyWords          string        `protobuf:"bytes,2,opt,name=keyWords,proto3" json:"keyWords,omitempty"`                   //关键词
-	IsLimit           int64         `protobuf:"varint,3,opt,name=isLimit,proto3" json:"isLimit,omitempty"`                    //全文检索限制//限制正文、附件查询 //return 1 正常 //return -1 抱歉!由于系统繁忙暂时无法进行搜索,请1分钟后再试! //return -2 抱歉!由于系统繁忙暂时无法进行搜索,请稍后再试!
-	HistoryKeys       []string      `protobuf:"bytes,4,rep,name=historyKeys,proto3" json:"historyKeys,omitempty"`             //历史搜索关键词
-	List              []*SearchList `protobuf:"bytes,5,rep,name=list,proto3" json:"list,omitempty"`                           //搜索列表
-	NumberMsg         string        `protobuf:"bytes,6,opt,name=numberMsg,proto3" json:"numberMsg,omitempty"`                 //查询总结果数量
-	Remark            string        `protobuf:"bytes,7,opt,name=remark,proto3" json:"remark,omitempty"`                       //备注
-	InterceptLimit    int64         `protobuf:"varint,8,opt,name=interceptLimit,proto3" json:"interceptLimit,omitempty"`      //关键词截取长度
-	InterceptKeyWords string        `protobuf:"bytes,9,opt,name=interceptKeyWords,proto3" json:"interceptKeyWords,omitempty"` //关键词截取结果
+	Count               int64         `protobuf:"varint,1,opt,name=count,proto3" json:"count,omitempty"`                            //返回数据量
+	KeyWords            string        `protobuf:"bytes,2,opt,name=keyWords,proto3" json:"keyWords,omitempty"`                       //关键词
+	IsLimit             int64         `protobuf:"varint,3,opt,name=isLimit,proto3" json:"isLimit,omitempty"`                        //全文检索限制//限制正文、附件查询 //return 1 正常 //return -1 抱歉!由于系统繁忙暂时无法进行搜索,请1分钟后再试! //return -2 抱歉!由于系统繁忙暂时无法进行搜索,请稍后再试!
+	HistoryKeys         []string      `protobuf:"bytes,4,rep,name=historyKeys,proto3" json:"historyKeys,omitempty"`                 //历史搜索关键词
+	List                []*SearchList `protobuf:"bytes,5,rep,name=list,proto3" json:"list,omitempty"`                               //搜索列表
+	NumberMsg           string        `protobuf:"bytes,6,opt,name=numberMsg,proto3" json:"numberMsg,omitempty"`                     //查询总结果数量
+	Remark              string        `protobuf:"bytes,7,opt,name=remark,proto3" json:"remark,omitempty"`                           //备注
+	InterceptLimit      int64         `protobuf:"varint,8,opt,name=interceptLimit,proto3" json:"interceptLimit,omitempty"`          //关键词截取长度
+	InterceptOtherWords string        `protobuf:"bytes,9,opt,name=interceptOtherWords,proto3" json:"interceptOtherWords,omitempty"` //关键词截取剩余关键词
 }
 
 func (x *SearchData) Reset() {
@@ -450,9 +474,9 @@ func (x *SearchData) GetInterceptLimit() int64 {
 	return 0
 }
 
-func (x *SearchData) GetInterceptKeyWords() string {
+func (x *SearchData) GetInterceptOtherWords() string {
 	if x != nil {
-		return x.InterceptKeyWords
+		return x.InterceptOtherWords
 	}
 	return ""
 }
@@ -1020,7 +1044,7 @@ var File_bxcore_proto protoreflect.FileDescriptor
 
 var file_bxcore_proto_rawDesc = []byte{
 	0x0a, 0x0c, 0x62, 0x78, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x06,
-	0x62, 0x78, 0x63, 0x6f, 0x72, 0x65, 0x22, 0xaf, 0x06, 0x0a, 0x09, 0x53, 0x65, 0x61, 0x72, 0x63,
+	0x62, 0x78, 0x63, 0x6f, 0x72, 0x65, 0x22, 0xa7, 0x07, 0x0a, 0x09, 0x53, 0x65, 0x61, 0x72, 0x63,
 	0x68, 0x52, 0x65, 0x71, 0x12, 0x14, 0x0a, 0x05, 0x61, 0x70, 0x70, 0x49, 0x64, 0x18, 0x01, 0x20,
 	0x01, 0x28, 0x09, 0x52, 0x05, 0x61, 0x70, 0x70, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x75, 0x73,
 	0x65, 0x72, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72,
@@ -1071,138 +1095,146 @@ var file_bxcore_proto_rawDesc = []byte{
 	0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x18, 0x1b, 0x20, 0x01,
 	0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08,
 	0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x18, 0x1c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08,
-	0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x22, 0x68, 0x0a, 0x0a, 0x53, 0x65, 0x61, 0x72,
-	0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x12, 0x19, 0x0a, 0x08, 0x65, 0x72, 0x72, 0x5f, 0x63, 0x6f,
-	0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x65, 0x72, 0x72, 0x43, 0x6f, 0x64,
-	0x65, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01,
-	0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x26, 0x0a, 0x04, 0x64, 0x61,
-	0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x62, 0x78, 0x63, 0x6f, 0x72,
-	0x65, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x44, 0x61, 0x74, 0x61, 0x52, 0x04, 0x64, 0x61,
-	0x74, 0x61, 0x22, 0xae, 0x02, 0x0a, 0x0a, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x44, 0x61, 0x74,
-	0x61, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03,
-	0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x57, 0x6f,
-	0x72, 0x64, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x57, 0x6f,
-	0x72, 0x64, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x69, 0x73, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x03,
-	0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x69, 0x73, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x20, 0x0a,
-	0x0b, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x4b, 0x65, 0x79, 0x73, 0x18, 0x04, 0x20, 0x03,
-	0x28, 0x09, 0x52, 0x0b, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x4b, 0x65, 0x79, 0x73, 0x12,
-	0x26, 0x0a, 0x04, 0x6c, 0x69, 0x73, 0x74, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e,
-	0x62, 0x78, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4c, 0x69, 0x73,
-	0x74, 0x52, 0x04, 0x6c, 0x69, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x75, 0x6d, 0x62, 0x65,
-	0x72, 0x4d, 0x73, 0x67, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x75, 0x6d, 0x62,
-	0x65, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x6d, 0x61, 0x72, 0x6b, 0x18,
-	0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x6d, 0x61, 0x72, 0x6b, 0x12, 0x26, 0x0a,
-	0x0e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x63, 0x65, 0x70, 0x74, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x18,
-	0x08, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x63, 0x65, 0x70, 0x74,
-	0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x2c, 0x0a, 0x11, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x63, 0x65,
-	0x70, 0x74, 0x4b, 0x65, 0x79, 0x57, 0x6f, 0x72, 0x64, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09,
-	0x52, 0x11, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x63, 0x65, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x57, 0x6f,
-	0x72, 0x64, 0x73, 0x22, 0xd3, 0x07, 0x0a, 0x0a, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4c, 0x69,
-	0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02,
-	0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x61, 0x72, 0x65, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,
-	0x52, 0x04, 0x61, 0x72, 0x65, 0x61, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x72, 0x65, 0x61, 0x55, 0x72,
-	0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x72, 0x65, 0x61, 0x55, 0x72, 0x6c,
-	0x12, 0x1e, 0x0a, 0x0a, 0x62, 0x75, 0x79, 0x65, 0x72, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x18, 0x04,
-	0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x62, 0x75, 0x79, 0x65, 0x72, 0x43, 0x6c, 0x61, 0x73, 0x73,
-	0x12, 0x12, 0x0a, 0x04, 0x63, 0x69, 0x74, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04,
-	0x63, 0x69, 0x74, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x18, 0x06,
-	0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x12, 0x1a, 0x0a, 0x08,
-	0x69, 0x6e, 0x64, 0x75, 0x73, 0x74, 0x72, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08,
-	0x69, 0x6e, 0x64, 0x75, 0x73, 0x74, 0x72, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x69, 0x6e, 0x64, 0x75,
-	0x73, 0x74, 0x72, 0x79, 0x55, 0x72, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x69,
-	0x6e, 0x64, 0x75, 0x73, 0x74, 0x72, 0x79, 0x55, 0x72, 0x6c, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x75,
-	0x62, 0x6c, 0x69, 0x73, 0x68, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x52,
-	0x0b, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0a,
-	0x66, 0x69, 0x6c, 0x65, 0x45, 0x78, 0x69, 0x73, 0x74, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08,
-	0x52, 0x0a, 0x66, 0x69, 0x6c, 0x65, 0x45, 0x78, 0x69, 0x73, 0x74, 0x73, 0x12, 0x18, 0x0a, 0x07,
-	0x73, 0x75, 0x62, 0x74, 0x79, 0x70, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73,
-	0x75, 0x62, 0x74, 0x79, 0x70, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x73, 0x75, 0x62, 0x74, 0x79, 0x70,
-	0x65, 0x55, 0x72, 0x6c, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x75, 0x62, 0x74,
-	0x79, 0x70, 0x65, 0x55, 0x72, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18,
-	0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x20, 0x0a, 0x0b,
-	0x69, 0x73, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x18, 0x0e, 0x20, 0x01, 0x28,
-	0x08, 0x52, 0x0b, 0x69, 0x73, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x12, 0x20,
-	0x0a, 0x0b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x0f, 0x20,
-	0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65,
-	0x12, 0x20, 0x0a, 0x0b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x43, 0x6f, 0x64, 0x65, 0x18,
-	0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x43, 0x6f,
-	0x64, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x62, 0x75, 0x64, 0x67, 0x65, 0x74, 0x18, 0x11, 0x20, 0x01,
-	0x28, 0x03, 0x52, 0x06, 0x62, 0x75, 0x64, 0x67, 0x65, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x62, 0x69,
-	0x64, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x12, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x62,
-	0x69, 0x64, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x62, 0x75, 0x79, 0x65,
-	0x72, 0x18, 0x13, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x62, 0x75, 0x79, 0x65, 0x72, 0x12, 0x1a,
-	0x0a, 0x08, 0x62, 0x75, 0x79, 0x65, 0x72, 0x54, 0x65, 0x6c, 0x18, 0x14, 0x20, 0x01, 0x28, 0x09,
-	0x52, 0x08, 0x62, 0x75, 0x79, 0x65, 0x72, 0x54, 0x65, 0x6c, 0x12, 0x20, 0x0a, 0x0b, 0x62, 0x75,
-	0x79, 0x65, 0x72, 0x50, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x18, 0x15, 0x20, 0x01, 0x28, 0x09, 0x52,
-	0x0b, 0x62, 0x75, 0x79, 0x65, 0x72, 0x50, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06,
-	0x61, 0x67, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x16, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x61, 0x67,
-	0x65, 0x6e, 0x63, 0x79, 0x12, 0x22, 0x0a, 0x0c, 0x61, 0x67, 0x65, 0x6e, 0x63, 0x79, 0x50, 0x65,
-	0x72, 0x73, 0x6f, 0x6e, 0x18, 0x17, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x61, 0x67, 0x65, 0x6e,
-	0x63, 0x79, 0x50, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x67, 0x65, 0x6e,
-	0x63, 0x79, 0x54, 0x65, 0x6c, 0x18, 0x18, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x67, 0x65,
-	0x6e, 0x63, 0x79, 0x54, 0x65, 0x6c, 0x12, 0x16, 0x0a, 0x06, 0x77, 0x69, 0x6e, 0x6e, 0x65, 0x72,
-	0x18, 0x19, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x77, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x12, 0x22,
-	0x0a, 0x0c, 0x77, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x50, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x18, 0x1a,
-	0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x77, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x50, 0x65, 0x72, 0x73,
-	0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x77, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x54, 0x65, 0x6c, 0x18,
-	0x1b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x77, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x54, 0x65, 0x6c,
-	0x12, 0x20, 0x0a, 0x0b, 0x62, 0x69, 0x64, 0x4f, 0x70, 0x65, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x18,
-	0x1c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x62, 0x69, 0x64, 0x4f, 0x70, 0x65, 0x6e, 0x54, 0x69,
-	0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x73, 0x69, 0x67, 0x6e, 0x45, 0x6e, 0x64, 0x54, 0x69, 0x6d,
-	0x65, 0x18, 0x1d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x69, 0x67, 0x6e, 0x45, 0x6e, 0x64,
-	0x54, 0x69, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x62, 0x69, 0x64, 0x45, 0x6e, 0x64, 0x54, 0x69,
-	0x6d, 0x65, 0x18, 0x1e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x62, 0x69, 0x64, 0x45, 0x6e, 0x64,
-	0x54, 0x69, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x74, 0x65, 0x18, 0x1f, 0x20, 0x01,
-	0x28, 0x09, 0x52, 0x04, 0x73, 0x69, 0x74, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x73, 0x70, 0x69, 0x64,
-	0x65, 0x72, 0x43, 0x6f, 0x64, 0x65, 0x18, 0x20, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x70,
-	0x69, 0x64, 0x65, 0x72, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x2f, 0x0a, 0x0b, 0x70, 0x72, 0x6f, 0x6a,
-	0x65, 0x63, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x21, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e,
-	0x62, 0x78, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x50, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x70, 0x72,
-	0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x83, 0x02, 0x0a, 0x05, 0x50, 0x49,
-	0x6e, 0x66, 0x6f, 0x12, 0x20, 0x0a, 0x0b, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x43, 0x6f,
-	0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x76,
-	0x65, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x26, 0x0a, 0x0e, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x65,
-	0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x61,
-	0x70, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x0a,
-	0x0b, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x44, 0x65, 0x70, 0x74, 0x18, 0x03, 0x20, 0x01,
-	0x28, 0x09, 0x52, 0x0b, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x44, 0x65, 0x70, 0x74, 0x12,
-	0x24, 0x0a, 0x0d, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73,
-	0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53,
-	0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x65,
-	0x54, 0x69, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x61, 0x70, 0x70, 0x72,
-	0x6f, 0x76, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x72, 0x6f, 0x6a, 0x65,
-	0x63, 0x74, 0x54, 0x79, 0x70, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x72,
-	0x6f, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x61, 0x70, 0x70,
-	0x72, 0x6f, 0x76, 0x65, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09,
-	0x52, 0x0d, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22,
-	0xc2, 0x01, 0x0a, 0x0e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x52,
-	0x65, 0x71, 0x12, 0x14, 0x0a, 0x05, 0x61, 0x70, 0x70, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28,
-	0x09, 0x52, 0x05, 0x61, 0x70, 0x70, 0x69, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65,
-	0x4f, 0x75, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x4f,
-	0x75, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28,
-	0x03, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x66, 0x6c, 0x61, 0x67,
-	0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x66, 0x6c, 0x61, 0x67, 0x12, 0x1e, 0x0a, 0x0a,
-	0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03,
-	0x52, 0x0a, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x12, 0x16, 0x0a, 0x06,
-	0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73,
-	0x65, 0x72, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x54, 0x79,
-	0x70, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68,
-	0x54, 0x79, 0x70, 0x65, 0x22, 0x59, 0x0a, 0x0f, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4c, 0x69,
-	0x6d, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x19, 0x0a, 0x08, 0x65, 0x72, 0x72, 0x5f, 0x63,
-	0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x65, 0x72, 0x72, 0x43, 0x6f,
-	0x64, 0x65, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20,
-	0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x64,
-	0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x32,
-	0x80, 0x01, 0x0a, 0x06, 0x42, 0x78, 0x43, 0x6f, 0x72, 0x65, 0x12, 0x36, 0x0a, 0x0d, 0x47, 0x65,
-	0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x11, 0x2e, 0x62, 0x78,
-	0x63, 0x6f, 0x72, 0x65, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x1a, 0x12,
-	0x2e, 0x62, 0x78, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65,
-	0x73, 0x70, 0x12, 0x3e, 0x0a, 0x0b, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4c, 0x69, 0x6d, 0x69,
-	0x74, 0x12, 0x16, 0x2e, 0x62, 0x78, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63,
-	0x68, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x17, 0x2e, 0x62, 0x78, 0x63, 0x6f,
-	0x72, 0x65, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x65,
-	0x73, 0x70, 0x42, 0x0a, 0x5a, 0x08, 0x2e, 0x2f, 0x62, 0x78, 0x63, 0x6f, 0x72, 0x65, 0x62, 0x06,
-	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+	0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x12, 0x16, 0x0a, 0x06, 0x69, 0x73, 0x46, 0x72,
+	0x65, 0x65, 0x18, 0x1d, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x69, 0x73, 0x46, 0x72, 0x65, 0x65,
+	0x12, 0x2c, 0x0a, 0x11, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x63, 0x65, 0x70, 0x74, 0x4b, 0x65, 0x79,
+	0x57, 0x6f, 0x72, 0x64, 0x73, 0x18, 0x1e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x69, 0x6e, 0x74,
+	0x65, 0x72, 0x63, 0x65, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x57, 0x6f, 0x72, 0x64, 0x73, 0x12, 0x30,
+	0x0a, 0x13, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x63, 0x65, 0x70, 0x74, 0x4f, 0x74, 0x68, 0x65, 0x72,
+	0x57, 0x6f, 0x72, 0x64, 0x73, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x69, 0x6e, 0x74,
+	0x65, 0x72, 0x63, 0x65, 0x70, 0x74, 0x4f, 0x74, 0x68, 0x65, 0x72, 0x57, 0x6f, 0x72, 0x64, 0x73,
+	0x22, 0x68, 0x0a, 0x0a, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x12, 0x19,
+	0x0a, 0x08, 0x65, 0x72, 0x72, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03,
+	0x52, 0x07, 0x65, 0x72, 0x72, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72,
+	0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d,
+	0x73, 0x67, 0x12, 0x26, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b,
+	0x32, 0x12, 0x2e, 0x62, 0x78, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68,
+	0x44, 0x61, 0x74, 0x61, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0xb2, 0x02, 0x0a, 0x0a, 0x53,
+	0x65, 0x61, 0x72, 0x63, 0x68, 0x44, 0x61, 0x74, 0x61, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75,
+	0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12,
+	0x1a, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x57, 0x6f, 0x72, 0x64, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28,
+	0x09, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x57, 0x6f, 0x72, 0x64, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x69,
+	0x73, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x69, 0x73,
+	0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79,
+	0x4b, 0x65, 0x79, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x68, 0x69, 0x73, 0x74,
+	0x6f, 0x72, 0x79, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x26, 0x0a, 0x04, 0x6c, 0x69, 0x73, 0x74, 0x18,
+	0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x62, 0x78, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x53,
+	0x65, 0x61, 0x72, 0x63, 0x68, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x04, 0x6c, 0x69, 0x73, 0x74, 0x12,
+	0x1c, 0x0a, 0x09, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4d, 0x73, 0x67, 0x18, 0x06, 0x20, 0x01,
+	0x28, 0x09, 0x52, 0x09, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x16, 0x0a,
+	0x06, 0x72, 0x65, 0x6d, 0x61, 0x72, 0x6b, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72,
+	0x65, 0x6d, 0x61, 0x72, 0x6b, 0x12, 0x26, 0x0a, 0x0e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x63, 0x65,
+	0x70, 0x74, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x69,
+	0x6e, 0x74, 0x65, 0x72, 0x63, 0x65, 0x70, 0x74, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x30, 0x0a,
+	0x13, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x63, 0x65, 0x70, 0x74, 0x4f, 0x74, 0x68, 0x65, 0x72, 0x57,
+	0x6f, 0x72, 0x64, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x69, 0x6e, 0x74, 0x65,
+	0x72, 0x63, 0x65, 0x70, 0x74, 0x4f, 0x74, 0x68, 0x65, 0x72, 0x57, 0x6f, 0x72, 0x64, 0x73, 0x22,
+	0xd3, 0x07, 0x0a, 0x0a, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x0e,
+	0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12,
+	0x0a, 0x04, 0x61, 0x72, 0x65, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x61, 0x72,
+	0x65, 0x61, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x72, 0x65, 0x61, 0x55, 0x72, 0x6c, 0x18, 0x03, 0x20,
+	0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x72, 0x65, 0x61, 0x55, 0x72, 0x6c, 0x12, 0x1e, 0x0a, 0x0a,
+	0x62, 0x75, 0x79, 0x65, 0x72, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x0a, 0x62, 0x75, 0x79, 0x65, 0x72, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x12, 0x12, 0x0a, 0x04,
+	0x63, 0x69, 0x74, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x69, 0x74, 0x79,
+	0x12, 0x16, 0x0a, 0x06, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x06, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x69, 0x6e, 0x64, 0x75,
+	0x73, 0x74, 0x72, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x69, 0x6e, 0x64, 0x75,
+	0x73, 0x74, 0x72, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x69, 0x6e, 0x64, 0x75, 0x73, 0x74, 0x72, 0x79,
+	0x55, 0x72, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x69, 0x6e, 0x64, 0x75, 0x73,
+	0x74, 0x72, 0x79, 0x55, 0x72, 0x6c, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73,
+	0x68, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x70, 0x75, 0x62,
+	0x6c, 0x69, 0x73, 0x68, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x66, 0x69, 0x6c, 0x65,
+	0x45, 0x78, 0x69, 0x73, 0x74, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x66, 0x69,
+	0x6c, 0x65, 0x45, 0x78, 0x69, 0x73, 0x74, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x62, 0x74,
+	0x79, 0x70, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x75, 0x62, 0x74, 0x79,
+	0x70, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x73, 0x75, 0x62, 0x74, 0x79, 0x70, 0x65, 0x55, 0x72, 0x6c,
+	0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x75, 0x62, 0x74, 0x79, 0x70, 0x65, 0x55,
+	0x72, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28,
+	0x09, 0x52, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x69, 0x73, 0x43, 0x6f,
+	0x6c, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x69,
+	0x73, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x72,
+	0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52,
+	0x0b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b,
+	0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x43, 0x6f, 0x64, 0x65, 0x18, 0x10, 0x20, 0x01, 0x28,
+	0x09, 0x52, 0x0b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x16,
+	0x0a, 0x06, 0x62, 0x75, 0x64, 0x67, 0x65, 0x74, 0x18, 0x11, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06,
+	0x62, 0x75, 0x64, 0x67, 0x65, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x62, 0x69, 0x64, 0x41, 0x6d, 0x6f,
+	0x75, 0x6e, 0x74, 0x18, 0x12, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x62, 0x69, 0x64, 0x41, 0x6d,
+	0x6f, 0x75, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x62, 0x75, 0x79, 0x65, 0x72, 0x18, 0x13, 0x20,
+	0x01, 0x28, 0x09, 0x52, 0x05, 0x62, 0x75, 0x79, 0x65, 0x72, 0x12, 0x1a, 0x0a, 0x08, 0x62, 0x75,
+	0x79, 0x65, 0x72, 0x54, 0x65, 0x6c, 0x18, 0x14, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x62, 0x75,
+	0x79, 0x65, 0x72, 0x54, 0x65, 0x6c, 0x12, 0x20, 0x0a, 0x0b, 0x62, 0x75, 0x79, 0x65, 0x72, 0x50,
+	0x65, 0x72, 0x73, 0x6f, 0x6e, 0x18, 0x15, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x62, 0x75, 0x79,
+	0x65, 0x72, 0x50, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x67, 0x65, 0x6e,
+	0x63, 0x79, 0x18, 0x16, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x61, 0x67, 0x65, 0x6e, 0x63, 0x79,
+	0x12, 0x22, 0x0a, 0x0c, 0x61, 0x67, 0x65, 0x6e, 0x63, 0x79, 0x50, 0x65, 0x72, 0x73, 0x6f, 0x6e,
+	0x18, 0x17, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x61, 0x67, 0x65, 0x6e, 0x63, 0x79, 0x50, 0x65,
+	0x72, 0x73, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x67, 0x65, 0x6e, 0x63, 0x79, 0x54, 0x65,
+	0x6c, 0x18, 0x18, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x67, 0x65, 0x6e, 0x63, 0x79, 0x54,
+	0x65, 0x6c, 0x12, 0x16, 0x0a, 0x06, 0x77, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x18, 0x19, 0x20, 0x01,
+	0x28, 0x09, 0x52, 0x06, 0x77, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x12, 0x22, 0x0a, 0x0c, 0x77, 0x69,
+	0x6e, 0x6e, 0x65, 0x72, 0x50, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x0c, 0x77, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x50, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x12, 0x1c,
+	0x0a, 0x09, 0x77, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x54, 0x65, 0x6c, 0x18, 0x1b, 0x20, 0x01, 0x28,
+	0x09, 0x52, 0x09, 0x77, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x54, 0x65, 0x6c, 0x12, 0x20, 0x0a, 0x0b,
+	0x62, 0x69, 0x64, 0x4f, 0x70, 0x65, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x1c, 0x20, 0x01, 0x28,
+	0x09, 0x52, 0x0b, 0x62, 0x69, 0x64, 0x4f, 0x70, 0x65, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x20,
+	0x0a, 0x0b, 0x73, 0x69, 0x67, 0x6e, 0x45, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x1d, 0x20,
+	0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x69, 0x67, 0x6e, 0x45, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65,
+	0x12, 0x1e, 0x0a, 0x0a, 0x62, 0x69, 0x64, 0x45, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x1e,
+	0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x62, 0x69, 0x64, 0x45, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65,
+	0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x74, 0x65, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04,
+	0x73, 0x69, 0x74, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x73, 0x70, 0x69, 0x64, 0x65, 0x72, 0x43, 0x6f,
+	0x64, 0x65, 0x18, 0x20, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x70, 0x69, 0x64, 0x65, 0x72,
+	0x43, 0x6f, 0x64, 0x65, 0x12, 0x2f, 0x0a, 0x0b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49,
+	0x6e, 0x66, 0x6f, 0x18, 0x21, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x62, 0x78, 0x63, 0x6f,
+	0x72, 0x65, 0x2e, 0x50, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63,
+	0x74, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x83, 0x02, 0x0a, 0x05, 0x50, 0x49, 0x6e, 0x66, 0x6f, 0x12,
+	0x20, 0x0a, 0x0b, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x18, 0x01,
+	0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x43, 0x6f, 0x64,
+	0x65, 0x12, 0x26, 0x0a, 0x0e, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x43, 0x6f, 0x6e, 0x74,
+	0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x61, 0x70, 0x70, 0x72, 0x6f,
+	0x76, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x61, 0x70, 0x70,
+	0x72, 0x6f, 0x76, 0x65, 0x44, 0x65, 0x70, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b,
+	0x61, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x44, 0x65, 0x70, 0x74, 0x12, 0x24, 0x0a, 0x0d, 0x61,
+	0x70, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01,
+	0x28, 0x09, 0x52, 0x0d, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75,
+	0x73, 0x12, 0x20, 0x0a, 0x0b, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x54, 0x69, 0x6d, 0x65,
+	0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x54,
+	0x69, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x79,
+	0x70, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63,
+	0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x65,
+	0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x61, 0x70,
+	0x70, 0x72, 0x6f, 0x76, 0x65, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0xc2, 0x01, 0x0a, 0x0e,
+	0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x65, 0x71, 0x12, 0x14,
+	0x0a, 0x05, 0x61, 0x70, 0x70, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x61,
+	0x70, 0x70, 0x69, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x4f, 0x75, 0x74, 0x18,
+	0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x4f, 0x75, 0x74, 0x12, 0x14,
+	0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x63,
+	0x6f, 0x75, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x66, 0x6c, 0x61, 0x67, 0x18, 0x04, 0x20, 0x01,
+	0x28, 0x03, 0x52, 0x04, 0x66, 0x6c, 0x61, 0x67, 0x12, 0x1e, 0x0a, 0x0a, 0x70, 0x65, 0x72, 0x63,
+	0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x70, 0x65,
+	0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x75, 0x73, 0x65, 0x72,
+	0x49, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64,
+	0x12, 0x1e, 0x0a, 0x0a, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x54, 0x79, 0x70, 0x65, 0x18, 0x07,
+	0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x54, 0x79, 0x70, 0x65,
+	0x22, 0x59, 0x0a, 0x0f, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x52,
+	0x65, 0x73, 0x70, 0x12, 0x19, 0x0a, 0x08, 0x65, 0x72, 0x72, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18,
+	0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x65, 0x72, 0x72, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x17,
+	0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52,
+	0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18,
+	0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x32, 0x80, 0x01, 0x0a, 0x06,
+	0x42, 0x78, 0x43, 0x6f, 0x72, 0x65, 0x12, 0x36, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x53, 0x65, 0x61,
+	0x72, 0x63, 0x68, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x11, 0x2e, 0x62, 0x78, 0x63, 0x6f, 0x72, 0x65,
+	0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x62, 0x78, 0x63,
+	0x6f, 0x72, 0x65, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x12, 0x3e,
+	0x0a, 0x0b, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x16, 0x2e,
+	0x62, 0x78, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4c, 0x69, 0x6d,
+	0x69, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x17, 0x2e, 0x62, 0x78, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x53,
+	0x65, 0x61, 0x72, 0x63, 0x68, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x42, 0x0a,
+	0x5a, 0x08, 0x2e, 0x2f, 0x62, 0x78, 0x63, 0x6f, 0x72, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74,
+	0x6f, 0x33,
 }
 
 var (

+ 4 - 1
jyBXCore/rpc/util/search.go

@@ -71,8 +71,9 @@ func FilteKey(k string) string {
 	return k
 }
 
-//超过keywordsLimit个字,截断
+// InterceptSearchKW 超过keywordsLimit个字,截断
 //返回截取后的字符串和截取掉中的前3个字
+// b_word:截取后的关键词;a_word:截取后 后面三个字;s_word:已截取 处理过的关键词
 func InterceptSearchKW(word string, keywordsLimit int, isFilter bool) (b_word, a_word, s_word string) {
 	if isFilter {
 		word = FilteKey(word)
@@ -710,3 +711,5 @@ func GetPublishTime(y, m int, publishTime string) string {
 	}
 	return ""
 }
+
+//20220114 P260搜索优化