首页 > 系统相关 >coreseek4.1使用sphinx做索引的索引控制shell脚本及逻辑 及 linux安装coreseek4.1的sphinx服务及中文分词mmseg的报错解决方法

coreseek4.1使用sphinx做索引的索引控制shell脚本及逻辑 及 linux安装coreseek4.1的sphinx服务及中文分词mmseg的报错解决方法

时间:2024-08-03 13:23:39浏览次数:16  
标签:opt incr sphinx -- sudo 索引 coreseek4.1

一、coreseek4.1使用sphinx做索引的索引控制shell脚本及逻辑

    sphinx做索引时索引数据来源可以有多种方式,比如数据库mysql,pgsql,mssql,odbc,也可以是python脚本,也可以是xml数据文件,xmlpipe (publish:November 1, 2017 -Wednesday)。

    一般来说,如果索引的数据比较简单,需要入索引的字段直接就在数据库表中不需要进行其它额外的处理,完全可以直接使用数据库做索引数据来源,然后写好索引的mysql和增量索引的mysql(一般数据表字段中需要有一个带索引的最后修改时间字段),即可以实现索引,就像本站的搜索,即是使用sphinx直接连接mysql执行索引。但如果需要索引的数据比较复杂,比如所有的记录依赖外部各种计算计果,甚至是查询多表聚会查询筛选处理才能得到的结果,这时就推荐使用xml数据文件作为索引数据源,一是索引数据方便可见,另外是sphinx对这种索引也是特别的支持。今天这篇笔记就是coreseek中的sphinx使用xml文件做数据索引的记录。

    我要实现的功能是有多台服务器作为索引服务器,为了避免对数据库进行大量重复查询,只考虑在一台主服务器上生成主索引文件和增量索引,然后主索引服务器索引生成后通知其它服务器也同时生成主索引和增量索引。在主服务器上定时执行shell脚本来操作处理主索引和增量索引,以生成主索引文件为例,shell中判断全量索引是否有进程在处理(防止某些原因出现索引一直未建立)而后面又跟着启动一大堆的索引进程程序至服务器卡死.完成基本判断后调用php生成xml文件,shell中得到php执行是否成功的标志。最后更新sphinx的索引,如果是增加索引,则再进行全量增量索引的合并。

1. 基本的shell脚本代码如下:

#!/bin/bash
#全量及增量索引执行脚本。
#www.linge.cn

#索引类型参数检查.
if [ ! -n "$1" ] ;then
    echo "第一个参数必须传入:全是索引(all), 增量索引(incr)";
    exit 0;
fi
if [ "$1" != "all" -a "$1" != "incr" ]; then
    echo "第一参数无效:必须是all或incr";
    exit 0;
fi

#测试模式.
if [ ! -n "$2" ] ;then
    testMode=0;
    testChar='';
else
    testMode=1;
    testChar='_test'
fi

#执行开始.
echo "Started:" $(date +"%Y-%m-%d %H:%M:%S")
cd /opt/baofeng-data/apitask/job/shell/

#检查全量索引是否正在执行
checkProcess()
{
    processPid=`ps -ef | grep "$1" | grep -v grep | awk '{print $2}' | tail -1`
    if [ "$processPid" == "" ];
    then
      return 0
    fi
    return 1
}

#检查当前是否有正在执行的全量搜索索引.
checkProcess "Mainsphinx index 0"
if [[ $? -eq 1 ]]; then
    echo '进程已存在,等待下一次执行.';
    exit 0;
fi

#准备执行
if [ "$1" = "incr" ];then
    echo '开始执行增量索引...';
    increment=1;
    incrChar='_incr';
else
    echo '开始执行全量索引...';
    increment=0;
    incrChar='';
fi
#执行索引
echo '索引日志请查看:/opt/log/Mainsphinx.log';
filename='Mainsphinx'$incrChar$testChar".xml.tmp"
cd /opt/api/; php index.php Mainsphinx index $increment $testMode >> log/sphinx.log;exitval=$?;
if [ $exitval == "99" ]; then
    echo "索引执行完成:" $(date +"%Y-%m-%d %H:%M:%S")
else
    echo '索引执行出现异常.' $(date +"%Y-%m-%d %H:%M:%S")
    exit 0;
fi

#如果是测试模式不再执行下面的操作
if [[ $testMode -eq 1 ]]; then
    echo '测试模式执行结束. 请检查生成的测试索引文件:'$filename;
    ls -lh /opt/sphinxdata/;
    exit 0;
fi

#sphinx索引更新.
if [ "$1" = "all" ];then
    sudo mv -f /opt/sphinxdata/$filename /opt/sphinxdata/base.xml;
    sudo /opt/coreseek4.1/bin/indexer -c /opt/coreseek4.1/etc/main.conf base --rotate
    echo "完成全量索引并更新searchd:" $(date +"%Y-%m-%d %H:%M:%S")
else
    sudo mv -f /opt/sphinxdata/$filename /opt/sphinxdata/incr.xml
    sudo /opt/coreseek4.1/bin/indexer -c /opt/coreseek4.1/etc/main.conf incr --rotate
    sudo /opt/coreseek4.1/bin/indexer -c /opt/coreseek4.1/etc/main.conf --merge base incr --rotate 
    echo "增量索引已完成并更新searchd:" $(date +"%Y-%m-%d %H:%M:%S")
fi

echo
echo

2. 在sphinx生成索引时其逻辑如下:

1,生成xml文件
2,使用sphinx的bin/indexer对主索引xml文件进行索引。
3,使用sphinx的bin/indexer对增量索引xml文件进行索引。
4,启动searchd服务提供外部搜索。
5,调用上面的shell脚本执行生成xml文件索引,然后更新2,3的索引。在3时并进行索引合并。
之所以把这个逻辑写下,是因为不能直接执行第5步(之前必须先执行第2,3步生成全量和增量的.sph文件),不然会导致下面的问题:

using config file '/opt/coreseek4.1/etc/main.conf'...
read 287.1 of 287.1 MB, 100.0% done
FATAL: failed to merge index 'incr' into index 'base': source index preload failed: failed to open /opt/coreseek4.1/var/data/incr.sph: No such file or directory

    通过对生成的xml文件目录查看发现生成的incr.spl,incr.sph,incr.spm等一堆文件全都叫做incr.new.spl,incr.new.sph,incr.new.spm。这是因为使用--rotate参数来索引是在原来索引的基础上来进行操作的,在rotate时,sphinx需要将原来的incr.spa重命名为incr.old.spa,然后将incr.new.spa重命名为incr.spa,再通知searchd重启完成rotate。而因为如果直接执行第5步即--rerote来追加索引,则此时没有原文件,就会导致sphinx将原来的incr.spa重命名为incr.old.spa这一步操作失败,从而incr.new.spa文件名未成功更名为incr.spa文件,最终出现找不到incr.sph文件的错误。

二、linux安装coreseek4.1的sphinx服务及中文分词mmseg的报错解决方法

    之前有过一篇安装coreseek的笔记,但是里面没有碰到什么报错,这里把一些错误列出来,原文章地址:Centos下基于sphinx的开源搜索引擎coreseek的安装 及 sphinx常见报错及解决办法_sphinx-coreseek-CSDN博客

    下载coreseek到指定目录解压后,执行bootstrap,开始有报错,报错信息显示缺少libtoolize工具,这个错误可以通过安装libtool来解决.

[onlinedev@BFG-OSER-4435 mmseg-3.2.14]$ sudo ./bootstrap 
+ aclocal -I config
config/sys_siglist.m4:20: warning: underquoted definition of SIC_VAR_SYS_SIGLIST
config/sys_siglist.m4:20:   run info '(automake)Extending aclocal'
config/sys_siglist.m4:20:   or see http://sources.redhat.com/automake/automake.html#Extending-aclocal
configure.in:26: warning: macro `AM_PROG_LIBTOOL' not found in library
+ libtoolize --force --copy
./bootstrap: line 24: libtoolize: command not found
+ autoheader
+ automake --add-missing --copy
src/Makefile.am:37: Libtool library used but `LIBTOOL' is undefined
src/Makefile.am:37:   The usual way to define `LIBTOOL' is to add `AC_PROG_LIBTOOL'
src/Makefile.am:37:   to `configure.in' and run `aclocal' and `autoconf' again.
src/Makefile.am:37:   If `AC_PROG_LIBTOOL' is in `configure.in', make sure
src/Makefile.am:37:   its definition is in aclocal's search path.
+ autoconf
configure.in:26: error: possibly undefined macro: AM_PROG_LIBTOOL
      If this token and others are legitimate, please use m4_pattern_allow.
      See the Autoconf documentation.

安装命令:sudo yum -y install libtool
再次执行bootstrap,可见不再报libtool的错误,但有以下提示。

[onlinedev@BFG-OSER-4435 mmseg-3.2.14]$ sudo ./bootstrap        
+ aclocal -I config
config/sys_siglist.m4:20: warning: underquoted definition of SIC_VAR_SYS_SIGLIST
config/sys_siglist.m4:20:   run info '(automake)Extending aclocal'
config/sys_siglist.m4:20:   or see http://sources.redhat.com/automake/automake.html#Extending-aclocal
+ libtoolize --force --copy
libtoolize: putting auxiliary files in AC_CONFIG_AUX_DIR, `config'.
libtoolize: copying file `config/ltmain.sh'
libtoolize: Consider adding `AC_CONFIG_MACRO_DIR([m4])' to configure.in and
libtoolize: rerunning libtoolize, to keep the correct libtool macros in-tree.
libtoolize: Consider adding `-I m4' to ACLOCAL_AMFLAGS in Makefile.am.
+ autoheader
+ automake --add-missing --copy
+ autoconf

我开始直接忽略上面的内容,此时执行了./configure安装,最后碰到错误:cannot find input file: src/Makefile.in,如下:

......
configure: creating ./config.status
config.status: creating Makefile
config.status: WARNING:  'Makefile.in' seems to ignore the --datarootdir setting
config.status: error: cannot find input file: src/Makefile.in

解决的方法就是执行上面列出来的三个命令, 执行如下:

[onlinedev@BFG-OSER-4435 mmseg-3.2.14]$ sudo autoheader
[onlinedev@BFG-OSER-4435 mmseg-3.2.14]$ sudo automake --add-missing --copy
[onlinedev@BFG-OSER-4435 mmseg-3.2.14]$ sudo autoconf
[onlinedev@BFG-OSER-4435 mmseg-3.2.14]$

    最后执行安装,提示成功。然后就是安装coreseek,#注意里面有一项:--without-unixodbc,这个看来是连接microsoft sqlserver那套时要用的(索引要用type=odbc时才能用到),如果我们只用mysql数据库的话,可以不用安装。

[onlinedev@BFG-OSER-4435 mmseg-3.2.14]$ sudo ./configure --prefix=/opt/modules/mmseg3
------------------------------------------------------------------------
Configuration:

  Source code location:       .
  Compiler:                   gcc
  Compiler flags:             -g -O2
  Host System Type:           x86_64-redhat-linux-gnu
  Install path:               /opt/modules/mmseg3

  See config.h for further configuration information.
------------------------------------------------------------------------

#安装coreseek
cd csft-4.1/
sudo ./buildconf.sh
sudo ./configure --prefix=/opt/modules/coreseek4.1 --without-unixodbc --with-mmseg --with-mmseg-includes=/opt/modules/mmseg3/include/mmseg/ --with-mmseg-libs=/opt/modules/mmseg3/lib/ --with-mysql 
sudo make && sudo make install

标签:opt,incr,sphinx,--,sudo,索引,coreseek4.1
From: https://blog.csdn.net/weixin_47792780/article/details/140765606

相关文章

  • 7-Python数据类型——列表和元组的详解(增删改查、索引、切片、步长、循环)
    一、列表1.1列表list有序且可变的容器,可以存放多个不同类型的元素列表就是专门用来记录多个同种属性的值列表:存储同一个类别的数据,方便操作字符串,不可变:即:创建好之后内部就无法修改【内置功能都是新创建一份数据】name="xiaochaun"data=name.upper()print(nam......
  • ElasticSearch分布式搜索引擎原理与代码实例讲解
    ElasticSearch分布式搜索引擎原理与代码实例讲解1.背景介绍1.1问题的由来在当今的数字时代,海量的数据被不断产生和存储。如何高效地检索和管理这些庞大的数据集成为了一个关键挑战。传统的关系型数据库虽然在事务处理和数据一致性方面表现出色,但在处理非结构化数据和......
  • IndexError:列表索引超出范围使用谷歌视觉
    importioimportosos.environ["GOOGLE_APPLICATION_CREDENTIALS"]="future-shuttle-323208-1e6aebdb018d.json"#ImportstheGoogleCloudclientlibraryfromgoogle.cloudimportvisionfromPILimportImageimportcv2write1=[]wr......
  • Mysql索引详解
    1索引1.1索引概述索引(index)是帮助MySQL高效获取数据的数据结构(有序)。在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引。1.1.1特点索引......
  • bing官方api搜索引擎
    bing官方api搜索引擎1.bingAPI说明微软Bing的搜索API使得开发者能够将Bing的搜索能力集成到自己的应用中,包括对网页、图片、新闻、视频的搜索,以及提供了实体搜索和视觉搜索的功能。这些API支持安全、无广告且能够根据地理位置提供相关信息的搜索结果。BingWebSearch......
  • 【Mysql】索引哪些情况会失效
    索引失效场景当使用索引列进行查询时,最终会到主键索引树查询对应的数据进行返回,理论上来说使用了索引列查询,能很好的提高查询效率,但是不规范的使用,会使索引失效。1.索引列使用函数在索引列上做运算,比如使用函数,会导致mysql无法识别索引列,查询的时候就不会走索引了。不过mys......
  • Langchain-Chatchat3.1——搜索引擎bing与DuckDuckGo
    Langchain-Chatchat3.1——搜索引擎bing与DuckDuckGo1.前提是咱们的Chatchat服务一起部署好了,可以参考Langchain-Chatchat3.1版本docker部署流程——知识库问答2.搜索引擎DuckDuckGo:该搜索引擎不需要key,但是需要全球上网服务,挂代理。pipinstall-Uduckduckgo_search......
  • pandas 数据帧索引:to_list() 与 tolist()
    我最近为某人编写了一个python脚本,其中我使用to_list()将pandas数据帧的索引转换为列表。然而,这对他们不起作用,因为他们得到:AttributeError:'Index'objecthasnoattribute'to_list'使用他们的Python解释器。我做了一些搜索,发现还有tolist()......
  • 索引
    索引MySQL官方对索引的定义:索引(index)是帮助MySQL高效获取数据的数据结构提取句子主干,就可以得到索引的本质:索引是数据结构分类在一个表中,主键索引只能有一个,唯一索引可以有多个主键索引(PRIMARYKEY)唯一的标识,主键不可重复,只能有一个列作为主键唯一索引(UNIQUEKEY)......
  • 获取元组索引 DataFrame 中的单行
    我有一个熊猫DataFrame:>>>f=pd.DataFrame.from_dict({"r0":{"c0":1,"c1":2},("r",1):{"c0":3,"c1":4}},orient="index")c0c1r012(r,1)3......