parent
d737bee569
commit
31d6d15c69
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -1,3 +1,47 @@
|
||||
from django.db import models
|
||||
|
||||
# Create your models here.
|
||||
# -*- coding: utf-8 -*-
|
||||
__author__ = 'bobby'
|
||||
|
||||
from datetime import datetime
|
||||
from elasticsearch_dsl import DocType, Date, Nested, Boolean, \
|
||||
analyzer, InnerObjectWrapper, Completion, Keyword, Text, Integer
|
||||
|
||||
from elasticsearch_dsl.analysis import CustomAnalyzer as _CustomAnalyzer
|
||||
|
||||
from elasticsearch_dsl.connections import connections
|
||||
|
||||
connections.create_connection(hosts=["localhost"])
|
||||
|
||||
|
||||
class CustomAnalyzer(_CustomAnalyzer):
|
||||
def get_analysis_definition(self):
|
||||
return {}
|
||||
|
||||
|
||||
ik_analyzer = CustomAnalyzer("ik_max_word", filter=["lowercase"])
|
||||
|
||||
|
||||
class ArticleType(DocType):
|
||||
# 伯乐在线文章类型
|
||||
suggest = Completion(analyzer=ik_analyzer)
|
||||
title = Text(analyzer="ik_max_word")
|
||||
create_date = Date()
|
||||
url = Keyword()
|
||||
url_object_id = Keyword()
|
||||
front_image_url = Keyword()
|
||||
front_image_path = Keyword()
|
||||
praise_nums = Integer()
|
||||
comment_nums = Integer()
|
||||
fav_nums = Integer()
|
||||
tags = Text(analyzer="ik_max_word")
|
||||
content = Text(analyzer="ik_max_word")
|
||||
|
||||
class Meta:
|
||||
index = "jobbole"
|
||||
doc_type = "article"
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
ArticleType.init()
|
||||
|
@ -1,3 +1,88 @@
|
||||
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})
|
||||
|
Loading…
Reference in new issue