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
|
from django.db import models
|
||||||
|
|
||||||
# Create your models here.
|
# 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.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.
|
# 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