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

modify

parent b81a5e09
...@@ -7,6 +7,10 @@ from datetime import datetime ...@@ -7,6 +7,10 @@ from datetime import datetime
from django.http import HttpResponse from django.http import HttpResponse
import json import json
import hashlib 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): def tzlc(dt, truncate_to_sec=True):
...@@ -39,4 +43,44 @@ def json_http_response(result, status=200, extra_headers=None): ...@@ -39,4 +43,44 @@ def json_http_response(result, status=200, extra_headers=None):
def getMd5Digest(ori_content): def getMd5Digest(ori_content):
m5 = hashlib.md5() m5 = hashlib.md5()
m5.update(ori_content.encode("utf-8")) m5.update(ori_content.encode("utf-8"))
return m5.hexdigest() return m5.hexdigest()
\ No newline at end of file
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 ...@@ -8,10 +8,11 @@ import traceback
import json import json
from libs.es import ESPerform from libs.es import ESPerform
from libs.cache import redis_client 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,lat,lng,offset=0,size=100):
def get_suggest_tips(query,offset=0,size=100):
try: try:
q = { q = {
"suggest":{ "suggest":{
...@@ -39,9 +40,22 @@ def get_suggest_tips(query,offset=0,size=100): ...@@ -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) hit_item["_source"]["highlight_name"] = hit_item["_source"]["ori_name"].replace(query,highlight_marks)
if hit_item["_source"]["type_flag"] == "hospital": 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: 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"]) ret_list.append(hit_item["_source"])
return ret_list return ret_list
......
...@@ -13,7 +13,6 @@ from search.utils.auto_tips import get_suggest_tips ...@@ -13,7 +13,6 @@ from search.utils.auto_tips import get_suggest_tips
@bind("search_tips/search/auto_complete_query") @bind("search_tips/search/auto_complete_query")
def auto_complete_query(q): def auto_complete_query(q):
try: try:
......
...@@ -26,11 +26,13 @@ def auto_complete(request): ...@@ -26,11 +26,13 @@ def auto_complete(request):
""" """
q = request.GET.get('q', '').strip() q = request.GET.get('q', '').strip()
lat = request.GET.get('lat', 0).strip()
lng = request.GET.get('lng', 0).strip()
if not q: if not q:
return json_http_response({'error': 0, 'data': []}) return json_http_response({'error': 0, 'data': []})
data = get_suggest_tips(q) data = get_suggest_tips(q, lat, lng)
result = { result = {
'error': 0, 'error': 0,
......
...@@ -44,7 +44,7 @@ class Command(BaseCommand): ...@@ -44,7 +44,7 @@ class Command(BaseCommand):
if len(options["type"]): if len(options["type"]):
if options["type"] == "all" or type_name==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] type_info = tips_attr_sync_to_redis_type_info_map()[type_name]
query_set = type_info.queryset query_set = type_info.queryset
......
...@@ -392,6 +392,16 @@ def tips_attr_sync_to_redis_type_info_map(): ...@@ -392,6 +392,16 @@ def tips_attr_sync_to_redis_type_info_map():
bulk_insert_chunk_size=100, bulk_insert_chunk_size=100,
round_insert_chunk_size=5, round_insert_chunk_size=5,
round_insert_period=2, 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,
) )
] ]
......
...@@ -41,4 +41,17 @@ class HospitalTransfer(object): ...@@ -41,4 +41,17 @@ class HospitalTransfer(object):
return (item_dict,suggest_list) return (item_dict,suggest_list)
except: except:
logging.error("catch exception,err_msg:%s" % traceback.format_exc()) logging.error("catch exception,err_msg:%s" % traceback.format_exc())
return ([],[]) return ([],[])
\ No newline at end of file
@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