You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

89 lines
3.2 KiB

6 months ago
from django.shortcuts import render
6 months ago
from django.views.generic.base import View
from search.models import ArticleType
from django.http import HttpResponse
import json
from elasticsearch import Elasticsearch
from datetime import datetime
client = Elasticsearch(hosts=['127.0.0.1'])
6 months ago
# Create your views here.
6 months ago
class SearchSuggest(View):
# 搜索建议模块
def get(self, request):
key_words = request.GET.get('s', '')
re_datas = []
if key_words:
s = ArticleType.search()
s = s.suggest('my_suggest', key_words, completion={
"field": "suggest", "fuzzy": {
"fuzziness": 2
},
"size": 10
})
suggestions = s.execute_suggest()
for match in suggestions.my_suggest[0].options:
source = match._source
re_datas.append(source["title"])
return HttpResponse(json.dumps(re_datas), content_type="application/json")
class SearchView(View):
def get(self, request):
key_words = request.GET.get("q", '')
page = request.GET.get('p', '1')
try:
page = int(page)
except:
page = 1
start_time = datetime.now()
response = client.search(
index="jobbole",
body={
"query": {
"multi_match": {
"query": key_words,
"fields": ["tags", "title", "content"]
}
},
"from": (page - 1) * 10,
"size": 10,
"highlight": {
"pre_tags": ['<span class="keyWord">'],
"post_tags": ['</span>'],
"fields": {
"title": {},
"content": {},
}
}
}
)
end_time = datetime.now()
last_seconds = (end_time - start_time).total_seconds()
total_nums = response['hits']['total']
if (page % 10) > 0:
page_nums = int(total_nums / 10) + 1
else:
page_nums = int(total_nums / 10)
# 构造值,获取每个字段的值
hit_list = []
for hit in response['hits']['hits']:
hit_dict = {}
if 'title' in hit['highlight']:
hit_dict['title'] = "".join(hit['highlight']['title'])
else:
hit_dict['title'] = hit['_source']['title']
if 'content' in hit['highlight']:
hit_dict['content'] = "".join(hit['highlight']['content'])[:500]
else:
hit_dict['content'] = hit['_source']['content'][:500]
hit_dict["create_date"] = hit['_source']['create_date']
hit_dict["url"] = hit['_source']['url']
hit_dict["score"] = hit['_score']
hit_list.append(hit_dict)
return render(request, 'result.html',
{'page': page, 'total_nums': total_nums, 'all_hits': hit_list, 'key_words': key_words,
'page_nums': page_nums, 'total_nums': total_nums,'last_seconds':last_seconds})