Q、ERROR: index ‘product’: raw_hits: write error: 122070 of 262017 bytes written

A:此类问题是索引写入磁盘错误导致,有多个原因。注意查看磁盘空间是否已满。另外,还可能是因为是否有多个indexer进程在进行,写入索引失败!还有个解决方法是:减少 indexer配置中 max_iosize的大小。max_iosize是sphinx最大允许的I/O操作大小,以字节为单位,用于I/O节流。比如可以设置为 524288(512KB)
1、增量索引,注意删除的问题 2、对大数据,一定要给sphinx数据目录留出大量空间,因为临时文件会占据非常大的空间

Q、编译安装时出现这个问题….sphinx.cpp; then mv -f “.deps/sphinx.Tpo” “.deps/sphinx.Po”; else rm -f “.deps/sphinx.Tpo”; exit 1; fi In file included from sphinx.cpp:14:sphinx.h:54:19: error: mysql.h: No such file or directory….

A:缺少libmysqlclient15.so,安装mysql-devel.如果已经存在。请使用ldconfig加载一下这个动态链接库(linux)

Q: sphinx在rotate时出现以下问题。(searchd.log) WARNING: rotating index ‘sphinx’: prealloc: mmap() failed: Cannot allocate memory (length=431854320); using old index,同时,在索引数据目录中会出现sphinx.spl sphinx.new.spl的情况,导致原来的索引不能正确的检索到

A
sphinx indexer有2个进程同时在运行,sphinx 的indexer不能同时使用,导致无法分配内存。并使indexer使用旧的索引文件
先了解一下sphinx的 –rotate机制:

indexer完成索引->发送SIGHUP 给searchd(同时在终端输出索引已经完成)->searchd接到中断信号->等待所有子进程退出->重命名 当前索引为旧索引为 .old
->重命名 .new 索引文件作为当前索引->尝试加载当前索引文件->如果加载失败,searchd会把.old文件回滚为当前文件,并把刚建立的新索引重命名 为 .new                             ->加载成的话:完成无缝衔接

执行 rotate开关情况下,indexer在完成索引后会首先会发送一个中断信号给searchd(并且会输出已经索引完成)。
接着 searchd会做以下事情:
1)等待所有子进程退出
2)重命名 当前索引为旧索引为 .old
3)重命名 .new 索引文件作为当前索引
4)尝试加载当前索引文件
5)如果加载失败,searchd会把.old文件回滚为当前文件,并把刚建立的新索引重命名为 .new

鉴于以上情况,很可能是开启了2个检测目录访问权限的进程。用户同时使用2个indexer且 searchd运行其下 等等


sphinx的searchd在启动时会创建一个 .spl 锁文件,并在关闭时会删除它。在indexer创建索引时如果发现有 .spl文件,则不会创建新索引,除非使用 –rotate

所以,出现这样的问题可能是 锁文件不知咋的就丢失啦,或者重建索引时没有使用 –rotate开关
具体操作:
killall searchd 然后重启。重启后会自动加载重命名 sphinx.new.sp*为 sphinx.sp*

另外,出现这样的问题时,最好注意 –rotate的使用,在应用许可 的情况下,不妨直接采用 关闭searchd 再索引,然后再开启 searchd

Q:关于updateAttribute更新索引的问题

sphinx使用api不能马上真正的更新索引,但更新后api能显示索引已经是更新了。不过使用cli端的search就不能搜索到。只有在searchd重启后才会写入磁盘文件中。切记!

Q、sphinx安装make时,碰到libiconv的问题。

查了半天,改Makefile,configure都不可靠。最后在官站上查到:
./configure –without-iconv,就好了。NND,那干嘛还要这个iconv嘛。
看出错代码里,是在xmlunknowencode时才用到。我们都用utf-8,很多时候可能压根用不着这个功能!如若需要的话,可以加上这个lib

Q、检索出来后结果id排序问题

SELECT * FROM documents WHERE id IN (3,5,7) ORDER BY FIELD(id,3,5,7);

SELECT * FROM documents WHERE id IN (3,5,7) ORDER BY substring_index((id,3,5,7),id,1)

Q、ERROR: index ‘documents’: raw_docinfos: write error: 1348640 of 4194288 bytes written.

Q、Sphinx 怎样针对字段搜索

co_do是要检索的字段 注意,要使用多字段搜索,必须使用 SPH_MATCH_EXTENDED2 模式,即 $cl->SetMatchMode(SPH_MATCH_EXTENDED); //使用多字段模式,这是必须!扩展模式 $res = $cl->Query(“@co_do $q”, $index,’非常好’);

Q、WARNING: sort_hits: merge_block_size=248 kb too low, increasing mem_limit may improve performance

A、增大mem_limit的值

Q:sphinx排序问题

$sphinx->SetSortMode(SPH_SORT_EXTENDED,’status DESC,is_deleted DESC’); //组内排序 setGroupBy排序的话,分成组间排序和组内排序,比如:(317,1,hello),(317,0,world)。如果组内排序的话,需先使用SetSortMode(),进行自然排序,然后 使用group排序,这样在组间排序和组内排序都成自然状态了!

Q、WARNING: maxed out, dismissing client

这是sphinx 客户端找不到searchd守护进程。具体可能是索引的锁文件了 (***.spl)丢失, 这个文件通常是用来标识searchd是否开启。
通常客户端也会返回“zero-sized searchd response”。 解决办法: 重启searchd即可 作者的话: It seems thata) the lock files were lost somehow, andb) you ran indexer without –rotate switch.

Q:sphinx报错:

connection to localhost:9312 failed (errno=111, msg=Connection refused)

重启sphinx守护进程searchd,即可!