<p>索引管理器</p><p>Indexer 作为索引管理工具,提供了批量索引导入、清空索引、刷新索引队列、日志等各项功能, 导入索引支持数据源包括:csv, json, mysql, sqlite 等,也可以自定义数据源。</p><p>运行脚本工具的 --help 选项可查看内置的帮助和说明,如乱码可在选项后加入 -c gbk 试试。</p><p>$prefix/sdk/php/util/Indexer.php --help</p><p>1. 主要参数和选项</p><p>要使用索引工具,必须先指定的项目名称或配置文件,所有的操作都将是作用于该项目,主要选项如下:</p><p>-p|--project &lt;name|file&gt; 指定项目名称或配置文件路径,参数名可以省略不写, 如果仅指定项目名称,那么将使用 $prefix/sdk/php/app/.ini 文件。</p><p>-c|--charset &lt;gbk|utf-8&gt; 指定当前环境、数据源的字符集,默认情况下, 索引工具输出的字符集为 utf-8,并把数据源字符集视为项目的默认字符集。</p><p>--source &lt;..source..&gt; 用于指定数据源,数据源有以下 2 种情况。</p><p>凡是包含冒号的数据源均视为 SQL 数据源,自动将 --sql 选项的值作为参数传递给数据源;</p><p>其它情况则为文件数据源,自动将 --file 选项的值作为参数传递给数据源对象。</p><p>--flush、--flush-log、--info 是一些功能选项,与 --source 分开使用。</p><p>-d|--db &lt;..name..&gt; 指定要更新的索引数据库名称,默认是名为 db 的库。</p><p>--filter 指定数据过滤器,针对资深用户使用,在提交索引前可以处理一次数据。</p><p>--add-synonym=&lt;raw1:synonym1[,raw2:synonym2]...&gt; 添加同义词。</p><p>--del-synonym=&lt;raw1[:synonym1[,raw2[:synonym2]]]...&gt; 删除同义词。</p><p>--stop-rebuild 停止异常中断的重建任务。</p><p>2. 经典用法示例</p><p>以下是一些经典用法举例:</p><p># 清空 demo 项目的索引数据</p><p>util/Indexer.php --clean demo</p><p># 导入 JSON 数据文件 file.json 到 demo 项目</p><p>util/Indexer.php --source=json demo file.json</p><p># 导入 MySQL 数据库的 dbname.tbl_post 表到 demo 项目中,并且平滑重建</p><p>util/Indexer.php --rebuild --source=mysql://root:pass@localhost/dbname --sql=&quot;SELECT * FROM tbl_post&quot; --project=demo</p><p># 查看 demo 项目在服务端的相关信息</p><p>util/Indexer.php --info -p demo</p><p># 强制刷新 demo 项目的搜索日志</p><p>util/Indexer.php --flush-log --project demo</p><p># 强制停止重建</p><p>util/Indexer.php --stop-rebuild demo</p><p>3. 导入 SQL 数据库</p><p>要导入 SQL 类的数据库,必须使用 --source 指定数据源,视情况用 --sql 选项指定查询语句。 其中数据源的格式如下:</p><p>dbtype://[user[:passwd]@]host/dbname[/table]</p><p>dbtype://dbpath</p><p>dbtype 就是相应的数据源名称,目前支持的有:mysql、sqlite、sqlite3、mysqli、pdo.mysql、pdo.sqlite 。 如果您还需要更多的数据库类型,请参见后面的自定义数据源自行扩充,对于嵌入式的数据库, 仅支持在数据源中设置路径。</p><p>数据源仅仅指定了数据库连接的有关参数,您应当通过 --sql 选项指定查询语句, 查询得到的每行数据就会被转换为关联数组,并作为一条完整的文档数据提交到索引库中。 查询语句中允许使用表连接和 LIMIT, OFFSET 等行为,即便数据量很大,内部会作出相应优化。</p><p>Info: 如果您在数据源中指定了 table,那么可以省略 --sql 选项,系统自动把该表的数据导入索引库。</p><p>相当于指定了这样一条 SQL 语句:SELECT * FROM table</p><p>如果您的数据表过于庞大和复杂,强烈建建议您编写 SQL 语句,仅 SELECT 搜索相关的字段即可, 如果字段名称有变动,请用 AS 修改它。</p><p>用法示例:</p><p># 导入 mysql 数据源</p><p>util/Indexer.php --source=mysql://root@localhost/test --sql=&quot;select * from tbl_post&quot;</p><p># 导入 sqlite 数据源</p><p>util/Indexer.php --source=sqlite:///tmp/test.db --sql=&quot;select * from tbl_post&quot;</p><p>4. 导入 CSV 数据</p><p>要导入 CSV 数据库文件,必须使用 --source=csv 来指定数据源,然后使用 --file 指定数据文件的路径,如果没有指定则自动从标准输入读取数据。</p><p>对于 CSV 文件,要求必须每行一条数据,字段之间用半角的逗号分开。可以在首行指定字段名称列表, 但要求所有字段均必须是项目中的有效字段;如果没有指定字段列表,则自动按照默认的所有字段顺序读取。 这里所指的行是以 \n (ASCII: 0x0a) 换行符界定的。</p><p>Info: 如果您的 CSV 文件字段分割符不是逗号,您可以使用 --csv-delimiter 选项来指定分割符,制表符使用 \t 表示,而如果是 | 这种引起 shell 解析冲突的, 请使用引号将它包起来。</p><p>util/Indexer.php --source=csv --csv-delimiter=&quot;\t&quot; demo # 使用 \t</p><p>util/Indexer.php --source=csv --csv-delimiter=&quot;\\\\&quot; demo # 使用 \ 分割</p><p>5. 导入 JSON 数据</p><p>要导入 JSON 数据库文件,必须使用 --source=json 来指定数据源,然后使用 --file 指定数据文件的路径,如果没有指定则自动从标准输入读取数据。</p><p>对于 JSON 文件,要求必须每行一条数据完整的 JSON 数据记录,将自动被转换为文档添加到索引中。 这里所指的行是以 \n (ASCII: 0x0a) 换行符界定的。</p><p>6. 清空、重建索引</p><p>在批量导入各种数据源时,您可以加入 --clean 选项,该工具就会先清空现有索引数据库。</p><p>Info: 清空数据库可以单独使用,不一定要搭配导入操作。</p><p>由于清空立即生效会导致搜索中断或不可用一段时间,对于线上服务,建议使用 --rebuild 选项实现平滑重建,在导入完成后再将新数据库替换为原数据库。</p><p>7. 自定义数据过滤器</p><p>自从 1.1.1 版本起,在索引工具中引入了过滤器的概念,通过 --filter 选项来指定。 这项功能以便于批量导入数据时,在数据提交到索引前有一次机会可以处理数据,常见的操作有 格式化数据,清除无效的标记标签等。</p><p>内置的过滤器只有一个,就是 debug,它相当于在数据提交前执行一次 print_r 函数, 打印出数据的实际内容,可用于调试。</p><p>我们要求所有自定义过滤器必须实现 XSDataFilter 这个接口,里面需要实现以下方法:</p><p>XSDataFilter::process 字段数据预处理,在此进行数据调整和过滤不相关的内容然后返回数据</p><p>XSDataFilter::processDoc 索引文档处理,在好习惯进行索引相关调整(自 1.3.4 起有效)</p><p>Note: 当过滤器的 process 方法返回 false 时,索引工具不会将此条数据添加到索引库。</p><p>编写好的过滤器必须单独以类名为文件名保存,比如您的过滤器对象名称为 XSXyzFilter,那么 请将代码命名为 XSXyzFilter.php 保存,在索引工具中使用参数 --filter=/paht/to/XSXyzFilter 来指定这个过滤器。</p><p>典型过滤器写法如下,文件保存为 XSXyzFilter.php</p><pre class="brush:php;toolbar:false">classXSXyzFilterimplementsXSDataFilter { publicfunctionprocess($data,$cs) { print_r($data); return$data; } publicfunctionprocessDoc($doc) { //$doc-&gt;addTerm(&#39;subject&#39;,&#39;特殊词&#39;); } }</pre><p>8. 自定义数据源</p><p>目前数据源有两种类型,一种是文件数据源(如 JSON、CSV),另一种是 SQL 数据库源(如 MySQL,SQLite)。</p><p>自定义数据源均要求必须是抽象类 XSDataSource 的子类,建议单独编写相应的类定义文件并放入 $prefix/sdk/php/lib 目录,以便脚本在使用时自动加载。</p><p>数据源对象中包含两个 protected 属性,可以在初始化时使用它们:</p><p>XSDataSource::type 对应命令行中 --source 选项的值</p><p>XSDataSource::arg 则为相应的 --sql 或 --file 选项的值。</p><p>文件数据源</p><p>对于文件数据源,请直接扩展 XSDataSource,对于名称为 Xyz 的数据源,请命名为 XSXyzDataSource 并重载以下方法:</p><p>protected XSDataSource::init 开始读取数据时调用,用于初始化数据源的相关资源。</p><p>protected XSDataSource::deinit 读取数据结束时调用,释放相关资源。</p><p>protected XSDataSource::getDataList 读取一批数据,可以是一条或若干条,组成数组返回,没有更多数据时返回 false 。</p><p>public XSDataSource::getCharset 返回精准的数据源字符集,如果不能确定请返回 false 或不重载。</p><p>数据库数据源</p><p>对于数据库数据源,请直接扩展 XSDatabase,对于名称为 Xyz 的数据源,请命名为 XSDatabaseXyz 并重载以下方法:</p><p>protected XSDatabase::connect 连接数据库,参数是一个数组,包含连接相关的参数(host,user,pass,dbname,table)、数据库路径(path)</p><p>protected XSDatabase::close 关闭数据库连接</p><p>protected XSDatabase::query 执行数据库查询,对于 SELECT 类的操作请将搜索结果以数组方式返回,其它请直接返回 true/false 代表成功/失败</p><p>protected XSDatabase::setUtf8 尝试将数据库输出字符集强制设为 UTF-8 ,如数据库不支持此功能请返回 false 或不重载。</p><p>PDO 数据库数据源</p><p>对于 PDO 扩展的数据源,请直接扩展 XSDatabasePDO,对于名称为 Xyz 的数据源,请命名为 XSDatabasePDO_Xyz 并重载以下方法:</p><p>protected XSDatabasePDO::makeDsn 生成 PDO 连接字符串,参数和 XSDatabase::connect 一样。</p><p>protected XSDatabase::setUtf8 尝试将数据库输出字符集强制设为 UTF-8 ,如数据库不支持此功能请返回 false 或不重载。</p><p>Note: 由于我们使用 parse_url 解析 SQL 数据源连接参数,它并不支持用下划线作 scheme 。 如果要直接使用 PDO 数据源,请把 dbtype 设为 pdo.xxx 而不是 pdo_xxx 。</p><p>9. 同义词管理</p><p>通常每条记录包含&quot;原词(标准词)&quot;和&quot;同义词&quot;两个元素,同义词记录是和当前索引库绑定的,并非和项目绑定。 如果您通过 XSIndex::setDb 修改了当前索引库名,那么您所进行的同义词变动将作用到该库上。</p><p>添加同义词</p><p>通过带参数的选项 --add-synonym 来实现,参数值为单条或多条同义词记录,每条记录之间用冒号(:) 分隔原词和同义词,多条记录之间用逗号分割。您可以对同一个&quot;原词&quot;增加多个不同的&quot;同义词&quot;, 如果库内已存在完全一致的记录,则指令不起作用也不会报错。用法如下:</p><p># 给 search 增加同义词 find</p><pre class="brush:bash;toolbar:false">util/Indexer.phpdemo--add-synonymsearch:find</pre><p># 再给 search 增加另一个同义词 seek</p><pre class="brush:bash;toolbar:false">util/Indexer.phpdemo--add-synonymsearch:seek</pre><p># 给 &quot;搜索&quot; 增加 &quot;检索&quot; &quot;查找&quot; 两个同义词</p><pre class="brush:bash;toolbar:false">util/Indexer.phpdemo-add-synonym搜索:检索,搜索:查找</pre><p># 给 &quot;Hello world&quot; 增加同义词 &quot;你好&quot;,参数含空格请用引号包围</p><pre class="brush:bash;toolbar:false">util/Indexer.phpdemo--add-synonym&quot;Helloworld:你好&quot;</pre><p>删除同义词</p><p>删除同义词作法和添加同义词很相似,只不过采用选项 --del-synonym,同时参数中的同义词可以 省略表示删除该&quot;原词&quot;的所有同义词记录。用法如下:</p><p># 删除 search 的全部同义词、同时删除 &quot;搜索&quot; 的同义词 &quot;检索&quot;</p><pre class="brush:bash;toolbar:false">util/Indexer.phpdemo--del-synonymsearch,搜索:检索</pre><p>浏览全部同义词</p><p>查看同义词列表的功能请参见 Quest 搜索工具</p><p>Tip: 同义词功能是 1.3.0 版本引入的新功能,详情参见同义词专题文档。</p><p>通常原词(标准词)和同义词都必须是独立的词汇,也就是最小的索引单位。但对于纯英文字母原词, 允许用空格连接多个单词,英文字母都会统一转换为小写。</p><p>单个英文原词会同时保存词根同义词记录。如:设置 find 是 search 的同义词,那么检索 searching 也会匹配包含 finding 或 finds 等同根词的结果。</p><p>10. 存取项目自定义词库</p><p>您也可以通过命令行查看和修改项目的自定义词库,具体用法如下:</p><p># 查看 demo 项目的自定义词库</p><pre class="brush:bash;toolbar:false">util/Indexer.phpdemo--custom-dict</pre><p># 将已有自定义词库文件 d.txt 设置为 demo 项目的自定义词库,结合 --file 选项</p><pre class="brush:bash;toolbar:false">util/Indexer.phpdemo--custom-dict--file/path/to/d.txt</pre><p># 清空/删除自定义词库,用 /dev/null</p><pre class="brush:bash;toolbar:false">util/Indexer.phpdemo--custom-dict--file/dev/null</pre><p>Note: 项目自定义词库是 1.3.4 引入的新功能</p>
T:0.007389s,M:260.02 KB
返回顶部 留言