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

from django.shortcuts import render
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'])
# Create your views here.
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})