sphinx

一、Introduction

sphinx是一个独立的搜索引擎,为其他应用提供高速、低空间占用、高结果相关度的全文搜索功能。sphinx可以非常容易的与sql数据库和脚本语言集成。

搜索api支持php、python、perl、ruby和java,并且也可以用作mysql存储引擎。

coreseek全文检索服务器2.0是在sphinx基础上开发的全文检索软件,按照GPLv2协议发行。中文版的sphinx。

sphinx的特性,高速建立索引,高性能的搜索,处理海量数据,优秀的相关度算法,支持分布式搜索,可作为mysql存储引擎提供搜索服务,支持布尔、短语、词语相似度等多种检索模式等等。

支持多数操作系统。

二、windows下使用sphinx

一般的搜索中,使用关键字搜索时一般是使用like  ‘%xxx%’,这样查询在数据量大时非常慢,like是全表扫描。

到coreseek官网下载软件包解压。

1.        使用sphinx为要搜索的数据创建全文索引

制作配置文件,在解压包的etc/下,复制一份csft_mysql.conf,改名为sphinx.conf,放到解压包的根目录/下。修改配置文件。

#MySQL数据源配置,详情请查看:http://www.coreseek.cn/products-install/mysql/

#源定义,为eshopphp数据库中的es_goods表为数据源

source goods

{

    type                    = mysql



    sql_host                = localhost

    sql_user                = root

    sql_pass                = 123456

    sql_db                  = eshopphp

    sql_port                = 3306

    sql_query_pre            = SET NAMES utf8

    #主查询,要为哪些数据建索引就使用一条sql语句把这些数据取出来

    #第一个字段一定要求是id

    #为所有的商品的goods_name,goods_desc,attr_value这三个字段创建全文索引

    sql_query                = SELECTa.id,a.goods_name,a.goods_desc,GROUP_CONCAT(b.attr_value) attr_value  FROM es_goods a left join es_goods_attr b ona.id=b.goods_id group by a.id

}



#index定义,一个数据源对应一个index

#定义索引文件

index goods

{

    source          = goods             #对应的source名称

    #生成的索引文件存放的目录\索引文件的名字,不要中文路径,下面最后的goods为索引文件的名字

    path            = D:\002php\shpinx\var\data\goods

    docinfo         = extern

    mlock           = 0

    morphology      = none

    min_word_len    = 1

    html_strip      = 0



    #中文分词配置,中文分词词库文件所在目录,详情请查看:http://www.coreseek.cn/products-install/coreseek_mmseg/

    #charset_dictpath = /usr/local/mmseg3/etc/#BSD、Linux环境下设置,/符号结尾

    #Windows环境下设置,/符号结尾,最好给出绝对路径,例如:C:/usr/local/coreseek/etc/...

    charset_dictpath = D:\002php\shpinx\etc

    #shpinx只支持utf-8

    charset_type     = zh_cn.utf-8

}



#全局index定义

indexer

{

    mem_limit            = 128M

}



#searchd,sphinx服务器配置

searchd

{

    listen              =   9312

    read_timeout        = 5

    max_children        = 30

    max_matches         = 1000

    seamless_rotate     = 0

    preopen_indexes     = 0

    unlink_old          = 1

    #配置以下三个文件存放的绝对路径,目录中不要出现中文

    pid_file =D:\002php\shpinx\var\log\searchd_mysql.pid

    log =D:\002php\shpinx\var\log\searchd_mysql.log

    query_log = D:\002php\shpinx\var\log\query_mysql.log

}

使用sphinx为商品数据生成索引

使用bin/indexer.exe命令。

indexer.exe -c  D:\002php\shpinx\sphinx.conf  goods

2.        安装并启动sphinx服务器

使用bin/searchd.exe命令

searchd.exe -c  D:\002php\shpinx\sphinx.conf  --install

打开windows服务窗口找到sphinx并启动

执行services.msc打开服务窗口。

3.        在项目中使用php代码查询sphinx

先复制sphinx的api目录下的sphinxapi.php文件到项目

然后在关键字搜索的方法中调用sphinx的客户端类。

    //接收要搜索的关键

    $key = I('get.key');

    //搜索sphinx

    require ('./sphinxapi.php');

    $sph = new \SphinxClient();

    $sph->SetServer('localhost', 9312);

    //第二个参数,sphinx中索引的名字默认是*,表示所有的索引

$ret =$sph->Query($key, 'goods');

sphinx的返回结果中会返回符合条件的id,不会返回关于这个商品的具体数据,然后通过数据库取出商品的详细信息。

三、sphinx的实时索引更新

如果整个数据量非常大,以至于难以经常性的重建索引,但是每次新增的记录却相对来说少。比如,一个论坛有100000000000个已经归档的帖子,但是每天只有1000个新帖子。这中情况下使用主索引+增量索引(main+delta)模式来实现近实时的索引更新。

这种方法的基本思路是设置两个数据源和两个索引,对很少更新或根本不更新的数据建立主索引,而对新增文档建立增量索引。在上述例子中,那个量大的已经归档的帖子们放在主索引中,而每天新增的1000个帖子放在新增索引中。增量索引更新的频率可以非常快,而文档可以在出现几分钟内就可以检索到。

比如商城中,后添加的商品在sphinx中无法搜索出来,必须要重新创建索引。如果数据量非常大,有10000000件商品,每天新添加100个商品,每天都要为所有的商品重新索引。

实现步骤

1.        创建一张表

用于保存已经创建好索引的商品的最大id。根据这个id找出哪些商品没有创建索引。每次创建好索引后把最大的id存进去,定期取出新的商品创建新增索引,创建完新的索引再把最大的id更新到这个表。

create tablees_sphinx_id(

         id mediumint unsigned not null default'0' comment '已经创建好索引的最后一件商品的id'

)engine=innodbdefault charset=utf8 comment 'sphinx';

insert intoes_sphinx_id values(0);

2.        修改sphinx配置文件

创建好索引后把已经建好的最后的商品id更新到这个表。

#源定义,为eshopphp数据库中的es_goods表为数据源

source goods

{

    type                    = mysql



    sql_host                = localhost

    sql_user                = root

    sql_pass                = 123456

    sql_db                 = eshopphp

    sql_port                = 3306

    sql_query_pre           = SET NAMES utf8

    #主查询,要为哪些数据建索引就使用一条sql语句把这些数据取出来

    #第一个字段一定要求是id

    #为所有的商品的goods_name,goods_desc,attr_value这三个字段创建全文索引

    sql_query       = SELECT a.id,a.goods_name,a.goods_desc,GROUP_CONCAT(b.attr_value)attr_value  FROM es_goods a left joines_goods_attr b on a.id=b.goods_id group by a.id

    #在创建好索引后最后一个商品id更新到表中

    sql_query_post          = update es_sphinx_id set id= (selectmax(id) from es_goods where is_on_sale='是')

}

关闭sphinx,重新创建商品索引。再启动sphinx服务。

3.        修改配置文件,为后添加的没有创建索引的数据生成一个增量索引

在配置文件中为增量索引创建数据源和索引文件的配置

#后添加的还没有索引的数据的数据源

source goods_new

{

    type                    = mysql

    sql_host                = localhost

    sql_user                = root

    sql_pass                = 123456

    sql_db                  = eshopphp

    sql_port                = 3306

    sql_query_pre           = SET NAMES utf8

    #取出后添加的还没有建索引的商品

    sql_query               = SELECTa.id,a.goods_name,a.goods_desc,GROUP_CONCAT(b.attr_value) attr_value  FROM es_goods a left join es_goods_attr b ona.id=b.goods_id where a.is_on_sale='是' and a.id > (select id from es_sphinx_id) group by a.id

    #在创建好索引后最后一个商品id更新到表中

    sql_query_post          = update es_sphinx_id set id= (selectmax(id) from es_goods where is_on_sale='是')

}



#定义新创建的数据源的索引文件

index goods_new

{

    source          = goods_new             #对应的source名称

    #生成的索引文件存放的目录\索引文件的名字,不要中文路径,下面最后的goods为索引文件的名字

    path            =D:\002php\shpinx\var\data\goods_new

    docinfo         = extern

    mlock           = 0

    morphology      = none

    min_word_len    = 1

    html_strip      = 0



    #中文分词配置,中文分词词库文件所在目录,详情请查看:http://www.coreseek.cn/products-install/coreseek_mmseg/

    #charset_dictpath = /usr/local/mmseg3/etc/#BSD、Linux环境下设置,/符号结尾

    #Windows环境下设置,/符号结尾,最好给出绝对路径,例如:C:/usr/local/coreseek/etc/...

    charset_dictpath = D:\002php\shpinx\etc

    #shpinx只支持utf-8

    charset_type     = zh_cn.utf-8

}

4.        编写脚本处理增量索引

先为增量索引生成索引文件;把新生成的增量的索引文件合并到主索引文件。

windows系统是bat脚本,*.bat。

linux系统的是shell脚本,只要有可执行的权限就可以执行。

比如在项目的根目录下创建updateNewSphinxGoods.bat

D:\002php\shpinx\bin\indexer.exe  -c D:\002php\shpinx\sphinx.conf goods_new

D:\002php\shpinx\bin\indexer.exe  -c D:\002php\shpinx\sphinx.conf --merge  goods  goods_new --rotate

--rotate是为了便于在sphinx服务器运行期间执行合并的命令,否则goods被锁无法执行。

双击脚本执行。为了便于关于观察执行过程和结果,也可以拖到cmd黑窗口执行。

添加了新的商品之后只要执行这个脚本就可以在sphinx中搜索到了。但是每次都手动执行这个脚本太麻烦了,可以配置这个脚本每隔一段时间自动执行一次。

5.        配置脚本自动执行

如果是windows系统,windows—>管理工具--> 任务计划程序-- >创建基本任务,创建完成后在右键这个任务,选择属性,点击触发器,新建,设置为一次,重复任务间隔为5分钟,持续时间为无限期。

如果是linux系统,配置crond进程。

四、修改数据库数据时更新sphinx

当修改了数据库中的数据时,sphinx中已经生成的索引并没有更新,所以使用修改前的关键字还是能搜索出可能不符合条件的商品,这就需要在修改商品时把sphinx中的索引也一起更新。

思路是,只能为修改了的商品重新创建索引并合并到主索引上,在合并之前先删除原索引。

1.        在创建索引时必须找出该修改了的数据。

修改商品表添加一个字段,is_updated,默认值是0,一旦被修改了就设置为1。然后定期让sphinx把is_updated=1的重新创建索引。

is_updated  tinyint  unsigned  not  null  default '0'  comment  '是否被修改',

然后,修改商品模型,当修改商品时,将这个字段更新为1。

2.        修改sphinx的配置文件,为修改的商品重建索引

#后添加的还没有索引的数据或者修改过的商品的数据源

source goods_new

{

    type                    = mysql

    sql_host                = localhost

    sql_user                = root

    sql_pass                = 123456

    sql_db                  = eshopphp

    sql_port                = 3306

    sql_query_pre           = SET NAMES utf8

    #取出后添加的还没有建索引的商品

    sql_query               = SELECTa.id,a.goods_name,a.goods_desc,GROUP_CONCAT(b.attr_value) attr_value  FROM es_goods a left join es_goods_attr b ona.id=b.goods_id where a.is_on_sale='是' and (a.id > (select id from es_sphinx_id) or a.is_updated=1)group by a.id

    #在创建好索引后最后一个商品id更新到表中

    sql_query_post          = update es_sphinx_id set id= (selectmax(id) from es_goods where is_on_sale='是')

   

}

3.        修改搜索的php代码让sphinx先过滤掉被标记为修改的,只放行is_updated为0的

    //过滤掉被标记为修改的

    $sph->SetFilter('is_updated', array(0);

4.        然后在sphinx中定义is_updated为一个属性

首先要取出这个字段,然后才可定义为一个属性。同时将获取is_updated段时将这个字段固定为0。

主索引和增量索引都要添加这个属性,否则在merge主索引和增量索引时将失败。

#########################主索引的数据源与索引配置#######################

#源定义,为eshopphp数据库中的es_goods表为数据源

source goods

{

    type                    = mysql



    sql_host                = localhost

    sql_user                = root

    sql_pass                = 123456

    sql_db                  = eshopphp

    sql_port                = 3306

    sql_query_pre           = SET NAMES utf8

    #主查询,要为哪些数据建索引就使用一条sql语句把这些数据取出来

    #第一个字段一定要求是id

    #为所有的商品的goods_name,goods_desc,attr_value这三个字段创建全文索引

   sql_query               = SELECTa.id,0 is_updated,a.goods_name,a.goods_desc,GROUP_CONCAT(b.attr_value)attr_value  FROM es_goods a left joines_goods_attr b on a.id=b.goods_id where a.is_on_sale='是' group by a.id

    #在创建好索引后最后一个商品id更新到表中

    sql_query_post          = update es_sphinx_id set id= (selectmax(id) from es_goods where is_on_sale='是')



    #把一个字段的值定义为一个属性,属性可以用来过滤、排序

    sql_attr_uint           = is_updated

}



#后添加的还没有索引的数据或者修改过的商品的数据源

source goods_new

{

    type                    = mysql

    sql_host                = localhost

    sql_user                = root

    sql_pass                = 123456

    sql_db                  = eshopphp

    sql_port                = 3306

    sql_query_pre           = SET NAMES utf8

    #取出后添加的还没有建索引的商品

   sql_query               = SELECTa.id,0 is_updated,a.goods_name,a.goods_desc,GROUP_CONCAT(b.attr_value)attr_value  FROM es_goods a left joines_goods_attr b on a.id=b.goods_id where a.is_on_sale='是' and (a.id > (select id from es_sphinx_id) or a.is_updated=1)group by a.id

    #在创建好索引后最后一个商品id更新到表中

    sql_query_post          = update es_sphinx_id set id= (selectmax(id) from es_goods where is_on_sale='是')

    #把一个字段的值定义为一个属性,属性可以用来过滤、排序

    sql_attr_uint           = is_updated

}

由于修改了配置文件,所以要重建索引。

D:\002php\shpinx\bin>indexer.exe  -c D:\002php\shpinx\sphinx.conf goods --rotate

5.        然后,在商品模型中,修改一件商品后要把sphinx中这件商品的is_updated属性设置成1。

//设置sphinx中的这条记录的is_updated属性为1

//搜索sphinx

require('./sphinxapi.php');

$sph = new\SphinxClient();

$sph->SetServer('localhost',9312);

//把id=$id这件商品的is_updated属性更新为1

$sph->UpdateAttributes('goods',array('is_updated'),array($id=>array(1)));

6.        删除旧的索引

旧的索引仍然在sphinx的索引文件中,应该定期的把is_updated=1的删掉。删除旧的索引时需要使用indexer.exe   --merge dst  src  --merge-dst-range  [attr] [min]  [max]  [attr] [min]  [max]命令。这个命令的意思是合并dst索引和src索引,在合并前先过滤dst索引中属性值在min和max(包含max)之间的索引,这个过滤条件可以设置多个。由于必须需要两个索引合并才能实现对dst索引的过滤,也就是案例中对goods索引的过滤,以实现删除is_updated值为1的旧索引。所以,创建要删除的索引的数据源和索引配置 goods_del。为了保证合并时不报错,goods_new索引文件的字段要和goods的保持一致。创建goods_del的数据源和索引配置时需复制goods的。配置时将is_updated固定为1,以便合并后能够将要删除的索引在goods主索引中标记出,即其is_updated为1。由于- -merge-dst-range和- -merge的执行可能是异步的。为了保证过滤的成功,再合并goods_new索引时进行过滤。

#########################要删除的商品的数据源与索引配置#######################

#要删除的商品的数据源

source goods_del

{

    type                    = mysql

    sql_host                = localhost

    sql_user                = root

    sql_pass                = 123456

    sql_db                  = eshopphp

    sql_port                = 3306

    sql_query_pre           = SET NAMES utf8

    #取出后添加的还没有建索引的商品

    sql_query               = SELECT a.id,1 is_updated,a.goods_name,a.goods_desc,GROUP_CONCAT(b.attr_value)attr_value  FROM es_goods a left joines_goods_attr b on a.id=b.goods_id where a.is_on_sale='是' and a.is_updated=1 group by a.id

   

    #把一个字段的值定义为一个属性,属性可以用来过滤、排序

    sql_attr_uint           = is_updated

}



#定义新创建的数据源的索引文件

index goods_del

{

    source          = goods_del             #对应的source名称

    #生成的索引文件存放的目录\索引文件的名字,不要中文路径,下面最后的goods为索引文件的名字

    path            =D:\002php\shpinx\var\data\goods_del

    docinfo         = extern

    mlock           = 0

    morphology      = none

    min_word_len    = 1

    html_strip      = 0



    #中文分词配置,中文分词词库文件所在目录,详情请查看:http:src="__PUBLIC__/Home/images/www.coreseek.cn/products-install/coreseek_mmseg/

    #charset_dictpath = /usr/local/mmseg3/etc/#BSD、Linux环境下设置,/符号结尾

    #Windows环境下设置,/符号结尾,最好给出绝对路径,例如:C:/usr/local/coreseek/etc/...

    charset_dictpath = D:\002php\shpinx\etc

    #shpinx只支持utf-8

    charset_type     = zh_cn.utf-8

}

7.        然后修改脚本文件,加入合并时的过滤条件

::--merge-dst-range表示在合并时过滤,但是合并时未必已经将is_updated为1的商品合并到goods索引主表中

::所以可能是先过滤了然后合并的,这导致没有将is_updated为1的商品索引从goods索引中过滤掉,为了妥善

::分开执行,先将要过滤的商品索引一起合并到goods主索引,然后在后面合并goods_new时做过滤,删除is_updated为1的索引

::合并时只保存is_updated=0其他的属性值的索引都过滤掉

D:\002php\shpinx\bin\indexer.exe  -c D:\002php\shpinx\sphinx.conf goods_del  --rotate

D:\002php\shpinx\bin\indexer.exe  -c D:\002php\shpinx\sphinx.conf --merge  goods  goods_del --rotate

D:\002php\shpinx\bin\indexer.exe  -c  D:\002php\shpinx\sphinx.conf  goods_new --rotate

D:\002php\shpinx\bin\indexer.exe  -c D:\002php\shpinx\sphinx.conf --merge  goods  goods_new --merge-dst-range is_updated  00  --rotate

由于sphinx的脚本文件的执行是在内存中执行,又在磁盘中执行的,所以,这个执行的结果需要根据实际生产环境中服务器的运行情况,等待一定时间才能见效,并不会执行了代码就立即生效,因为后台可能在做这个脚本的执行中的数据上的传输与存储。

本文档介绍Sphinx4在Windows下的中文训练过程及注意事项,与本文档配套的是我自己的训练实例bergtrain用到的软件。 本文档编写日期 2013-04-23 1、为什么要训练? sphinx4目前的版本中仅提供了英文等语音识别库。中文的库是PTM或semi类型的,在java版sphinx中无法使用。 2、Sphinx的训练指哪些内容? 在Sphinx中有语言模型、声学模型等概念,如果你不想了解这些,请参考以下内容: a1、中文每个字的标准发音已经有一个较为全面的文件进行了标注 这个文件就是zh_broadcastnews_utf8.dic(下称这类文件为发音字典),在sphinx网站上可以下载,我们也包含了它。 下面是该文件的片断,它用类似拼音的方式标注了每个字或词的发音。 昌 ch ang 昌北 ch ang b ei 昌必 ch ang b i 昌都 ch ang d u 昌赫 ch ang h e a2、需要告诉sphinx我们经常使用的字、词是哪些,它们出现的频率如何 由于开放式语音识别尚难实现,所以sphinx实际上只能较好的处理相对小的语言集合。 因此,针对特定的领域,告诉sphinx该领域的词汇各词出现的频率将极大提高识别率。 a3、需要告诉sphinx每个字、词的真正读音 发音字典告诉sphinx每个字的标准读音,但面对的说话人往往不会以标准读音来朗读。 因此sphinx需要学习说话人的“口音”。 如果训练时的读者发音比较标准,则sphinx能“举一反三”,识别其他不那么标准的读者的语音。 推荐的做法是训练一些典型的口音:标准男、女声,童音,最后再考虑特定用户的口音。 3、如何准备训练内容所需的原料? 需要准备两大内容:1)文本语料文件,2)语料录音文件。 文本语料文件给出2.a2中需要的内容,在bergtrain的etc文件下的berginput.txt文件就是一个预料文件。 它以行为单位,给出了150个中文句子。 语料录音文件是根据文本语料文件,朗读它的每行/句话,保存到每一个语音文件即可。 语料文件中的语句应该尽量选择领域相关的,在覆盖领域内名词的前提下,覆盖尽可能多的通用词汇。 4、训练环境及注意事项 本文的训练软硬件如下: 硬件:T60P笔记本,机器自带录音设备;操作系统为Win7 32位。 软件:Sphinx cmuclmtk-0.7-win32.zip pocketsphinx-0.8-win32.zip sphinxbase-0.8-win32.zip sphinxtrain-1.0.8-win32.zip sphinx4-1.0beta6-bin.zip,用于编写java版的识别软件所需的库 脚本执行软件 ActivePerl-5.16.3.1603-MSWin32-x86-296746.msi ActivePython-2.7.2.5-win32-x86.msi 录音处理软件 audacity-win-2.0.3rc1.zip,可进行录音声音文件处理(如降噪),免费软件 FairStars.zip,可进行批量录音(V3.5绿色版) 文本编辑软件UltraEdit,UltraEdit-32.rar绿色版 注意: 文件格式 语料文件必须使用UltraEdit进行编辑, 在编辑后,使用 文件-转换-ASCII转UTF-8(UNICODE编辑),指定文件中的中文使用utf8编码。 在保存前,设置格式如下: 换行符:UNIX终束符 - LF 指定文件中的回车/换行符为编码0A的换行符 格式:UTF-8 - 无BOM 每个文件的末尾必须有一个回车! 这个回车将在保存时被替换为编码0A的换行符,训练脚本需要这个符号来确认文件的结束。 录音文件 如果你不希望去编辑训练中的配置文件,则在使用FairStars录音时作如下设定: 进入菜单对话框 选项-显示录音选项-编码-WMA, 设定:采样率(16000Hz)、通道(单声道)、比特率(16Kbps) 5、训练步骤 下面逐步从零开始进行训练 5.1 软件环境的安装 将本文档所在的文件夹解压或拷贝到d:\,即本文档路径是d:\sphinxtrain\Sphinx中文训练教程.txt 1)点击安装ActivePerl-5.16.3.1603-MSWin32-x86-296746.msiActivePython-2.7.2.5-win32-x86.msi; 2)解压Sphinx中除sphinx4-1.0beta6-bin.zip外的压缩文件到d:\sphinxtrain下
### Sphinx 的双用途:搜索引擎与文档生成工具 Sphinx 是一个多用途的工具,既可以用作搜索引擎,也可以用作 Python 项目的文档生成工具。以下是关于其两种用途的具体使用说明。 #### 作为搜索引擎的 Sphinx 使用说明 当 Sphinx 被用作搜索引擎时,它主要用于全文搜索。以下是如何配置使用 Sphinx 进行搜索的步骤: 1. **配置 `charset_table`** 在 `sphinx.conf` 配置文件中,需要添加字符集映射表 `charset_table`,以支持特定字符的搜索[^1]。例如: ```conf charset_table = U+00, U+FF, U+AA ``` 2. **创建索引** 使用命令重新生成索引文件,确保新的配置生效。执行以下命令可以完成索引的重建: ```bash /usr/local/sphinx/bin/build_index.sh ``` 3. **测试搜索功能** 完成上述步骤后,可以尝试使用特殊字符(如 `â`)进行搜索。如果配置正确,将能够返回预期的结果[^1]。 #### 作为文档生成工具的 Sphinx 使用说明 Sphinx 在作为文档生成工具时,主要用于 Python 项目的技术文档生成。以下是其基本配置使用方法: 1. **扩展配置** 在 `conf.py` 文件中,通过修改 `extensions` 列表来启用所需的扩展模块。例如,添加以下内容可以启用自动文档生成代码查看功能[^2]: ```python extensions = [ 'sphinx.ext.autodoc', # 自动生成文档 'sphinx.ext.napoleon', # 支持 Google NumPy 风格的 docstring 'sphinx.ext.viewcode' # 查看源代码链接 ] ``` 2. **生成文档** 使用以下命令生成 HTML 格式的文档: ```bash make html ``` 生成的文档将存储在 `_build/html` 目录下。 3. **自定义样式** 如果需要进一步定制文档样式,可以通过修改 `theme` 或添加自定义 CSS 文件实现。例如: ```python html_theme = 'alabaster' ``` #### Sphinx 的核心特点 - **搜索引擎模式** Sphinx 搜索引擎擅长处理大规模文本数据的快速检索,适用于需要高性能搜索的应用场景。 - **文档生成模式** Sphinx 文档生成工具支持多种输出格式(HTML、PDF 等),并且可以通过扩展插件增强功能[^2]。 ```python # 示例:从 Python 代码生成文档 def example_function(arg1, arg2): """ 示例函数的文档字符串 Args: arg1 (str): 参数一的描述 arg2 (int): 参数二的描述 Returns: bool: 返回值的描述 """ return True ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值