Sphinx 重建斯芬克斯指数失败
我们使用一个表中的数据构建了4个索引。所有索引都具有相同的源设置,只是它们采用不同的文档。我们有这样的检查Sphinx 重建斯芬克斯指数失败,sphinx,Sphinx,我们使用一个表中的数据构建了4个索引。所有索引都具有相同的源设置,只是它们采用不同的文档。我们有这样的检查mod(id,4)=来在索引之间分发文档和文档属性 问题:几乎每次重建索引时,四个索引中的一个(同一个)都无法重建。其他索引从未出现过此问题,并且重建正确 我们已经对文档和属性表进行了分区。例如,这就是documents表的分区方式: PARTITION BY HASH(mod(id, 4))( PARTITION `p0` COMMENT '', PARTITION `p1` CO
mod(id,4)=
来在索引之间分发文档和文档属性
问题:几乎每次重建索引时,四个索引中的一个(同一个)都无法重建。其他索引从未出现过此问题,并且重建正确
我们已经对文档和属性表进行了分区。例如,这就是documents表的分区方式:
PARTITION BY HASH(mod(id, 4))(
PARTITION `p0` COMMENT '',
PARTITION `p1` COMMENT '',
PARTITION `p2` COMMENT '',
PARTITION `p3` COMMENT ''
);
我们认为索引器在接收到所有文档之后,但在开始接收属性之前挂起。当我们在MySQL服务器上检查会话时可以看到这一点
无法重建的索引正在使用mod(id,4)=0
条件
我们在Ubuntu 64位12.04.02 LTS上使用Sphinx2.0.4-release
数据源配置
source ble_job_2 : ble_job
{
sql_query = select job_notice.id as id, \
body, title, source, company, \
UNIX_TIMESTAMP(insertDate) as date, \
substring(company, 1, 1) as companyletter, \
job_notice.locationCountry as country, \
location_us_state.stateName as state, \
0 as expired, \
clusterId, \
groupCity, \
groupCityAttr, \
job_notice.cityLat as citylat, \
job_notice.cityLng as citylng, \
job_notice.zipLat as ziplat, \
job_notice.zipLng as ziplng, \
feedId, job_notice.rating as rating, \
job_notice.cityId as cityid \
from job_notice \
left join location_us_state on job_notice.locationState = location_us_state.stateCode \
where job_notice.status != 'expired' \
and mod(job_notice.id, 4) = 1
sql_attr_multi = uint attr from query; \
select noticeId, attributeId as attr from job_notice_attribute where mod(noticeId, 4) = 1
} # source ble_job_2
索引配置
index ble_job_2
{
type = plain
source = ble_job_2
path = /var/lib/sphinxsearch/data/ble_job_2
docinfo = extern
mlock = 0
morphology = none
stopwords = /etc/sphinxsearch/stopwords/blockwords.txt
min_word_len = 1
charset_type = utf-8
enable_star = 0
html_strip = 0
} # index_ble_job_2
任何帮助都将不胜感激
热情问候。幸运的是,我们已经解决了这个问题 我们已经应用了设置,这有助于我们获得稳定的索引重建。我认为这是因为Sphinx运行了几个查询,每个查询都返回有限的相对较小的结果集。这允许MySQL正常完成查询,并将所有结果发送回Sphinx 斯芬克斯论坛也描述了同样的问题
数据源配置中的更改如下
sql_query_range = SELECT MIN(id),MAX(id) FROM job_notice where mod(job_notice.id, 4) = 1
sql_range_step = 200000
sql_query = select job_notice.id as id, \
...
and mod(job_notice.id, 4) = 1 and job_notice.id >= $start AND job_notice.id <= $end
sql\u query\u range=从作业通知中选择最小(id)、最大(id),其中mod(job\u notice.id,4)=1
sql\u范围\u步长=200000
sql\u query=选择job\u notice.id作为id\
...
mod(job_notice.id,4)=1和job_notice.id>=$start和job_notice.id如何定义这些索引的sql_查询?我认为分区引擎不能直接访问底层表,只能访问组合表。我不能直接访问底层表,但我认为当我检查mod(id,4)=0时,它会访问底层分区。我之所以这样认为,是因为我可以在添加了partitions之后看到性能的提高。@barryhunter感谢您的帮助。您对“Sphinx MVA中的错误查询”问题的另一个回答对我们帮助很大,因为我们第一次尝试将范围应用于sql\u attr\u多重查询。这不完全正确,在MVA查询中使用范围是完全有效和可能的。你链接到的那个问题没有被使用。该用户认为sql\u attr\u multi对每个文档运行一次,而不是对每个文档运行一次(作为单个查询或带范围的多个查询),以获取索引中的所有文档。