标签归档:sphinx

coreseek安装小结

1、按官方的标准安装,我的系统是CentOS(64位),默认安装了Python 2.6.6,如果没有安装还需要先安装Python 2.6.6,版本不要错;官方安装地址:http://www.coreseek.cn/products-install/install_on_bsd_linux/ 安装时注意在./config的时候加上对python的支持,因为我们要使用的是Oracle数据源

clipboard

相关代码:

$ cd csft-3.2.14
$ ./configure –prefix=/usr/local/coreseek  –without-unixodbc –with-mmseg –with-mmseg-includes=/usr/local/mmseg3/include/mmseg/ –with-mmseg-libs=/usr/local/mmseg3/lib/ –with-python
$ make && make install

2、安装cx_Oracle:下载cx_Oracle-5.1.2-11g-py26-1.x86_64.rpm

执行安装包
rpm -ivh cx_Oracle-5.1.2-11g-py26-1.x86_64.rpm

3、下载安装instantclient-basic-linux.x64-11.2.0.3.0.zip,我下载的是zip包,当然我认为也可以下载rpm包,而且不需要自己配置会更合适一些

4、打开~下的.bash_profile,添加下面两句(如果下载的rpm包,则不需要做如下操作

增加以下两行代码
LD_LIBRARY_PATH=/root/instantclient_11_2;
export LD_LIBRARY_PATH

5、在python下测试import cx_Oracle,如没有报错,则说明python连接oracle已经没有错误了

6、配置csft的config文件/root/coreseek-3.2.14/testpack/etc/csft_demo_python_pyoracle.conf

文件如下:
python
{
path = /root/coreseek-3.2.14/testpack/etc/pysource
path = /root/coreseek-3.2.14/testpack/etc/pysource/csft_demo_pyoracle
}
#源定义
source python_oracle
{
type = python
name = csft_demo_pyoracle.MainSource
}
#index定义
index python_oracle
{
source            = python_oracle
path            = /root/coreseek-3.2.14/testpack/var/data/python_oracle
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/
charset_type        = zh_cn.utf-8
}
#全局index定义
indexer
{
mem_limit            = 128M
}
#searchd服务定义
searchd
{
listen                  =   9312
read_timeout        = 5
max_children        = 30
max_matches            = 1000
seamless_rotate        = 0
preopen_indexes        = 0
unlink_old            = 1
pid_file = /root/coreseek-3.2.14/testpack/var/log/searchd_python_oracle.pid
log = /root/coreseek-3.2.14/testpack/var/log/searchd_python_oracle.log
query_log = /root/coreseek-3.2.14/testpack/var/log/query_python_oracle.log
}

7、设置/root/coreseek-3.2.14/testpack/etc/pysource/csft_demo_pyoracle/__init__.py,

文件内容如下
# -*- coding:utf-8 -*-

from os import path
import os
os.environ[‘NLS_LANG’] = ‘SIMPLIFIED CHINESE_CHINA.UTF8’
import sys
import cx_Oracle

class MainSource(object):
def __init__(self, conf):
self.conf =  conf
self.idx = 0
self.data = []
self.conn = None
self.cur = None

    def GetScheme(self):  #获取结构,docid、文本、整数
return [
(‘id’ , {‘docid’:True, } ),
(‘title’, { ‘type’:’text’} ),
(‘abstract’, { ‘type’:’text’} ),
(‘search_type’, {‘type’:’integer’} ),
]
def GetFieldOrder(self): #字段的优先顺序
return [(‘title’, ‘abstract’)]

def Connected(self):   #如果是数据库,则在此处做数据库连接
if self.conn==None:
self.conn = cx_Oracle.connect(‘yzjs/a123456@10.166.166.222/genome’)
self.cur = self.conn.cursor()
sql = ‘SELECT t.id as id, t.title, t.abstract, t.search_type as search_type from V_SPHINX_INDEX t where t.title is not null and t.abstract is not null’
self.cur.execute(sql)
for rows in self.cur:
item = []
item.append(rows[0])
item.append(rows[1])
item.append(rows[2].read())
item.append(rows[3])
self.data.append(item)
pass

    def NextDocument(self):   #取得每一个文档记录的调用
if self.idx < len(self.data):
item = self.data[self.idx]
self.docid = self.id = item[0] #’docid’:True
self.title = item[1]#.decode(“GBK”).encode(“UTF-8”)
self.abstract = item[2]#.decode(“GBK”).encode(“UTF-8”)
self.search_type = item[3]
self.idx += 1
return True
else:
return False

if __name__ == “__main__”:    #直接访问演示部分
conf = {}
source = MainSource(conf)
source.Connected()
while source.NextDocument():
print “id=%d, subject=%s” % (source.id, source.abstract)#.decode(“UTF-8”))
pass
#eof

8、然后根据下面三段脚本,可以方便索引,启动,热索引数据

索引
/usr/local/coreseek/bin/indexer -c /root/coreseek-3.2.14/testpack/etc/csft_demo_python_pyoracle.conf –all
启动
/usr/local/coreseek/bin/searchd -c /root/coreseek-3.2.14/testpack/etc/csft_demo_python_pyoracle.conf
停止
/usr/local/coreseek/bin/searchd -c /root/coreseek-3.2.14/testpack/etc/csft_demo_python_pyoracle.conf –stop
重编译
/usr/local/coreseek/bin/indexer -c  /root/coreseek-3.2.14/testpack/etc/csft_demo_python_pyoracle.conf –all –rotate

 

9、引入sphinxapi.php,写如下代码测试

$cl = new SphinxClient ();
$cl -> SetServer ( ‘192.168.42.148’, 9312);
$cl -> SetConnectTimeout ( 3 );
$cl -> SetArrayResult ( true );
$cl -> SetMatchMode ( SPH_MATCH_ANY);
$data[‘res’] = $res = $cl -> Query ( $keyword, ‘*’ );

CoreSeek和Sphinx中文全文检索备忘

1、分词词典文件地址:F:\coreseek-4.1-win32\etc\unigram.txt

2、python需要安装2.6及以下版本,上下不兼容,作用oracle万能数据源接口;安装完成后,将python.exe纳入path;安装cx_Oracle,在python命令行下面import cx_Oracle不报错证明安装完成

3、所有python的配置文件都大体相同,需要定义的如下图,定义python源文件路径,源文件的入口地址,索引数据存放地址以及数据存放格式等

image

4、python源文件代码:主要是数据连接部分和中文索引时相应编码的问题;在32位win7下测试通过,但不保证所有系统下测试能通过;

# -*- coding:utf-8 -*-
# python source演示操作oracle数据库

from os import path
import os
import sys
import cx_Oracle
import datetime

class MainSource(object):
def __init__(self, conf):
self.conf =  conf
self.idx = 0
self.data = []
self.conn = None
self.cur = None

def GetScheme(self):  #获取结构,docid、文本、整数
return [
(‘id’ , {‘docid’:True, } ),
(‘name’, { ‘type’:’text’} ),
(‘yqsize’, { ‘type’:’text’} ),
(‘add_date’, {‘type’:’integer’} ),
]

def GetFieldOrder(self): #字段的优先顺序
return [(‘name’, ‘yqsize’)]

def Connected(self):   #如果是数据库,则在此处做数据库连接
if self.conn==None:
self.conn = cx_Oracle.connect(‘sppt/a123456@10.10.28.104/sgsttest’)
self.cur = self.conn.cursor()
sql = ‘SELECT id,name,yqsize,add_date FROM yqxx’
self.cur.execute(sql)
self.data = [ row for row in self.cur]
pass

def NextDocument(self, err):   #取得每一个文档记录的调用
if self.idx < len(self.data):
item = self.data[self.idx]
self.id = self.threadid = item[0] #’docid’:True
            self.name = item[1].decode(“GBK”).encode(“UTF-8”)
self.yqsize = item[2].decode(“GBK”).encode(“UTF-8”)
            self.add_date = item[3]
self.idx += 1
return True
else:
return False

if __name__ == “__main__”:    #直接访问演示部分
conf = {}
source = MainSource(conf)
source.Connected()

while source.NextDocument({}):
print “id=%d, subject=%s” % (source.id, source.name.decode(“UTF-8”))
pass
#eof

5、运行test_python_oracle.cmd,可以查看索引的过程,最后启动searchd,监听9132端口,在服务器稳定的时候,可将其作为服务,开机自动启动

6、关于python中文编码问题:主要分为:控制台编码、文件编码、文件中文编码;解码方式主要有encode decode;如,从数据库读取到utf8文件编码转换时,显示数据中的编码是中文编码,于是先解编码GBK,然后再encode utf8;如上图红字;

7、不同的控制台,运行同一个python文件,可能会得到不同的结果,跟控制台编码有关。如:用PowerCmd运行与用cmd运行得到不同结果

还未解决的问题:

  • 得到的结果是以数组的方式返回的,但没有详细解释翻页怎么来实现,所以要想知道,还需要看其api
  • 还未查看怎么样进行增量索引的问题,能否在不停止任务的时候定时增量索引

Sphinx 学习2

接上篇,这样有个延续,对自己以后再看这些东西也会有个启发:

首先来看配置文件:1、sphinx.conf.in 2、sphinx.conf;这两个配置文件是一样的,在1中已经提到,sphinx.conf是由sphinx.conf.in拷贝过去的,对里面的相对路径进行了绝对化;同样在in中,也要对路径进行绝对化,不然不能记录日志,所注册的服务也不能正常启动;以下贴也修改后的配置文件

#
# Minimal Sphinx configuration sample (clean, simple, functional)
#

source src1
{
type            = mysql

sql_host        = localhost
sql_user        = root
sql_pass        = a123456
sql_db            = test
sql_port        = 3306    # optional, default is 3306

sql_query        = \
SELECT id, group_id, UNIX_TIMESTAMP(date_added) AS date_added, title, content \
FROM documents

sql_attr_uint        = group_id
sql_attr_timestamp    = date_added

sql_query_info        = SELECT * FROM documents WHERE id=$id
}

index test1
{
source            = src1
path            = F:/sphinx-2.0.3-win32/data/test1
docinfo            = extern
charset_type        = sbcs
}

index testrt
{
type            = rt
rt_mem_limit        = 32M

path            = F:/sphinx-2.0.3-win32/data/testrt
charset_type        = utf-8

rt_field        = title
rt_field        = content
rt_attr_uint        = gid
}

indexer
{
mem_limit        = 32M
}

searchd
{
listen            = 9312
listen            = 9306:mysql41
log            = F:/sphinx-2.0.3-win32/log/searchd.log
query_log        = F:/sphinx-2.0.3-win32/log/query.log
read_timeout        = 5
max_children        = 30
pid_file        = F:/sphinx-2.0.3-win32/log/searchd.pid
max_matches        = 1000
seamless_rotate        = 1
preopen_indexes        = 1
unlink_old        = 1
workers            = threads # for RT to work
}

 

接下来,再明白一个问题,下面这段代码是注册一个服务,服务的名称叫SphinxSearch,服务的命令就是searchd –config c:\Sphinx\sphinx.conf.in;查看服务就可以看到

F:\sphinx-2.0.3-win32\bin>searchd –install –config F:\sphinx-2.0.3-win32\bin\sphinx.conf.in –servicename SphinxSearch

image

既然windows服务可以注册,当然也可以删除,我在网上查了下,所有命令都在windows中的sc中

sc delete SphinxSearch

这样,在每次启动windows的时候,就可以自动启动SphinxSearch进程,进程端口9312,可以通过telnet命令测试启动是否成功

telnet localhost 9312

最后一步,使用代码测试是否可以使用,测试代码已经在api文件夹里了,里面有各种语言的测试demo,我们使用php文件来测试,把sphinxapi.php和test.php都拷贝到F:\wamp\bin\php\php5.3.5目录(如果设置了 php执行路径不需要这样做)执行下面的命令,并得到如下结果,则说明测试成功,进程已经在监控状态了

F:\wamp\bin\php\php5.3.5>php test.php test
Query ‘test ‘ retrieved 3 of 3 matches in 0.032 sec.
Query stats:
‘test’ found 5 times in 3 documents

Matches:
1. doc_id=1, weight=101, group_id=1, date_added=2012-01-13 05:47:21
2. doc_id=2, weight=101, group_id=1, date_added=2012-01-13 05:47:21
3. doc_id=4, weight=1, group_id=2, date_added=2012-01-13 05:47:21

sphinx安装流程

sphinx的windows安装确实有点令人费解;

1、下载安装包,我的是sphinx-2.0.3-win32.zip

2、解压到你想要的位置,如c:\sphinx

3、将example.sql导入到你的mysql;可以用命令,也可以使用界面;总之是你会使用的一个方法,生成两个表documents和tags

imageimage

4、修改sphinx.conf.in以便能连上你的mysql;主要是用户和密码两栏

image

5、安装你的sphinx

C:\Sphinx\bin> C:\Sphinx\bin\searchd --install --config C:\Sphinx\sphinx.conf.in --servicename SphinxSearch

6、建立索引,将sphinx-min.conf.in拷贝到bin目录下面,将数据库用户名密码修改,将路径修改成绝对路径

image

7、使用命令建立索引indexer --all

8、使用search查看索引是否创建成功search test