# encoding: utf-8
from __future__ import absolute_import, division, print_function, unicode_literals
from whoosh.writing import AsyncWriter
from whoosh.searching import ResultsPage
from whoosh.qparser import QueryParser
from whoosh.highlight import ContextFragmenter, HtmlFormatter
from whoosh.highlight import highlight as whoosh_highlight
from whoosh.filedb.filestore import FileStorage, RamStorage
from whoosh.fields import BOOLEAN, DATETIME, IDLIST, KEYWORD, NGRAM, NGRAMWORDS, NUMERIC, Schema, TEXT
from whoosh.fields import ID as WHOOSH_ID
from whoosh.analysis import StemmingAnalyzer
from whoosh import index
from jieba.analyse import ChineseAnalyzer
import json
import os
import re
import shutil
import threading
import warnings
from django.conf import settings
from django.core.exceptions import ImproperlyConfigured
import six
from django.utils.datetime_safe import datetime
from django.utils.encoding import force_text
from haystack.backends import BaseEngine, BaseSearchBackend, BaseSearchQuery, EmptyResults, log_query
from haystack.constants import DJANGO_CT, DJANGO_ID, ID
from haystack.exceptions import MissingDependency, SearchBackendError, SkipDocument
from haystack.inputs import Clean, Exact, PythonData, Raw
from haystack.models import SearchResult
from haystack.utils import log as logging
from haystack.utils import get_identifier, get_model_ct
from haystack.utils.app_loading import haystack_get_model
try:
import whoosh
except ImportError:
raise MissingDependency(
"The 'whoosh' backend requires the installation of 'Whoosh'. Please refer to the documentation.")
# Handle minimum requirement.
if not hasattr(whoosh, '__version__') or whoosh.__version__ < (2, 5, 0):
raise MissingDependency(
"The 'whoosh' backend requires version 2.5.0 or greater.")
# Bubble up the correct error.
DATETIME_REGEX = re.compile(
'^(?P<year>\d{4})-(?P<month>\d{2})-(?P<day>\d{2})T(?P<hour>\d{2}):(?P<minute>\d{2}):(?P<second>\d{2})(\.\d{3,6}Z?)?$')
LOCALS = threading.local()
LOCALS.RAM_STORE = None
class WhooshHtmlFormatter(HtmlFormatter):
"""
This is a HtmlFormatter simpler than the whoosh.HtmlFormatter.
We use it to have consistent results across backends. Specifically,
Solr, Xapian and Elasticsearch are using this formatting.
"""
template = '<%(tag)s>%(t)s</%(tag)s>'
class WhooshSearchBackend(BaseSearchBackend):
# Word reserved by Whoosh for special use.
RESERVED_WORDS = (
'AND',
'NOT',
'OR',
'TO',
)
# Characters reserved by Whoosh for special use.
# The '\\' must come first, so as not to overwrite the other slash
# replacements.
RESERVED_CHARACTERS = (
'\\', '+', '-', '&&', '||', '!', '(', ')', '{', '}',
'[', ']', '^', '"', '~', '*', '?', ':', '.',
)
def __init__(self, connection_alias, **connection_options):
super(
WhooshSearchBackend,
self).__init__(
connection_alias,
**connection_options)
self.setup_complete = False
self.use_file_storage = True
self.post_limit = getattr(
connection_options,
'POST_LIMIT',
128 * 1024 * 1024)
self.path = connection_options.get('PATH')
if connection_options.get('STORAGE', 'file') != 'file':
self.use_file_storage = False
if self.use_file_storage and not self.path:
raise ImproperlyConfigured(
"You must specify a 'PATH' in your settings for connection '%s'." %
connection_alias)
self.log = logging.getLogger('haystack')
def setup(self):
"""
Defers loading until needed.
"""
from haystack import connections
new_index = False
# Make sure the index is there.
if self.use_file_storage and not os.path.exists(self.path):
os.makedirs(self.path)
new_index = True
if self.use_file_storage and not os.access(self.path, os.W_OK):
raise IOError(
"The path to your Whoosh index '%s' is not writable for the current user/group." %
self.path)
if self.use_file_storage:
self.storage = FileStorage(self.path)
else:
global LOCALS
if getattr(LOCALS, 'RAM_STORE', None) is None:
LOCALS.RAM_STORE = RamStorage()
self.storage = LOCALS.RAM_STORE
self.content_field_name, self.schema = self.build_schema(
connections[self.connection_alias].get_unified_index().all_searchfields())
self.parser = QueryParser(self.content_field_name, schema=self.schema)
if new_index is True:
self.index = self.storage.create_index(self.schema)
else:
try:
self.index = self.storage.open_index(schema=self.schema)
except index.EmptyIndexError:
self.index = self.storage.create_index(self.schema)
self.setup_complete = True
def build_schema(self, fields):
schema_fields = {
ID: WHOOSH_ID(stored=True, unique=True),
DJANGO_CT: WHOOSH_ID(stored=True),
DJANGO_ID: WHOOSH_ID(stored=True),
}
# Grab the number of keys that are hard-coded into Haystack.
# We'll use this to (possibly) fail slightly more gracefully later.
initial_key_count = len(schema_fields)
content_field_name = ''
for field_name, field_class in fields.items():
if field_class.is_multivalued:
if field_class.indexed is False:
schema_fields[field_class.index_fieldname] = IDLIST(
stored=True, field_boost=field_class.boost)
else:
schema_fields[field_class.index_fieldname] = KEYWORD(
stored=True, commas=True, scorable=True, field_boost=field_class.boost)
elif field_class.field_type in ['date', 'datetime']:
schema_fields[field_class.index_fieldname] = DATETIME(
stored=field_class.stored, sortable=True)
elif field_class.field_type == 'integer':
schema_fields[field_class.index_fieldname] = NUMERIC(
stored=field_class.stored, numtype=int, field_boost=field_class.boost)
elif field_class.field_type == 'float':
schema_fields[field_class.index_fieldname] = NUMERIC(
stored=field_class.stored, numtype=float, field_boost=field_class.boost)
elif field_class.field_type == 'boolean':
# Field boost isn't supported on BOOLEAN as of 1.8.2.
schema_fields[field_class.index_fieldname] = BOOLEAN(
stored=field_class.stored)
elif field_class.field_type == 'ngram':
schema_fields[field_class.index_fieldname] = NGRAM(
minsize=3, maxsize=15, stored=field_class.stored, field_boost=field_class.boost)
elif field_class.field_type == 'edge_ngram':
schema_fields[field_class.index_fieldname] = NGRAMWORDS(minsize=2, maxsize=15, at='start',
stored=field_class.stored,
field_boost=field_class.boost)
else:
# schema_fields[field_class.index_fieldname] = TEXT(stored=True, analyzer=StemmingAnalyzer(), field_boost=field_class.boost, sortable=True)
schema_fields[field_class.index_fieldname] = TEXT(
stored=True, analyzer=ChineseAnalyzer(), field_boost=field_class.boost, sortable=True)
if field_class.document is True:
content_field_name = field_class.index_fieldname
schema_fields[field_class.index_fieldname].spelling = True
# Fail more gracefully than r
没有合适的资源?快使用搜索试试~ 我知道了~
Django搭建的个人博客网站.zip
共1684个文件
js:636个
css:449个
html:131个
需积分: 5 0 下载量 188 浏览量
2023-09-29
11:39:11
上传
评论
收藏 9.66MB ZIP 举报
温馨提示
Django搭建的个人博客网站
资源推荐
资源详情
资源评论
收起资源包目录
Django搭建的个人博客网站.zip (1684个子文件)
AUTHORS 6KB
mysql.cnf 156B
nginx.conf 462B
.coveragerc 177B
output.462b1613b802.css 227KB
output.462b1613b802.css 227KB
output.00346a12836d.css 227KB
output.d4e81dc4aed1.css 227KB
bootstrap.min.css 118KB
bootstrap.min.css 118KB
bootstrap.min.css 118KB
todc-bootstrap.min.css 104KB
todc-bootstrap.min.css 104KB
todc-bootstrap.min.css 104KB
editormd.css 76KB
editormd.css 76KB
editormd.min.css 60KB
editormd.min.css 60KB
editormd.preview.css 55KB
editormd.preview.css 55KB
style.css 51KB
style.css 51KB
style.css 51KB
editormd.preview.min.css 44KB
editormd.preview.min.css 44KB
output.ad06ae1ec69d.css 41KB
output.c4df68feca24.css 41KB
output.969827b246d3.css 41KB
output.906fd8428237.css 41KB
output.969827b246d3.css 41KB
output.ed58171a7a7d.css 41KB
output.69bf73d5bed0.css 41KB
output.9047818ce612.css 41KB
output.501920cd94f3.css 41KB
output.501920cd94f3.css 41KB
docs.min.css 34KB
docs.min.css 34KB
docs.min.css 34KB
docs.css 27KB
docs.css 27KB
docs.css 27KB
ambiance.css 26KB
select2.css 18KB
select2.css 18KB
select2.css 18KB
responsive.css 18KB
responsive.css 18KB
select2.css 17KB
select2.css 17KB
base.css 16KB
base.css 16KB
select2.min.css 15KB
select2.min.css 15KB
widgets.css 10KB
widgets.css 10KB
forms.css 8KB
forms.css 8KB
autocomplete.css 8KB
autocomplete.css 8KB
codemirror.css 8KB
output.e26b52bc2bf1.css 7KB
output.9c75694ff073.css 7KB
output.929026d0362c.css 7KB
output.19bb07f7eba3.css 7KB
output.295023022c10.css 7KB
output.929026d0362c.css 7KB
output.a052a0a09e00.css 7KB
output.a240de8ba9ba.css 7KB
output.e7c1c03fad03.css 7KB
output.e7c1c03fad03.css 7KB
changelists.css 6KB
changelists.css 6KB
ie.css 5KB
ie.css 5KB
ie.css 5KB
editor-style.css 5KB
editor-style.css 5KB
editor-style.css 5KB
codemirror.min.css 5KB
mdn-like.css 5KB
oauth_style.css 5KB
oauth_style.css 5KB
oauth_style.css 5KB
solarized.css 5KB
rtl.css 5KB
rtl.css 5KB
rtl.css 5KB
tango.css 4KB
tango.css 4KB
tango.css 4KB
fruity.css 4KB
fruity.css 4KB
fruity.css 4KB
native.css 4KB
native.css 4KB
native.css 4KB
pastie.css 4KB
pastie.css 4KB
pastie.css 4KB
murphy.css 4KB
共 1684 条
- 1
- 2
- 3
- 4
- 5
- 6
- 17
资源评论
天天501
- 粉丝: 596
- 资源: 4666
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功