我有一个非常奇怪的问题,由于某种原因,我的索引根本没有正常工作。
我已经在Sphinx中建立了一个完全工作的增量索引,并带有完整的cron作业,以保持它的形状和一切都很好。
然后我来用PHP查询:
class sphinx_searcher{
function __construct(){
$config = array('host'=>'localhost', 'port'=>9312);
$this->sphinx = new SphinxClient();
$this->sphinx->SetServer ( $config['host'], $config['port'] );
$this->sphinx->SetConnectTimeout ( 1 );
}
function query(){
$this->sphinx->SetSortMode(SPH_SORT_RELEVANCE);
$this->sphinx->SetLimits(0, 20); // Testing first page
$this->sphinx->SetRankingMode(SPH_RANK_PROXIMITY_BM25);
$this->sphinx->SetArrayResult ( true );
$res = $this->sphinx->Query("040*", "media media_delta");
if($res)
return $res;
else
return $this->sphinx->GetLastError();
}
}
由于某种原因,它取其中一个索引(目前只取后者)。
当我单独查询媒体时,我得到doc id 1和2,但当我同时查询时,我只得到doc id 3,这是在增量索引中。
这是我的数据源配置:
source media
{
type = mysql
sql_query_pre = SET NAMES utf8
sql_query_pre = REPLACE INTO sph_counter SELECT 1, MAX(id) FROM documents
sql_query = '
SELECT id, deleted, _id, uid, listing, title, description, tags, author_name, playlist, UNIX_TIMESTAMP(date_uploaded) AS date_uploaded '
FROM documents '
WHERE id<=( SELECT max_doc_id FROM sph_counter WHERE counter_id=1 )
sql_field_string = tags
sql_field_string = description
sql_field_string = author_name
sql_field_string = title
sql_attr_uint = deleted
sql_attr_string = _id
sql_attr_string = uid
sql_attr_string = listing
sql_attr_uint = playlist
sql_attr_timestamp = date_uploaded
sql_ranged_throttle = 0
sql_query_info = SELECT * FROM media WHERE id=$id
sql_query_killlist = SELECT id FROM documents WHERE deleted = 0
}
source media_delta : media
{
sql_query_pre = SET NAMES utf8
sql_query = '
SELECT id, deleted, _id, uid, listing, title, description, tags, author_name, playlist, UNIX_TIMESTAMP(date_uploaded) AS date_uploaded '
FROM documents '
WHERE id>( SELECT max_doc_id FROM sph_counter WHERE counter_id=1 )
}
这是我的索引配置:
index media
{
source = media
path = /home/sam/sphinx/var/data/media
docinfo = extern
mlock = 0
morphology = stem_en, stem_ru, soundex
min_word_len = 1
charset_type = sbcs
min_infix_len = 2
infix_fields = title, tags
enable_star = 1
expand_keywords = 1
html_strip = 0
index_exact_words = 1
}
index media_delta : media
{
source = media_delta
path = /home/sam/sphinx/var/data/media_delta
}
我真的很困惑,我有什么错了,希望有人在这里可以帮助我找出什么是错的?
编辑:不再使用所有索引:
array(9) { ["error"]=> string(0) "" ["warning"]=> string(0) "" ["status"]=> int(0) ["fields"]=> array(4) { [0]=> string(5) "title" [1]=> string(11) "description" [2]=> string(4) "tags" [3]=> string(11) "author_name" } ["attrs"]=> array(10) { ["deleted"]=> int(1) ["_id"]=> int(7) ["uid"]=> int(7) ["listing"]=> int(7) ["title"]=> int(7) ["description"]=> int(7) ["tags"]=> int(7) ["author_name"]=> int(7) ["playlist"]=> int(1) ["date_uploaded"]=> int(2) } ["total"]=> string(1) "0" ["total_found"]=> string(1) "0" ["time"]=> string(5) "0.000" ["words"]=> array(1) { ["040*"]=> array(2) { ["docs"]=> string(1) "2" ["hits"]=> string(1) "2" } } }
谢谢,
在考虑了几种可能性之后,发现了问题,
sql_query_killlist = SELECT id FROM documents WHERE deleted = 0
表示任何带有"deleted=0"的文档都将消失。即会被"杀死"。
我想在这种情况下,'hit'仍然被计算在"words"数组中是令人困惑的。尽管后来被杀。(words数组是任何过滤之前的原始数字-它直接来自索引-因此任何setFilter(或者在本例中是kill-list)都会使其过高估计)
所以改成
WHERE deleted = 1
:)
总是最意想不到的事情!