阿里云开放搜索的python客户端,阿里云python客户端,阿里云开放搜索的pyth


阿里云开放搜索的python客户端:

#!/usr/bin/env python# coding: utf-8import sysreload(sys)sys.setdefaultencoding("utf-8")__author__ = 'yukaizhao'from datetime import datetime, timedeltaimport urllib, urllib2from utils import dumpJSON, loadJSONimport uuidimport timefrom config import configParserOPEN_SEARCH_URL_ROOT = configParser.get('search','aliyunOpenSearchUrlRoot')# APP_NAME = configParser.get('search','aliyunAppName')_ACCESS_KEY=configParser.get('search','aliyunAccessKey')_ACCESS_KEY_SECRET=configParser.get('search','aliyunAccessKeySecret')_HTTP_GET = 'GET'_HTTP_POST = 'POST'_ISO8601_DATE_FORMAT = "%Y-%m-%dT%H:%M:%SZ"_TIMEZONE_UTC_OFFSET = -8_ALIYUN_SING_ALGORITHM = configParser.get('search','aliyunSignAlgorithm')_ALIYUN_SIGN_ENCODING = configParser.get('search','aliyunSignEncoding')from hashlib import sha1import hmacfrom urllib import quote_plusfrom sorteddict import sorteddictdef mac_sha1(key, data):    _hmac = hmac.new(key, data.encode('UTF-8'), sha1)    signature = _hmac.digest().encode('base64')    return signature[:-1]def get_signature(params, method):    def _urlencode(val):        if isinstance(val, unicode):            val = str(val)        return quote_plus(val)    def _encode(val):        if not isinstance(val, basestring): val = str(val)        result = _urlencode(val)        if result:            return result.replace("+", "%20").replace("*", "%2A").replace("%7E", "~")        return result    queryParms = '&'.join(['%s=%s'% (k, _encode(params[k])) for k in params.keys()])    toSign = '%s&%%2F&%s'% (method, _encode(queryParms))    sha1Key = '%s&'% (_ACCESS_KEY_SECRET,)    return mac_sha1(sha1Key, toSign)def to_iso8600_date(dt):    utcTime = dt + timedelta(hours=_TIMEZONE_UTC_OFFSET)    return utcTime.strftime(_ISO8601_DATE_FORMAT)def call(url, params, method):    params["Version"] = "v2"    params["AccessKeyId"] = _ACCESS_KEY    params["Timestamp"] = to_iso8600_date(datetime.now())    params["SignatureMethod"] = "HMAC-SHA1"    params["SignatureVersion"] = "1.0"    params["SignatureNonce"] = str(uuid.uuid1())    signature = get_signature(params, method)    params['Signature'] = signature    para_data = urllib.urlencode(params)    if method == _HTTP_GET:        url = '%s?%s' % (url, para_data)        para_data = None    f = urllib2.urlopen(url, para_data)    response = f.read()    f.close()    responseJSON = loadJSON(response)    if responseJSON.has_key('status') and responseJSON['status'] == 'OK':        return responseJSON['result'] if responseJSON.has_key("result") else True    errorInfo = '%s:%s\nresponse:%s' % (method, url, response)    raise SearchError(errorInfo)def index_call(appName, params, method):    url = '%s%s' % (OPEN_SEARCH_URL_ROOT, appName)    return call(url, params, method)def add_document(appName, search_table, items):    params = sorteddict({'action':'push','table_name': search_table})    postData = dumpJSON(items)    params['items'] = postData    return index_call(appName, params, _HTTP_POST)def view_document(appName, docId):    params = sorteddict({'id':docId})    return index_call(appName, params, _HTTP_POST)def delete_document(appName, *ids):    items = []    for id in ids:        items.append({'cmd':'delete',"fields":{"id":id}})    params = sorteddict({'action':'push'})    params['table_name'] = 'code'    postData = dumpJSON(items)    params['items'] = postData    return index_call(appName, params, _HTTP_POST)def list_apps(page, pageSize):    url = 'http://opensearch.aliyuncs.com/index'    params = sorteddict({'page': page, 'page_size': pageSize})    return call(url, params, _HTTP_GET)def _search(appName, keyword, pageNum, pageSize, sort='-RANK', **where):    def escape(input): return input.replace('\'', '')    config = u'config=start:%d,hit:%d,format:json' % ((pageNum-1)*pageSize, pageSize)    condition = u"query=default:'%s'" % (escape(keyword),)    if where is not None:        for fieldName,operatorAndOperand in where.items():            operator, fieldValue = operatorAndOperand            if isinstance(fieldValue, tuple):                exp = ''                for v in fieldValue:                    if exp: exp += ' OR '                    exp += u" %s:'%s'" % (fieldName, escape(v))                condition = u" %s (%s)" % (operator, exp)            else:                condition += u" %s %s:'%s'" % (operator, escape(fieldName), escape(fieldValue))    sortExp = u'sort=%s' % (sort,)    query = u'%s && %s && %s' % (config, condition, sortExp)    url = u'http://opensearch.aliyuncs.com/search'    params = sorteddict({u'query': query,'index_name': appName})    return call(url, params, _HTTP_GET)def search(appName, keyword, pageNum, pageSize, sort='-RANK', **where):    # aliyun has bug so add try times logic    tryTimes = 0    maxTryTimes = 5    lastEx = None    while tryTimes < maxTryTimes:        try:            return _search(appName, keyword, pageNum, pageSize, sort, **where)        except SearchError, ex:            tryTimes += 1            lastEx = ex    raise lastExdef get_timestamp():    return time.time()class SearchError(RuntimeError): passif __name__ == '__main__':    from pprint import pprint    result = search(u'内存溢出', 1, 10)    pprint (result)    delete_document('1','2','3','4','0','10','11','12','13','14')    document = view_document("2")    pprint(document)    apps = list_apps(1, 10)    pprint(apps)    items = [        {            "fields": {                "id": "10",                "type_id": 71,                "cat_id": 53,                "title": "溢出内存,内存溢出",                "body": "溢出内存,内存溢出",                "url": "广大中小企业都有各种结构化的数据需要进行检索,目前一般采用数据库本身提供的搜索功能或者利用open source的搜索软件搭建,这样的做法不但会消耗网站本身的资源,性能也会很容易成为问题,而且相关性通常也不够好。我们的产品的目的是要利用阿里云先进的云计算和搜索技术向广大中小企业提供低成本,高质量,高性能,可定制的数据搜索解决方案。本项目和云搜索的通用解决方案目标略有不同,主要区别为本项目主要针对用户的结构化数据进行搜索,云搜索的通用解决方案则主要是针对网页型数据位处理对象。",                "author": "广大中小企业都有各种结构化的数据需要进行检索,目前一般采用数据库本身提供的搜索功能或者利用open source的搜索软件搭建,这样的做法不但会消耗网站本身的资源,性能也会很容易成为问题,而且相关性通常也不够好。我们的产品的目的是要利用阿里云先进的云计算和搜索技术向广大中小企业提供低成本,高质量,高性能,可定制的数据搜索解决方案。本项目和云搜索的通用解决方案目标略有不同,主要区别为本项目主要针对用户的结构化数据进行搜索,云搜索的通用解决方案则主要是针对网页型数据位处理对象。",                "thumbnail": "广大中小企业都有各种结构化的数据需要进行检索,目前一般采用数据库本身提供的搜索功能或者利用open source的搜索软件搭建,这样的做法不但会消耗网站本身的资源,性能也会很容易成为问题,而且相关性通常也不够好。我们的产品的目的是要利用阿里云先进的云计算和搜索技术向广大中小企业提供低成本,高质量,高性能,可定制的数据搜索解决方案。本项目和云搜索的通用解决方案目标略有不同,主要区别为本项目主要针对用户的结构化数据进行搜索,云搜索的通用解决方案则主要是针对网页型数据位处理对象。",                "create_timestamp": 1,                "update_timestamp": 12,                "hit_num": 93,                "focus_count": 2,                "grade": 78,                "comment_count": 70,                "tag": "广大中小企业都有各种结构化的数据需要进行检索,目前一般采用数据库本身提供的搜索功能或者利用open source的搜索软件搭建,这样的做法不但会消耗网站本身的资源,性能也会很容易成为问题,而且相关性通常也不够好。我们的产品的目的是要利用阿里云先进的云计算和搜索技术向广大中小企业提供低成本,高质量,高性能,可定制的数据搜索解决方案。本项目和云搜索的通用解决方案目标略有不同,主要区别为本项目主要针对用户的结构化数据进行搜索,云搜索的通用解决方案则主要是针对网页型数据位处理对象。",                "create_user_id": 14,                "create_user_name": "广大中小企业都有各种结构化的数据需要进行检索,目前一般采用数据库本身提供的搜索功能或者利用open source的搜索软件搭建,这样的做法不但会消耗网站本身的资源,性能也会很容易成为问题,而且相关性通常也不够好。我们的产品的目的是要利用阿里云先进的云计算和搜索技术向广大中小企业提供低成本,高质量,高性能,可定制的数据搜索解决方案。本项目和云搜索的通用解决方案目标略有不同,主要区别为本项目主要针对用户的结构化数据进行搜索,云搜索的通用解决方案则主要是针对网页型数据位处理对象。"            },            "cmd": "ADD"        }    ]    #add_document(items, 'code')

评论关闭