Skip to main content

CloverSearch搜索引擎的Django模块,使用起来超级方便!。版本[0.1.20]更新内容:优化建立索引、搜索性能,测试性能提高10倍以上,但是受限于Python语言的性能,数据量大的时候性能还是不够理想,有待进一步优化。

Project description

CloverSearch全文检索框架

简介

之前试过HayStack+Whoosh的方案,但是配置麻烦,而且对于接口调用的支持也不友好, 看了一下文档看得云里雾里,索性自己实现一个全文检索功能,其实也不复杂。

基本逻辑

  1. 构建索引
    1. 运行创建model索引配置文件
    2. 配置哪些model需要加入索引
    3. 运行创建字段索引配置文件
    4. 配置哪些model的字段需要加入索引
    5. 运行构建索引
  2. 初始化索引
  3. 提交搜索请求
  4. 获取搜索结果

Quick Start

1. 首先在Django项目的环境中安装cloversearch

pip install cloversearch

2. 编辑Djangosetings.py文件:

cloversearch加入INSTALLED_APPS

# 加入INSTALLED_APPS
INSTALLED_APPS = [
    'cloversearch'
]

添加cloversearch的基本配置:
详细配置请看下方的配置说明

CLOVER_SEARCH = {
    # 需要索引的App列表,必填
    'APP_LIST': [''],
    # 存放配置的目录,必填
    'CONFIG_DIR': '',
    # 索引数据保存目录,必填
    'INDEX_DIR': '',
}

3. 扫描model与建立索引

注意!首次使用搜索引擎时以下命令的执行顺序不可以颠倒,一定要创建配置,并且配置了需要加入检索的字段后才可以建立索引。

# 扫描所有model,并且创建model配置
python manage.py scan_models

执行该命令后会在CONFIG_DIR里配置的路径里生成models_config.ini文件,内容类似下面这样:
请在models_config配置文件里设置需要开启索引的model

[app_name]
model1 = true
model2 = true
model3 = false

接下来扫描开启了索引功能的model里包含的字段:

# 扫描所有开启索引功能model里的字段,并且创建field配置
python manage.py scan_fields

执行该命令后会在CONFIG_DIR里配置的路径里生成[app_name]_fields_config.ini文件
目前cloversearch只扫描CharFieldTextField类型的字段
[app_name]对应具体的app名称,文件内容类似下面这样:

[model_name]
field1 = true
field2 = true
field3 = true
field4 = false

配置完成之后就可以执行以下命令建立搜索引擎的索引了,建立索引的时间视数据量大小而定

# 建立索引
python manage.py build_index

4. 搜索接口调用

from cloversearch.query import SearchQuery
result = SearchQuery.query('搜索关键词')

SearchQuery.query()方法返回一个SearchResultSet对象,有关SearchResultSet的简单用法如下:

from cloversearch.query import SearchQuery
result = SearchQuery.query('搜索关键词')
# 返回 SearchResultObject 类型的 list
result_list = result.all
for item in result_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': 用于处理SearchQueryObjectJsonEncoder`
  • 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 Config

import os
BASE_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才可以看到索引构建过程或者搜索详细过程的输出。

import os
LOGGING = {
    '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配置
python manage.py scan_models
# 扫描所有开启索引功能model里的字段,并且创建field配置
python manage.py scan_fields
# 建立索引
python manage.py build_index

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

cloversearch-0.1.20.tar.gz (12.7 kB view details)

Uploaded Source

Built Distribution

cloversearch-0.1.20-py3-none-any.whl (29.5 kB view details)

Uploaded Python 3

File details

Details for the file cloversearch-0.1.20.tar.gz.

File metadata

  • Download URL: cloversearch-0.1.20.tar.gz
  • Upload date:
  • Size: 12.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.13.0 pkginfo/1.5.0.1 requests/2.9.1 setuptools/40.6.3 requests-toolbelt/0.9.1 tqdm/4.31.1 CPython/3.6.7

File hashes

Hashes for cloversearch-0.1.20.tar.gz
Algorithm Hash digest
SHA256 6bfc73c37c089ffc2475aab8fb746083630d1ae834e3cfe8d33bc19210319a05
MD5 58bc74660b17c2b4cc5021fbbfe03e0b
BLAKE2b-256 2879f062b7f005e5360b8530e9efd05dddabe0f082ec46713f18173814d3b2cb

See more details on using hashes here.

File details

Details for the file cloversearch-0.1.20-py3-none-any.whl.

File metadata

  • Download URL: cloversearch-0.1.20-py3-none-any.whl
  • Upload date:
  • Size: 29.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.13.0 pkginfo/1.5.0.1 requests/2.9.1 setuptools/40.6.3 requests-toolbelt/0.9.1 tqdm/4.31.1 CPython/3.6.7

File hashes

Hashes for cloversearch-0.1.20-py3-none-any.whl
Algorithm Hash digest
SHA256 c2f7a2be3da4580cab34fc5f6e2403e0f56f9d7a90558dcc4af52bb18c0ce4ff
MD5 cebbddccf513e79f7a2afc8482c2bba6
BLAKE2b-256 a2bf642d456647be678914217ed2d067843b7241ea07c90e58e447712209722e

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page