Skip to main content

CloverSearch全文检索框架

简介

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

基本逻辑

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

Quick Start

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

pip install cloversearch

2. 编辑Django的setings.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只扫描CharField和TextField类型的字段
[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': 用于处理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 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

Metadata

Release files for cloversearch 0.1.20

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for cloversearch 0.1.20
File Size Uploaded Provenance Actions
cloversearch-0.1.20.tar.gz 12.7 kB Without provenance Details for cloversearch-0.1.20.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for cloversearch 0.1.20
File Interpreter ABI Platform Actions
cloversearch-0.1.20-py3-none-any.whl Python 3 none any Details for cloversearch-0.1.20-py3-none-any.whl

Total release size: 42.2 kB

Release files / cloversearch-0.1.20.tar.gz

Download URL cloversearch-0.1.20.tar.gz
Size 12.7 kB
Tags Source
SHA-256 checksum
How to use checksums
6bfc73c37c089ffc2475aab8fb746083630d1ae834e3cfe8d33bc19210319a05
BLAKE2b-256 checksum
How to use checksums
2879f062b7f005e5360b8530e9efd05dddabe0f082ec46713f18173814d3b2cb
Upload date
Uploaded using Trusted Publishing?
What is 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

Release files / cloversearch-0.1.20-py3-none-any.whl

Download URL cloversearch-0.1.20-py3-none-any.whl
Size 29.5 kB
Tags Python 3
SHA-256 checksum
How to use checksums
c2f7a2be3da4580cab34fc5f6e2403e0f56f9d7a90558dcc4af52bb18c0ce4ff
BLAKE2b-256 checksum
How to use checksums
a2bf642d456647be678914217ed2d067843b7241ea07c90e58e447712209722e
Upload date
Uploaded using Trusted Publishing?
What is 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

Security for cloversearch 0.1.20

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page