文档说明

索引概述

1. 什么是索引?

索引在 Xunsearch 中泛指用于检索的数据库文件总称。每一次检索数据均为访问和读取 索引文件,每一次更新数据则是对索引文件的修改。

Xunsearch 每个搜索项目的索引数据是分开单独存放的,索引本质上是一系列预设计文件, 内部都是特别设计的 Tree 结构,但这些东西不是这份指南所关注的。假设一个项目的名称 为 demo (即 INI 文件中 project.name 的值),那么它在服务端的索引数据的存储 路径为:

$prefix/data/demo

该目录底下包含 2 个主要索引数据库,分别是

  • db 默认的主索引数据库,各种检索数据均存放在此
  • log_db 搜索日志数据库,用于存放搜索日志相关,用于实现相关搜索、搜索建议、拼音搜索等
2. 如何开始使用索引?

PHP-SDK 中,索引管理由类型为 XSIndex 的对象所维护。在 XS 项目中,通过读取 XS::index 属性来获取索引管理对象,然后展开各种操作,而不是自行创建对象。后面章节中 的相关测试代码如果没有特别编写,其中的 $index 均为通过类似以下的方式获取的索引对象:

require '$prefix/sdk/php/lib/XS.php';
$xs = new XS('demo'); // 建立 XS 对象,项目名称为:demo
$index = $xs->index; // 获取 索引对象

索引的维护包括数据修改/更新、数据删除、添加数据等操作,由后面的篇幅分开详细讲解。

3. 如何更换索引库?

默认使用的索引库名称为 db,对应到服务端的 $prefix/data/$name/db,一般开发时不需要 关注这个本质。但如果您的索引数据库相当大,希望对索引库进行适当的分割,可以自命名新的索引库。 在搜索时可以使用 XSSearch::addDb 进行多库并行搜索。

// 比如把当前索引更新到名称为 db2 的库中
$index->setDb('db2');
 
// 在检索时同时搜索 db, db2 的作法,具体参考搜索的有关章节
...
$search->addDb('db2')->setQuery(...)->search();
4. 索引更新是异步行为

有必要指出的是,出于性能优化设计,所有的索引操作(包含添加、删除、修改文档)均是异步的 行为。也就是说在 PHP-SDK 的相关 API 返回后,只是说明已经将索引变动提交到操作队列中, 而并不是已经立即更新到磁盘上的索引数据库文件。因此,搜索结果将不能立即体现出您的变动。

但请放心,这个时间差我们已经控制在非常合理的范围内,通常是若干秒。

Note: 特别说明,索引清空是同步操作,立即生效。如果确实有必要,您可以以使用 Indexer--flush 选项来强制刷新索引。

$Id$

3条评论!

#100 报告
phpxiebin at 2017-03-03 10:35:04
关于异步数据问题,可以修改为即时同步,处理方式如下:

例如可以将$index->add($doc);改为$index->add($doc)->flushIndex()即可

#88 报告
风见雨下 at 2016-09-07 11:38:25
可以把不同的项目合并么

能不能合并项目或者将索引合并搜索?我想将四张没有关系的表联合搜索出结果,求解啊

#10 报告
Dull at 2012-04-10 00:37:44
索引库指的是单一项目内部的,而非不同项目的
如项目$db = 'demo';
预定义索引库为 $dbs = array('db1','db2','db3','db4','db5');

添加数据可这样操作:
$xs = new XS($db);
$doc = new XSDocument;
$index = $xs->index;
$index->setDb($dbs[(mt_rand(0,4))]);
...

搜索这样操作:
$xs = new XS($db);
$search = $xs->search;
foreach($dbs as $tdb) $search->addDb($tdb);
$total = $search->getDbTotal();

这样子在data目录下会形成这样的数据结构:
data/demo/
          db1/
          db3/
          ...

按照更新日志,从1.1开始会自动分库 因此是否有必要手动分库尚需进一步测试

开始理解有误 以为是不同项目的 感谢hightman

请到论坛 登录 后刷新本页面!