pick.py 5.32 KB
#!/usr/bin/env python
# -*- coding: utf-8 -*-

from gm_rpcd.all import bind
import logging
import traceback
import json
from libs.cache import redis_client
from libs.es import ESPerform
from search.utils.pick import PickUtils
from search.utils.common import PickType

@bind("physical/search/pick_celebrity")
def pick_celebrity(user_id,pick_id,offset=0,size=10):
    try:
        if not isinstance(user_id,int):
            user_id = -1

        have_read_pick_celebrity_ids = list()

        redis_key = "physical:pick_celebrity:" + "user_id:" + str(user_id) + ":pick_id:" + str(pick_id)

        if user_id != -1:
            try:
                offset = 0
                redis_celebrity_info = redis_client.get(redis_key)
                if redis_celebrity_info:
                    have_read_pick_celebrity_ids = json.loads(redis_celebrity_info)
            except:
                logging.error("catch exception,err_msg:%s" % traceback.format_exc())
                pass

        recommend_pick_celebrity_list = PickUtils.get_recommend_celebrity_id_list(pick_id,have_read_pick_celebrity_ids,offset,size)

        if len(recommend_pick_celebrity_list)>0 and user_id!=-1:
            total_read_celebrity_ids = have_read_pick_celebrity_ids + recommend_pick_celebrity_list
            PickUtils.refresh_redis_data(have_read_celebrity_list=total_read_celebrity_ids,
                                         redis_cli=redis_client,redis_key=redis_key)

        return {"recommend_pick_celebrity_ids": recommend_pick_celebrity_list}
    except:
        logging.error("catch exception,err_msg:%s" % traceback.format_exc())
        return {"recommend_pick_celebrity_ids":[]}


@bind("physical/search/pick_topic")
def pick_topic(user_id,pick_id,offset=0,size=10):
    try:
        if not isinstance(user_id,int):
            user_id = -1

        have_read_pick_topic_ids = list()

        redis_key = "physical:pick_topic:" + "user_id:" + str(user_id) + ":pick_id:" + str(pick_id)

        if user_id != -1:
            try:
                offset = 0
                redis_celebrity_info = redis_client.get(redis_key)
                if redis_celebrity_info:
                    have_read_pick_topic_ids = json.loads(redis_celebrity_info)
            except:
                logging.error("catch exception,err_msg:%s" % traceback.format_exc())
                pass

        q = dict()
        functions_list = [
            {
                "filter": {"match": {"content_level": 5}},
                "weight": 5
            },
            {
                "filter": {"match": {"content_level": 4}},
                "weight": 3
            },
            {
                "filter": {"match": {"content_level": 3}},
                "weight": 2
            },
            {
                "gauss": {
                    "update_time": {
                        "scale": "1d",
                        "decay": 0.5
                    }
                }
            }
        ]

        query_function_score = {
            "query":{
                "bool":{
                    "must":[
                        {"term":{"pick_id_list":pick_id}},
                        {"range": {"content_level": {"gte": 3, "lte": 5}}}
                    ],
                    "must_not": {
                        "terms": {
                            "id": have_read_pick_topic_ids
                        }
                    },
                }
            },
            "score_mode": "sum",
            "boost_mode": "replace",
            "functions":functions_list
        }

        q["query"] = {
            "function_score":query_function_score
        }
        q["sort"] = [
            "_score"
        ]
        q["_source"] = {
            "includes":["id"]
        }
        result_dict = ESPerform.get_search_results(ESPerform.get_cli(),sub_index_name="topic",query_body=q,offset=offset,size=size)

        recommend_pick_topic_list = []
        if len(result_dict["hits"]) > 0:
            recommend_pick_topic_list = [item["_source"]["id"] for item in result_dict["hits"]]

        if len(recommend_pick_topic_list)>0 and user_id!=-1:
            total_read_topic_ids = have_read_pick_topic_ids + recommend_pick_topic_list
            PickUtils.refresh_redis_data(have_read_celebrity_list=total_read_topic_ids,
                                         redis_cli=redis_client,redis_key=redis_key,if_expire=False)

        return {"recommend_pick_topic_ids": recommend_pick_topic_list}

    except:
        logging.error("catch exception,err_msg:%s" % traceback.format_exc())
        return {"recommend_pick_topic_ids":[]}


@bind("physical/search/pick_query")
def pick_query(query="",pick_id=-1,query_type=PickType.TOPIC_PICK,offset=0,size=10):
    """
    :remark 榜单搜索
    :param query:
    :param pick_id:
    :param query_type:
    :param offset:
    :param size:
    :return:
    """
    try:
        pick_query_result_list = []
        if query_type == PickType.TOPIC_PICK:
            pick_query_result_list = PickUtils.get_topic_pick_query(query,pick_id,offset,size)
        elif query_type == PickType.CELEBRITY_PICK:
            pick_query_result_list = PickUtils.get_celebrity_pick_query(query,pick_id,offset,size)

        return {"pick_query_result_list":pick_query_result_list}
    except:
        logging.error("catch exception,err_msg:%s" % traceback.format_exc())
        return {"pick_query_result_list":[]}