xunsearch增量索引改进版

最近测试了xunserach全文索引程序。xunsearch只有LINUX版,所以想用windows服务器请使用其它全文索引程序。
xunsearch本身不像coreseek那样自带增量索引的功能,所以很多从coreseek转过来的朋友很是不习惯。不过xunsearch拥有很
多的API和案例,使用这些程序很容易做出自己的增量索引脚本,只需要把这些脚本添加到LINUX服务器任务里就可以实现增量索引了。

下面是实现增量索引的PHP程序,修改好账号密码,索引sql语句后把这个文件添加到crontab任务里就可以。

?





1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

<?php

/**

 * 索引实时更新管理器

 * 判断标准:

 * 添加:pass_state=1 && create_time>

   

文件记录值

 * 修改:pass_state=1 && edit_time> 文件记录值

 * 删除:status =0  如果有del_time也可以通过上面的方法判断,我这里没有

 * 文件记录值:上次更新索引时的时间

 * 调用方法:

 * 正常调用:jishubu.net.php

 * 不开启日志:jishubu.net.php?log=no

 * 删除日志的说明如下:

 * 如果你是通过我这样记录已删除id的方式,并且非物理删除,并且开启了日志功能,第一次调用最好先在浏览器执行jishubu.net.php?first=yes,不然如果删除数据较多,生成的日志文件较多,浪费空间。

 * 其他:然后把文件放到crontab中,每天,小时,或分执行一次就行了。请根据自己项目情况改进。

 * @author www.jishubu.net on wish 2012.11.30 改进

 */

error_reporting(E_ALL ^ E_NOTICE);

define(‘APP_PATH‘,dirname(__FILE__));

$prefix
= ‘/usr/local/xunsearch‘;

$element
= "$prefix/sdk/php/app/mfnews.ini";  

require_once
"$prefix/sdk/php/lib/XS.php";

   

$first
= (trim($_GET[‘first‘])==‘yes‘) ? true : false;

$log = (trim($_GET[‘log‘])==‘no‘) ? false : true;

   

$xs = new XS($element); // 建立 XS 对象

$index
= $xs->index; // 获取 索引对象

$doc = new XSDocument;  // 创建文档对象

   

//读取上次更新索引时间

$last_index_time
= @file_get_contents(APP_PATH.‘/last_index_time.txt‘);

$last_index_time
= $last_index_time
? $last_index_time
: time(); //这里也可以在last_index_time.txt文件中加个初始值

//删除过的id列表,如果字段有删除时间字段则不需要记录,如果是物理删除,需要记录删除日志,否则无法知道哪些文件曾被删除

$last_del_id
= @file_get_contents(APP_PATH.‘/last_del_id.txt‘);

   

$link
= mysql_connect(‘localhost:3306‘, ‘root‘, ‘123456‘) or
exit(mysql_error());

mysql_select_db(‘phpcms‘, $link) or
exit(mysql_error());

mysql_query("SET NAMES utf8");

   

//查询总数据量,并分批更新

$sql = "select count(*) as zongshu from phpcms_news,phpcms_news_data where phpcms_news.id=phpcms_news_data.id and phpcms_news.status=99 and phpcms_news.islink=0 and (phpcms_news.inputtime > {$last_index_time} or phpcms_news.updatetime > {$last_index_time})";

$zongshu
= mysql_query($sql) or
exit(mysql_error());

   

while($row
= mysql_fetch_array($zongshu, MYSQL_ASSOC)){

    $zx[]=$row;

    }

   

$n=0;

$i = 1; $count=1; $add_total
= 0; $edit_total=0;$addArray=array();$editArray=array();

//添加分批查询避免查询出过多的数据使PHP报错

do{

      $index->openBuffer(); // 开启缓冲区

        //增加,修改索引

        $sql
= "select inch_cms_news.id as id,title,url,inputtime,updatetime,phpcms_news_data.content as content from phpcms_news,phpcms_news_data where phpcms_news.id=phpcms_news_data.id and phpcms_news.status=99 and phpcms_news.islink=0 and (phpcms_news.inputtime > {$last_index_time} or phpcms_news.updatetime > {$last_index_time}) limit $n,100";

        $res
= mysql_query($sql) or
exit(mysql_error());

        $restult
= array();

           

        while($row
= mysql_fetch_array($res, MYSQL_ASSOC)){

            $row[‘title‘] = preg_replace(‘/ |"/‘,‘‘,strip_tags($row[‘title‘]));

            $row[‘content‘] = preg_replace(‘/ |"/‘,‘‘,strip_tags($row[‘content‘]));

            $edit_time
= $row[‘updatetime‘]; $create_time
= $row[‘inputtime‘];

            unset($row[‘updatetime‘]);

            if($edit_time
== $create_time){

                $add_total++;

                $addArray[] = $row;

            } else
{

                $edit_total++;

                $editArray[] = $row;

            }

            $doc->setFields($row);

            $index->update($doc);

            $i++;

            //如果回收站回收的数据,然后从已删除记录中,清除该id

            if(strpos($last_del_id, ‘,‘.$row[‘id‘].‘,‘)!==false){

                $last_del_id
= str_replace($row[‘id‘].‘,‘, ‘‘, $last_del_id);

            }

        }

  $n=$n+100;

  $index->closeBuffer(); // 关闭缓冲区

  }while($n<=$zx[‘0‘][‘zongshu‘]);

     

     

$index->openBuffer(); // 开启缓冲区

   

   

   

//删除索引

$sql = "SELECT phpcms_news.id as id,title,url,inputtime,phpcms_news_data.content as content FROM phpcms_news,phpcms_news_data where phpcms_news.id=phpcms_news_data.id and phpcms_news.status!=99 and phpcms_news.islink=0";

$res = mysql_query($sql) or
exit(mysql_error());

$del_total
= 0; $ids
= ‘‘; $delArray
= array();

while($row
= mysql_fetch_array($res, MYSQL_ASSOC)){

    if(strpos($last_del_id, ‘,‘.$row[‘id‘].‘,‘)===false){

        $ids
.= $row[‘id‘].‘,‘;

        $delArray[] = $row;

        $del_total++;

    }

}

if($ids) {

    $index->del(array(trim($ids,‘,‘)));

    $last_del_id
= $last_del_id
? $last_del_id.$ids
: ‘,‘.$ids;

}

   

$index->closeBuffer(); // 关闭缓冲区

   

$total
= $add_total
+ $edit_total
+ $del_total;

if($total){

   

    //记录索引更新时间

    @file_put_contents(APP_PATH.‘/last_index_time.txt‘, time());

    @file_put_contents(APP_PATH.‘/last_del_id.txt‘, $last_del_id);

   

    //记录日志

    if($log){

        $currdate
= date(‘Y-m-d H:i:s‘,time());

        if(!$first) @file_put_contents(‘/tmp/myindex_log.txt‘, "\[email protected]@@@@@@@@@@@@@@@@@@@@ {$currdate} 本次更新{$total}条记录,详情如下:@@@@@@@@@@@@@@@@@@@@@@\n\n", FILE_APPEND);

        if($add_total) addMyIndexLog(‘add‘, $add_total, $addArray);

        if($edit_total) addMyIndexLog(‘update‘, $edit_total, $editArray);

        if($del_total&&!$first) addMyIndexLog(‘delete‘, $del_total, $delArray);

    }

}

   

function
addMyIndexLog($logtype, $logtatal, $logdata, $prefix=‘‘)

{

    @file_put_contents(‘/tmp/myindex_log.txt‘, $prefix.date(‘Y-m-d H:i:s‘,time()).‘ ‘.$logtype.‘ index num : ‘.$logtatal.‘ ‘.str_repeat(‘*‘, 50)."\n".print_r($logdata, true) , FILE_APPEND);

}

   

mysql_free_result($res);

mysql_close($link);

if($total) $index->flushIndex();

?>

程序保存文件为jishubu.net.php并在同一目录下新建last_index_time.txtlast_del_id.txt文件。

我添加的任务是每小时执行两次更新索引如下:

2,32 * * * * /usr/local/php/bin/php
/web/jishubu.net.php

时间: 2024-10-08 17:49:18

xunsearch增量索引改进版的相关文章

sphinx续5-主索引增量索引和实时索引

原文件地址:http://blog.itpub.net/29806344/viewspace-1400942/ 在数据库数据非常庞大的时候,而且实时有新的数据插入,如果我们不更新索引,新的数据就search不到,全部重新建立索引又很消耗资源,在这种情况下我们就需要使用“主索引+增量索引”的思路来实现实时更新的功能. 因为这时我们有了主索引和增量索引,主索引只需在每天凌晨更新,而增量索引的更新频率设置的很短,这样用户在搜索的时候,可以同时在这两个索引里查找. 首先创建一个计数器: 1.先在mysq

SOLR增量索引--删除业务、定时增量索引

Ok,我又来写SOLR的内容了,昨天做了修改和增加的增量索引,今天来说说关于删除的增量索引以及定时更新增量索引,废话不多说,下面进入正文. 一.增量索引之删除 昨天已经说过,增量索引其实就是SOLR对上次做过(增量或者全量)索引之后到这次做索引之间的这段时间数据库发生变化的数据进行创建索引,昨天我们说了增加一条数据或者修改一条数据之后创建增量索引,现在来说删除数据的增量索引. 其实这里所说的删除是假删除,什么意思呢?就是并不是说在数据库中把某些数据给彻底删除掉,而是说给你不想创建索引的数据一个标

sphinx配置增量索引和索引合并

配置增量索引 1,配置csft.conf文件. 其中base为父类,scr1和tmp_src1都是他的子类,相应配置如下. searchd{ listen = 9312 listen = 9306:mysql41 read_timeout =5 max_children = 30 max_matches = 1000 seamless_rotate = 0 preopen_indexes = 0 unlink_old = 1 pid_file = /usr/local/coreseek/var/

solr4.2增量索引之同步(修改,删除,新增)--转载

solr4.2增量索引之同步(修改,删除,新增)--转载 原文地址:http://www.jiancool.com/article/12743229775/;jsessionid=14E9B3F1BB33399799884B5C8F15DDE1  solr增量索引配置 1.在进行增量索引前,首先要弄懂几个必要的属性,以及数据库建表事项,和dataimporter.properties                    data-config.xml里面的数据   <!--  transfor

solr增量索引

注:全量索引和增量索引data-config.xml和delta-data-config.xml配置文件默认放在和solrconfig.xml同级目录 solrconfig.xml配置如下: [java] view plain copy <requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler"> <lst name=

sphinx (coreseek)——3、区段查询 与 增量索引实例

首先本文测试数据100多万的域名的wwwtitle 信息  检索数据: 首先建立临时表格: CREATE TABLE `sph_counter` ( `index_id` tinyint(1) NOT NULL, `max_id` int(11) NOT NULL, PRIMARY KEY (`index_id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 csft.complex.conf 文件修改配置: #增量数据索引 区段查询 合并为一个文件实现 测试 配置

solrj实现增量索引

最近发现solrj实现增量索引确实有点麻烦,于是就查找源码,发现内部实现很容易,虽然增量索引需求用的不是很多(不覆盖以前的文档),但也花了很多时间,做个随笔吧. 只需在以前的commit前增加几句就ok了. { SolrInputDocument document = new SolrInputDocument(); document.addField("id", "10"); document.addField("title", "a

SPHINX 增量索引 实现近实时更新

一.sphinx增量索引的设置   数据库中的已有数据很大,又不断有新数据加入到数据库中,也希望能够检索到.全部重新建立索引很消耗资源,因为我们需要更新的数据相比较而言很少.例如.原来的数据有几百万条,而新增的只是几千条.这样就可以使用“主索引+增量索引”的模式来实现近乎实时更新的功能. 这个模式实现的基本原理是设置两个数据源和两个索引,为那些基本不更新的数据建立主索引,而对于那些新 增的数据建立增量索引.主索引的更新频率可以设置的长一些(例如设置在每天的午夜进行),而增量索引的更新频率,我们可

Mongo-connector集成MongoDB到Solr实现增量索引

Mongo-connector集成MongoDB到Solr实现增量索引 配置MongoDB复制集 参考:<部署一个用于测试和开发的复制集> 安装Solr5.3 参考:<在CentOS下安装Solr5.3> 安装Python2.7 参考:<在CentOS下安装Python2.7> 安装pip 参考:<在CentOS下安装pip> 安装mongo-connector 方法一:使用pip安装 pip install mongo-connector 安装到了ytho