sphinx поиск по двум таблицам

Kirill

Новичок
sphinx поиск по двум таблицам

Не могу разобраться - есть 2 индексируемые таблицы, ищет либо по одной, либо по другой, но вместе не ищет. Почему?
Таблица 1 - новости
Таблица 2 - обзоры
Конфиг сфинкса
PHP:
source news_src
{
    type                    = mysql
    sql_host                = localhost
    sql_user                = root
    sql_pass                = 12345
    sql_db                  = pindos
    sql_port                = 3306
    sql_query_pre           = SET NAMES utf8
    sql_query               = \
        SELECT \
            news_id, news_name, news_title, news_date, news_short_text, news_full_text, news_author, news_url, site_lang_id \
        FROM \
            news \
            INNER JOIN news_site_langs USING (news_id)
    sql_attr_uint           = site_lang_id
    sql_attr_timestamp      = news_date
    sql_query_info          = SELECT * FROM news WHERE news_id=$id
}

source reviews_src
{
    type                    = mysql
    sql_host                = localhost
    sql_user                = root
    sql_pass                = 12345
    sql_db                  = pindos
    sql_port                = 3306
    sql_query_pre           = SET NAMES utf8
    sql_query               = \
        SELECT \
            review_id, review_name, review_title, review_date, review_author, review_short_text, review_full_text, review_url, site_lang_id \
        FROM \
            reviews \
            INNER JOIN review_site_langs USING (review_id)
    sql_attr_uint           = site_lang_id
    sql_attr_timestamp      = review_date
    sql_query_info          = SELECT * FROM reviews WHERE review_id=$id
}


index news
{
    source          = news_src
    path            = /etc/sphinx/var/data/news
    docinfo         = extern
    mlock           = 0
    morphology      = none
    min_word_len    = 2
    charset_type    = utf-8
    html_strip      = 1
}

index reviews
{
    source          = reviews_src
    path            = /etc/sphinx/var/data/reviews
    docinfo         = extern
    mlock           = 0
    morphology      = none
    min_word_len    = 2
    charset_type    = utf-8
    html_strip      = 1
}
В таблице news есть 1 запись содержащая "фраза", в таблице обзоров также есть одна запись содержащая слово "фраза".

Итак:
$res = $sphinxClient->query('фраза', 'news'); - найдена одна запись

$res = $sphinxClient->query('фраза', 'reviews'); - найдена одна запись

$res = $sphinxClient->query('фраза'); - найдена одна запись. Почему? Ведь поиск должен проходить сразу по двум таблицам.
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
Kirill
сфинкс ищет не по таблице, а по индексу
индекс формируется по результату запроса
можно написать свой собственный запрос, на котором он построит индекс
 

Активист

Активист
Команда форума
Я добавляю тип таблицы - в виде целого, тогда ищится по обоим таблицам, и я могу видеть, в какой таблице найдено совподение

Код:
source st38_products
 {
 	type               = mysql
 	sql_host           = localhost
 	sql_user           = st38_user
 	sql_pass           = *
 	sql_db             = st38_db
 
 	
 	sql_range_step     = 500
	sql_query_pre = SET NAMES cp1251
    sql_query_pre = SET CHARACTER SET cp1251
 	
 	sql_query          = \
            SELECT \
            		`catalogProducts`.`id` AS `id`, \
            		`catalogGroups`.`groupTitle`, \
            		`catalogProducts`.`productTitle`, \
            		`catalogProducts`.`smallDescription`, \
            		`catalogProducts`.`fullDescription`, \
            		GROUP_CONCAT(" ", `catalogSubProducts`.`param1Value`, " ") AS `param1Value`, \
            		GROUP_CONCAT(" ", `catalogSubProducts`.`param2Value`, " ") AS `param2Value`, \
            		GROUP_CONCAT(" ",`catalogSubProducts`.`param3Value`, " ") AS `param3Value`, \
            		GROUP_CONCAT(" ",`catalogSubProducts`.`param4Value`, " ") AS `param4Value`, \
            		GROUP_CONCAT(" ",`catalogSubProducts`.`param5Value`, " ") AS `param5Value`, \
            		GROUP_CONCAT(" ",`catalogSubProducts`.`param6Value`, " ") AS `param6Value`, \
            		GROUP_CONCAT(" ",`catalogSubProducts`.`param7Value`, " ") AS `param7Value`, \
            		GROUP_CONCAT(" ",`catalogSubProducts`.`param8Value`, " ") AS `param8Value`, \
            		GROUP_CONCAT(" ",`catalogSubProducts`.`param9Value`, " ") AS `param9Value`, \
            		'1' AS `type` \
            FROM \
            		`catalogProducts` \
            LEFT JOIN \
            		`catalogGroups` ON `catalogProducts`.`ownerId` = `catalogGroups`.`id` \
            LEFT JOIN \
            		`catalogSubProducts` ON `catalogSubProducts`.`productId` = `catalogProducts`.`id` \
            GROUP BY \
            		`catalogProducts`.`id`\
            		

   	sql_attr_uint = type
 }
 
 source st38_pages
 {
 	type               = mysql
 	sql_host           = localhost
 	sql_user           = st38_user
 	sql_pass           = *
 	sql_db             = st38_db
 
 	
 	sql_range_step     = 500
	sql_query_pre = SET NAMES cp1251
    sql_query_pre = SET CHARACTER SET cp1251
 	
 	sql_query          = \
            SELECT \
            		*, \
            		'2' AS `type` \
            FROM \
            		`pages` 
    
    sql_attr_uint = type
 }


 index st38_catalog
 {
 	source             = st38_products
 	
 	path               = /home/st38/data/www/st38.ru/sphinx/var/data/st38_catalog
 	docinfo            = extern
 	morphology         = stem_en, stem_ru, 
 	html_strip         = 1
 	min_word_len       = 2
 }
 
 

 index st38_pages
 {
 	source             = st38_pages
 	
 	path               = /home/st38/data/www/st38.ru/sphinx/var/data/st38_pages
 	docinfo            = extern
 	morphology         = stem_en, stem_ru, 
 	html_strip         = 1
 	min_word_len       = 2
 } 
 
 
searchd
{
	port					= 3312
	log						= /home/st38/data/www/st38.ru/sphinx/var/log/sphinx.log
	query_log				= /home/st38/data/www/st38.ru/sphinx/var/log/query.log
	read_timeout			= 5
	max_children			= 30
	pid_file				= /home/st38/data/www/st38.ru/sphinx/sphinx.pid
	max_matches				= 1000
	seamless_rotate			= 0
	preopen_indexes			= 0
	unlink_old				= 1
}
 

Kirill

Новичок
спс.
что лушче - создать индекс по 2 -таблицам или использовать addQuery / runQueries ? При использовании runQueries - общая релевантность будет высчитываться для каждой строчки?
 

Активист

Активист
Команда форума
Kirill
Честно, не знаю, в тонкости сильно не вникал, сделал работает. Как ты понял, у меня используется два индекса, выше я привел рабочий конфиг сфинкаса.

Результат вывода можно оценить тут тут

Часть PHP кода, отвечающего за поиск в сфинксе:
http://phpclub.ru/paste/index.php?show=2280

Шаблон Smarty:
http://phpclub.ru/paste/index.php?show=2281

Для, для подсветки в результатах вывода использовал метод BuildExcerpts класса, поставляемом с сфинсксом, предварительно поправив код этого метода (для сохранения текстовых ключей в массиве):
- Вместо цикла для перехода по результатам "подсветки" использовал форич (
foreach(array_keys($docs) as $id) (строка 1006)
- вместо (строка 1017)
$res[] = $len ? substr ( $response, $pos, $len ) : "";
это
$res[$id] = $len ? substr ( $response, $pos, $len ) : "";


Изучай на здоровье
 
Сверху