Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in
Toggle navigation
S
search_tips
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
rank
search_tips
Commits
c940d41a
Commit
c940d41a
authored
Jan 28, 2019
by
段英荣
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
modify
parent
b81a5e09
Show whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
90 additions
and
7 deletions
+90
-7
tools.py
libs/tools.py
+45
-0
auto_tips.py
search/utils/auto_tips.py
+18
-4
auto_tips.py
search/view/auto_tips.py
+0
-1
views.py
search/views.py
+3
-1
trans2es_tipsdata2es.py
trans2es/management/commands/trans2es_tipsdata2es.py
+1
-1
type_info.py
trans2es/type_info.py
+10
-0
hospital_transfer.py
trans2es/utils/hospital_transfer.py
+13
-0
No files found.
libs/tools.py
View file @
c940d41a
...
...
@@ -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
search/utils/auto_tips.py
View file @
c940d41a
...
...
@@ -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
...
...
search/view/auto_tips.py
View file @
c940d41a
...
...
@@ -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
:
...
...
search/views.py
View file @
c940d41a
...
...
@@ -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
,
...
...
trans2es/management/commands/trans2es_tipsdata2es.py
View file @
c940d41a
...
...
@@ -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
e
s!"
%
type_name
)
logging
.
info
(
"begin sync [
%
s] data to
redi
s!"
%
type_name
)
type_info
=
tips_attr_sync_to_redis_type_info_map
()[
type_name
]
query_set
=
type_info
.
queryset
...
...
trans2es/type_info.py
View file @
c940d41a
...
...
@@ -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
,
)
]
...
...
trans2es/utils/hospital_transfer.py
View file @
c940d41a
...
...
@@ -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
())
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment