Package: cloversearch
CloverSearch全文检索框架简介之前试过HayStack+Whoosh的方案，但是配置麻烦，而且对于接口调用的支持也不友好，
看了一下文档看得云里雾里，索性自己实现一个全文检索功能，其实也不复杂。基本逻辑构建索引运行创建model索引配置文件配置哪些model需要加入索引运行创建字段索引配置文件配置哪些model的字段需要加入索引运行构建索引初始化索引提交搜索请求获取搜索结果Quick Start1. 首先在Django项目的环境中安装cloversearchpipinstallcloversearch2. 编辑Django的setings.py文件：将cloversearch加入INSTALLED_APPS# 加入INSTALLED_APPSINSTALLED_APPS=['cloversearch']添加cloversearch的基本配置：详细配置请看下方的配置说明CLOVER_SEARCH={# 需要索引的App列表，必填'APP_LIST':[''],# 存放配置的目录，必填'CONFIG_DIR':'',# 索引数据保存目录，必填'INDEX_DIR':'',}3. 扫描model与建立索引注意！首次使用搜索引擎时以下命令的执行顺序不可以颠倒，一定要创建配置，并且配置了需要加入检索的字段后才可以建立索引。# 扫描所有model，并且创建model配置pythonmanage.pyscan_models执行该命令后会在CONFIG_DIR里配置的路径里生成models_config.ini文件，内容类似下面这样：请在models_config配置文件里设置需要开启索引的model[app_name]model1=truemodel2=truemodel3=false接下来扫描开启了索引功能的model里包含的字段：# 扫描所有开启索引功能model里的字段，并且创建field配置pythonmanage.pyscan_fields执行该命令后会在CONFIG_DIR里配置的路径里生成[app_name]_fields_config.ini文件目前cloversearch只扫描CharField和TextField类型的字段[app_name]对应具体的app名称，文件内容类似下面这样：[model_name]field1=truefield2=truefield3=truefield4=false配置完成之后就可以执行以下命令建立搜索引擎的索引了，建立索引的时间视数据量大小而定# 建立索引pythonmanage.pybuild_index4. 搜索接口调用fromcloversearch.queryimportSearchQueryresult=SearchQuery.query('搜索关键词')SearchQuery.query()方法返回一个SearchResultSet对象，有关SearchResultSet的简单用法如下：fromcloversearch.queryimportSearchQueryresult=SearchQuery.query('搜索关键词')# 返回 SearchResultObject 类型的 listresult_list=result.allforiteminresult_list:# 输出序列化的搜索结果对象print(item.__dict__)文件结构配置文件models_index_config.ini: model索引配置文件fields_index_config.ini: 字段索引配置文件search: 检索框架目录index: 索引数据目录{ModelName}/{PrimaryKey}: 索引数据clean_data.json: 经过字符过滤后的数据keywords.json: 关键词数据代码结构config.py: 框架配置管理器，用于解析Django配置encoder.py': 用于处理SearchQueryObject的JsonEncoder`index_builder.py: 索引构建相关create_model_config(): 创建model索引配置文件create_field_config(): 创建字段索引配置文件build(): 构建索引indexes.py: 索引操作相关class Index: 索引类，一个Index对应的就是数据库表里的一行class IndexManager: 用于关于索引的类，单例模式processer.py: 文本处理word_segment(): 分词处理character_filter(): 字符过滤器query.py: 搜索请求处理class SearchQueryObject: 搜索结果对象class SearchQuerySet: 搜索结果集class SearchQuery: 搜索处理核心类Django配置CloverSearch ConfigimportosBASE_DIR=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))CLOVER_SEARCH={# 需要索引的App列表，必填'APP_LIST':[''],# 存放配置的目录，必填'CONFIG_DIR':os.path.join(BASE_DIR,'static','search','config'),# 索引数据保存目录，必填'INDEX_DIR':os.path.join(BASE_DIR,'static','search','index'),# Logger名称'LOGGER_NAME':'console',# 文件默认编码'DEFAULT_FILE_ENCODING':'utf-8',# 默认的model索引配置 (str)'DEFAULT_MODEL_INDEX_ENABLED_STATE':'true',# 默认的字段索引配置 (str)'DEFAULT_FIELD_INDEX_ENABLED_STATE':'true',# Model索引配置文件名'MODEL_INDEX_CONFIG_FILENAME':'models_config.ini',# 字段索引配置文件名后缀，配置需要搜索引擎索引指定model的哪些字段'FIELD_CONFIG_FILENAME_SUFFIX':'_fields_config.ini',# 支持的数据库字段类型'SUPPORT_FIELDS_TYPE':['CharField','TextField']}Logging 日志配置注意：配置了名为console的logger才可以看到索引构建过程或者搜索详细过程的输出。importosLOGGING={'version':1,'disable_existing_loggers':True,'formatters':{'standard':{'format':'%(asctime)s[%(name)s:%(lineno)d] [%(module)s:%(funcName)s] [%(levelname)s]%(message)s'}# 日志格式},'filters':{},'handlers':{'console':{'level':'DEBUG','class':'logging.StreamHandler','formatter':'standard'},},'loggers':{'console':{'handlers':['console'],'level':'DEBUG','propagate':True},}}manage.py 命令注意！首次使用搜索引擎时顺序不可以颠倒，一定要创建配置，并且配置了需要加入检索的字段后才可以建立索引。# 扫描所有model，并且创建model配置pythonmanage.pyscan_models# 扫描所有开启索引功能model里的字段，并且创建field配置pythonmanage.pyscan_fields# 建立索引pythonmanage.pybuild_index