# encoding: utf-8
from __future__ import absolute_import, division, print_function, unicode_literals
import json
import os
import re
import shutil
import threading
import warnings
from django.conf import settings
from django.core.exceptions import ImproperlyConfigured
from django.utils 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.
from whoosh import index
from whoosh.analysis import StemmingAnalyzer
from whoosh.fields import ID as WHOOSH_ID
from whoosh.fields import BOOLEAN, DATETIME, IDLIST, KEYWORD, NGRAM, NGRAMWORDS, NUMERIC, Schema, TEXT
from whoosh.filedb.filestore import FileStorage, RamStorage
from whoosh.highlight import highlight as whoosh_highlight
from whoosh.highlight import ContextFragmenter, HtmlFormatter
from whoosh.qparser import QueryParser
from whoosh.searching import ResultsPage
from whoosh.writing import AsyncWriter
from jieba.analyse import ChineseAnalyzer
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=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 relying on the backend to die if no fields
# are found.
if len(schema_fields) <= initial_key_count:
raise SearchBackendError("No fields were found in any search_indexes. Please correct this before attempting to search.")
return (content_field_name, Schema(**schema_fields))
def update(self, index, iterable, commit=True):
if not self.setup_complete:
self.setup()
self.index = self.index.refresh()
writer = AsyncWriter(self.index)
for obj in iterable:
try:
doc = index.full_prepare(obj)
except SkipDocument:
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
本项目是一款基于centos6+python3.6+django2+ansible2.4+celery4.2构建的全面运维管理系统源码,总计包含4874个文件,涵盖1517个JavaScript文件、1137个PNG图像文件、741个SVG图像文件、526个CSS样式文件、224个Less样式文件、215个HTML文件、110个Python脚本文件、63个JSON文件、61个Python编译文件、43个Markdown文件。系统功能包括用户和用户组管理、资产管理、集成Ansible2.4自动化工具、简易堡垒机(支持rdp和vnc连接)、文件上传下载、配置禁用命令清单、操作录像回放、CI/CD流程管理(支持git和svn仓库)、数据库管理(部分功能)、Celery任务编排、知识库及文件共享。
资源推荐
资源详情
资源评论
收起资源包目录
基于centos6+python3.6+django2+ansible2.4+celery4.2的全面运维管理系统设计源码 (2000个子文件)
bootstrap.css 143KB
bootstrap.min.css 118KB
AdminLTE.css 109KB
AdminLTE.min.css 89KB
AdminLTE-without-plugins.css 88KB
AdminLTE-without-plugins.min.css 72KB
editormd.min.css 60KB
ionicons.css 56KB
ionicons.min.css 50KB
asciinema-player.css 50KB
_all-skins.css 47KB
custombox.min.css 41KB
_all-skins.min.css 41KB
font-awesome.css 37KB
jquery-ui.css 35KB
jquery-ui.css 35KB
jquery-ui.css 35KB
jquery-ui.css 35KB
jquery-ui.css 35KB
jquery-ui.css 35KB
jquery-ui.css 34KB
jquery-ui.css 34KB
jquery-ui.css 34KB
jquery-ui.css 34KB
jquery-ui.css 34KB
jquery-ui.css 34KB
jquery-ui.css 34KB
jquery-ui.css 34KB
jquery-ui.css 34KB
jquery-ui.css 34KB
jquery-ui.css 34KB
jquery-ui.css 34KB
jquery-ui.css 34KB
jquery-ui.css 34KB
jquery-ui.css 34KB
xterm.css 34KB
jquery-ui.css 34KB
jquery-ui.css 34KB
jquery-ui.css 34KB
jquery-ui.css 34KB
font-awesome.min.css 30KB
jquery-ui.min.css 30KB
jquery-ui.min.css 29KB
jquery-ui.min.css 29KB
jquery-ui.min.css 29KB
jquery-ui.min.css 29KB
jquery-ui.min.css 29KB
jquery-ui.min.css 29KB
jquery-ui.min.css 29KB
jquery-ui.min.css 29KB
jquery-ui.min.css 29KB
jquery-ui.min.css 29KB
jquery-ui.min.css 29KB
jquery-ui.min.css 29KB
jquery-ui.min.css 29KB
jquery-ui.min.css 29KB
jquery-ui.min.css 29KB
jquery-ui.min.css 29KB
jquery-ui.min.css 29KB
jquery-ui.min.css 29KB
jquery-ui.min.css 29KB
jquery-ui.min.css 29KB
jquery-ui.min.css 29KB
jquery-ui.min.css 29KB
jquery-ui.min.css 29KB
jquery-ui.min.css 29KB
ambiance.css 26KB
bootstrap-theme.css 26KB
bootstrap-theme.min.css 23KB
jquery-confirm.min.css 22KB
_all.css 21KB
theme.css 17KB
select2.css 17KB
theme.css 17KB
theme.css 17KB
theme.css 17KB
theme.css 17KB
theme.css 17KB
theme.css 17KB
theme.css 17KB
theme.css 17KB
theme.css 17KB
theme.css 17KB
theme.css 17KB
theme.css 17KB
theme.css 17KB
theme.css 17KB
theme.css 17KB
theme.css 17KB
theme.css 17KB
theme.css 17KB
theme.css 17KB
theme.css 17KB
theme.css 17KB
theme.css 17KB
theme.css 17KB
theme.css 17KB
AdminLTE-bootstrap-social.css 15KB
modaal.css 15KB
jsplumbtoolkit-defaults.css 15KB
共 2000 条
- 1
- 2
- 3
- 4
- 5
- 6
- 20
资源评论
lsx202406
- 粉丝: 2473
- 资源: 5595
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- (源码)基于Spring Boot和Vue的后台管理系统.zip
- 用于将 Power BI 嵌入到您的应用中的 JavaScript 库 查看文档网站和 Wiki 了解更多信息 .zip
- (源码)基于Arduino、Python和Web技术的太阳能监控数据管理系统.zip
- (源码)基于Arduino的CAN总线传感器与执行器通信系统.zip
- (源码)基于C++的智能电力系统通信协议实现.zip
- 用于 Java 的 JSON-RPC.zip
- 用 JavaScript 重新实现计算机科学.zip
- (源码)基于PythonOpenCVYOLOv5DeepSort的猕猴桃自动计数系统.zip
- 用 JavaScript 编写的贪吃蛇游戏 .zip
- (源码)基于ASP.NET Core的美术课程管理系统.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功