sphinx实时索引和高亮显示

sphinx实时索引和高亮显示

时间 2014-06-25 14:50:58  linux技术分享 -欧阳博客

原文  http://www.wantlearn.net/825

主题 Sphinx数据库

上次介绍了coreseek与sphinx的区别,并详细记录了安装coreseek文档说明,以及给php加上sphinx模块,详细内容请参考我写的coreseek详解这篇文档,这次主要介绍sphinx是如何做到实时索引.首先配置进入到coreseek配置文件目录,对原始配置文件进行配制,这里介略说下coreseek配制文件,主要分为主数据源,增量数据源,主索引,增量索引,索引器配制、以及还有守护进程配制。如果应用在大型系统上还会涉及到分布式索引,和增量分布式索引,由于分布式索引过于复杂,这里就不说.下面贴出我在项目中用到的sphinx配制文件

 
##主数据源
source main
{
  type					= mysql
  sql_host				= localhost
  sql_user				= root
  sql_pass				=
  sql_db					= test
  sql_port				= 3306	# optional, default is 3306
  sql_sock				= /tmp/mysql.sock
   sql_query_pre			= SET NAMES utf8
#	 sql_query_pre			= SET SESSION query_cache_type=OFF
  sql_query_pre = replace into sph_counter select 1,max(id) from post
  sql_query=select id,title,content from post where id <=(select max_doc_id from sph_counter where count_id = 1)
  sql_ranged_throttle	= 0
  sql_query_info		= SELECT * FROM post WHERE id=$id
}

#增量数据源
source delta : main
{
  sql_query_pre=set names utf8
  sql_query=select id,title,content from post where id >(select max_doc_id from sph_counter where count_id = 1)
}

#主索引
index main
{
  source			= main
  path			= /usr/local/coreseek/var/data/main
  docinfo			= extern
  mlock			= 0
  morphology		= none
  min_word_len		= 1
  charset_type		= zh_cn.utf-8
  charset_dictpath	= /usr/local/mmseg/etc/
  html_strip				= 0
}
#增量索引
index delta : main
{
  source=delta
  path			= /usr/local/coreseek/var/data/delta
#	morphology		= stem_en
}

##索引器
indexer
{
  mem_limit			= 128M
}

###守护进程设置
searchd
{

  log					= /usr/local/coreseek/var/log/searchd.log
  query_log			= /usr/local/coreseek/var/log/query.log

  read_timeout		= 5

  client_timeout		= 300

  max_children		= 30

  pid_file			= /usr/local/coreseek/var/log/searchd.pid

  max_matches			= 1000

  seamless_rotate		= 1

  preopen_indexes		= 0

  unlink_old			= 1

  mva_updates_pool	= 1M

  max_packet_size		= 8M

  max_filters			= 256

  max_filter_values	= 4096
}

上面请注意我的sql语句的写法,这里是一个核心,也是决定sphinx能否配置成功的一个关键,下面贴出sph_counter和post表结构,这里做下说明sph_count表是与sphinx实时索引相关的表

 
CREATE TABLE `post` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `title` varchar(254) NOT NULL,
  `content` text,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=42 DEFAULT CHARSET=utf8;

CREATE TABLE `sph_counter` (
  `count_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `max_doc_id` int(11) DEFAULT NULL,
  PRIMARY KEY (`count_id`)
) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=utf8

下面通过一段程序介绍shpinx如何实现高显示和实时索引

 
<html>
  <head>
    <title>spinx</title>
    <meta charset="utf-8" />
  </head>
  <body>
    <form action="find.php" method="post">
      <input type="text"  name="search"/>
      <input type="submit" value="提交">
    </form>
  </body>
</html>
 
header("content-type:text/html;charset=utf-8");
  $keyword = $_POST[‘search‘];
  $sphinx = new SphinxClient();
  $sphinx->SetServer("localhost",9312);
  $sphinx->SetMatchMode(SPH_MATCH_ANY);
  $result=$sphinx->query("$keyword","*");
  $key = array_keys($result[‘matches‘]);
  $ids = implode(‘,‘,$key);
  $conn = mysql_connect(‘localhost‘,‘root‘,‘‘)or die(‘mysql connect failed‘);
  mysql_select_db(‘test‘);
  mysql_set_charset(‘utf8‘,$conn);
  $sql = "select * from post where id in($ids)";
  $res = mysql_query($sql);
  $opt = array("before_match"=>"<font style=‘font-weight:bold;color:#f00‘>","after_match"=>"</font>");
  while($row=mysql_fetch_assoc($res)){
    echo ‘<pre>‘;
                //这里为sphinx高亮显示
    $rows = $sphinx->buildExcerpts($row,"main",$keyword,$opt);
    print_r($rows);
  }
        $sphinx->close();

运行之后结果展示

做到这里以经完成了一大半,但还没有做到实时索引,假设数据库表里面的数据增加就没有办法搜索到新增的数据,这里写了一个shell脚本 main.sh

 
#!/bin/bash
 /usr/local/coreseek/bin/inderer main --rotate >>/usr/local/coreseek/var/log/main.log

脚本delta.sh

 
#!/bin/bash
/usr/local/coreseek/bin/inderer delta --rotate >>/usr/local/coreseek/var/log/delta.log

然后将这两个脚本放在linux定时任务器每一分钟执行一次,代码如下

 
*/5 * * * * /usr/local/coreseek/init/delta.sh
00 03 * * * /usr/local/coreseek/init/main.sh

完毕,另外在说一点,sphinx操作的表必须要有主键。

时间: 2024-12-18 00:32:44

sphinx实时索引和高亮显示的相关文章

Sphinx 实时索引

index rt { type = rt rt_mem_limit = 512M path = /usr/local/sphinx/data/rt rt_field = title rt_field = content rt_attr_uint = gid } searchd { workers = threads listen = 3312 listen = 3313:mysql41 log = /usr/local/sphinx/var/log/searchd.log query_log =

sphinx架构设计 -- 高并发rt实时索引

CleverCode最近在研究sphinx使用rt实时索引,总结了一下php调用的过程,并且总结了一下rt分布式架构设计. 1 安装Sphinx 安装详解请查看:http://blog.csdn.net/clevercode/article/details/52204124. 2 配置rt索引文件 vim /usr/local/sphinx2/etc/realtime.conf index username { # 实时索引类型 type = rt # 索引保存路径,平时都是保存在内存内,数据量

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

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

sphinx增量索引使用

sphinx在使用过程中如果表的数据量很大,新增加的内容在sphinx索引没有重建之前都是搜索不到的. 这时可以通过建立sphinx增量索引,通过定时更新增量索引,合并主索引的方式,来实现伪实时更新.(使用定时任务,定时更新增量索引,例如10分钟一次) 在利用 Sphinx 做搜索引擎的时候,一般他的索引建立构成有如下几个部分: 固定不变的主索引 增量索引重建 索引数据合并 1.创建增量索引记录表   (记录每次增量索引创建时最大的id,下次从此id往后继续创建增量索引) create tabl

Coreseek:部门查询和增量索引代替实时索引

1.行业调查 索引系统需要通过主查询来获取所有的文档信息,一个简单的实现是整个表的数据到内存,但是这可能会导致整个表被锁定,并且使其它操作被阻止(例如:在MyISAM格款式上INSERT操作).同时,会浪费大量的内存来存储查询结果.喜欢它的问题. 为了避免出现这样的情况.CoreSeek/Sphinx支持一种被称为 区段查询的技术. 首先,CoreSeek/Sphinx从数据库中取出文档ID的最小值和最大值.将由最大值和最小值定义自然数区间分成若干份,一次获取数据.建立索引.现举比例如以下: s

Coreseek:区段查询及增量索引代替实时索引

1.区段查询 索引系统需要通过主查询来获取全部的文档信息,一种简单的实现是将整个表的数据读入内存,但是这可能导致整个表被锁定并使得其他操作被阻止(例如:在MyISAM格式上的INSERT操作),同时,将浪费大量内存用于存储查询结果,诸如此类的问题吧. 为了避免出现这种情况,CoreSeek/Sphinx支持一种被称为 区段查询的技术. 首先,CoreSeek/Sphinx从数据库中取出文档ID的最小值和最大值,将由最大值和最小值定义自然数区间分成若干份,一次获取数据,建立索引.现举例如下: sq

coreseek实时索引全文搜索

工作流程: 安装coreseek(win32版) 建立一个实时索引配置文件 根据配置文件开启searchd服务器 向mysql数据库实时插入数据 启动python客户端访问和搜索 安装coreseek(win32版) 官网下载:http://www.coreseek.cn/products-install/install_on_windows/ 这里的版本为4.0.1 建立实时索引配置文件 解压后,在etc目录下新建一个csft_rt.conf文件 写入如下配置: #实时索引配置文件 index

基于lucene的案例开发:实时索引的检索

转载请注明出处:http://blog.csdn.net/xiaojimanman/article/details/44279753 http://www.llwjy.com/blogdetail/31bb705106379feaf6d31b58dd777be6.html 个人博客小站搭建成功,网址 www.llwjy.com,欢迎大家来吐槽~ 在前面的博客中,我们已经介绍了IndexSearcher中的检索方法,也介绍了如何基于lucene中的NRT*类去创建实时索引,在这篇博客中我们就重点介

基于lucene的案例开发:实时索引的修改

转载请注明出处:http://blog.csdn.net/xiaojimanman/article/details/44280311 http://www.llwjy.com/blogdetail/e42fa5c3097f4964fca0fdfe7cd7a9a2.html 个人的博客小站已经上线了,网址 www.llwjy.com,欢迎大家来吐槽~ 上一篇博客已经介绍了实时索引的检索功能,这个就相当于数据的的查询功能,我们都知道数据库的增删改查是最常用的四个功能,实时索引也是一样,他也有增删改查