Commit c940d41a authored by 段英荣's avatar 段英荣

modify

parent b81a5e09
......@@ -7,6 +7,10 @@ from datetime import datetime
from django.http import HttpResponse
import json
import hashlib
from trans2es.models import doctor
import logging
import traceback
from math import radians, cos, sin, asin, sqrt
def tzlc(dt, truncate_to_sec=True):
......@@ -40,3 +44,43 @@ def getMd5Digest(ori_content):
m5 = hashlib.md5()
m5.update(ori_content.encode("utf-8"))
return m5.hexdigest()
def point_distance(lon1, lat1, lon2, lat2):
"""
Calculate the great circle distance between two points
on the earth (specified in decimal degrees)
"""
# 将十进制度数转化为弧度
lon1, lat1, lon2, lat2 = map(radians, [lon1, lat1, lon2, lat2])
# haversine公式
dlon = lon2 - lon1
dlat = lat2 - lat1
a = sin(dlat / 2)**2 + cos(lat1) * cos(lat2) * sin(dlon / 2)**2
c = 2 * asin(sqrt(a))
r = 6371 # 地球平均半径,单位为km
return c * r * 1000
class HostpitalPosInfo(object):
hospital_pos_dict = dict()
@classmethod
def get_hostpital_info(cls):
try:
if len(cls.hospital_pos_dict) == 0:
query_results = doctor.Hospital.objects.all().query
for item in query_results:
name = item.name
lng = item.baidu_loc_lng
lat = item.baidu_loc_lat
cls.hospital_pos_dict[name] = [lng,lat]
return cls.hospital_pos_dict
except:
logging.error("catch exception,err_msg:%s" % traceback.format_exc())
return cls.hospital_pos_dict
g_hospital_pos_dict = HostpitalPosInfo.get_hostpital_info()
\ No newline at end of file
......@@ -8,10 +8,11 @@ import traceback
import json
from libs.es import ESPerform
from libs.cache import redis_client
from libs.tools import g_hospital_pos_dict
from libs.tools import point_distance
def get_suggest_tips(query,offset=0,size=100):
def get_suggest_tips(query,lat,lng,offset=0,size=100):
try:
q = {
"suggest":{
......@@ -39,9 +40,22 @@ def get_suggest_tips(query,offset=0,size=100):
hit_item["_source"]["highlight_name"] = hit_item["_source"]["ori_name"].replace(query,highlight_marks)
if hit_item["_source"]["type_flag"] == "hospital":
hit_item["_source"]["describe"] = "6.5km"
if hit_item["_source"]["ori_name"] in g_hospital_pos_dict:
distance = point_distance(lng,lat,g_hospital_pos_dict[hit_item["_source"]["ori_name"]][0],g_hospital_pos_dict[hit_item["_source"]["ori_name"]][1])
if distance < 1000*10000:
if distance < 1000:
if distance < 100:
hit_item["_source"]["describe"] = "<100" + "米"
else:
hit_item["_source"]["describe"] = "约" + str(distance) + "米"
else:
hit_item["_source"]["describe"] = "约" + str(1.0*distance/1000) + "km"
else:
hit_item["_source"]["describe"] = ">1000km"
else:
hit_item["_source"]["describe"] = ""
else:
hit_item["_source"]["describe"] = "约"+str(hit_item["_source"]["results_num"])+"结果" if hit_item["_source"]["results_num"] else ""
hit_item["_source"]["describe"] = "约"+str(hit_item["_source"]["results_num"])+"结果" if hit_item["_source"]["results_num"] else ""
ret_list.append(hit_item["_source"])
return ret_list
......
......@@ -13,7 +13,6 @@ from search.utils.auto_tips import get_suggest_tips
@bind("search_tips/search/auto_complete_query")
def auto_complete_query(q):
try:
......
......@@ -26,11 +26,13 @@ def auto_complete(request):
"""
q = request.GET.get('q', '').strip()
lat = request.GET.get('lat', 0).strip()
lng = request.GET.get('lng', 0).strip()
if not q:
return json_http_response({'error': 0, 'data': []})
data = get_suggest_tips(q)
data = get_suggest_tips(q, lat, lng)
result = {
'error': 0,
......
......@@ -44,7 +44,7 @@ class Command(BaseCommand):
if len(options["type"]):
if options["type"] == "all" or type_name==options["type"]:
logging.info("begin sync [%s] data to es!" % type_name)
logging.info("begin sync [%s] data to redis!" % type_name)
type_info = tips_attr_sync_to_redis_type_info_map()[type_name]
query_set = type_info.queryset
......
......@@ -392,6 +392,16 @@ def tips_attr_sync_to_redis_type_info_map():
bulk_insert_chunk_size=100,
round_insert_chunk_size=5,
round_insert_period=2,
),
TypeInfo(
name='suggest',
type='hospital_latlng', # hospital_pos_info
model=doctor.Hospital,
query_deferred=lambda: doctor.Hospital.objects.all().query,
get_data_func=HospitalTransfer.get_hospital_lat_lng_info_to_redis,
bulk_insert_chunk_size=100,
round_insert_chunk_size=5,
round_insert_period=2,
)
]
......
......@@ -42,3 +42,16 @@ class HospitalTransfer(object):
except:
logging.error("catch exception,err_msg:%s" % traceback.format_exc())
return ([],[])
@classmethod
def get_hospital_lat_lng_info_to_redis(cls, instance):
try:
redis_key_prefix = "search_tips:hospital_latlng_info"
name = instance.name
lng = instance.baidu_loc_lng
lat = instance.baidu_loc_lat
pos_list = [lng,lat]
redis_client.hset(redis_key_prefix,name,pos_list)
except:
logging.error("catch exception,err_msg:%s" % traceback.format_exc())
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment