Jump to content

Sphinx находит не все посты и записи блогов (3.4.6)


Mac
 Share

Recommended Posts

Настроил по примеру sphinx.conf, который генерируется через ACP. Заменил лишь параметр с кодировкой sbcs на utf-8. Поиск вроде ищет, но, например, если зайти в общую форму поиска и сделать поиск по автору, а вывод в виде сообщений, то выводятся не все сообщения. Разницу можно наблюдать, если зайти к этому же автору в профиль и кликнуть по "Найти весь контент". Кроме того, не ищет записей в блогах, комментарии.

 

Техподдержка IPB умыла руки, дескать, Sphinx стороннее ПО и не входит в техподдержку. Непонятно, зачем тогда было официально заявлять поддержку сфинкса и включать его в стандартный функционал.

 

БД в utf8_general_ci, таблицы в InnoDB. База 2.5 Gb.

 

Просьба ко всем, кто пользуется поиском Sphinx, проверить данные симптомы у себя. Я сам проверил на паре форумов - ошибка присутствует, но владельцы, видимо, не в курсе. Хочется выяснить, проблема конкретно у меня, или это глобальный косяк скриптов IPB.

Link to comment
Share on other sites

Нужно конфиги формирования индекса сфинкса смотреть и запросы к апи сфинкса, которые выдергивают айдишки найденных постов из индекса. И да, если у вас критерию поиска соотвествует 2000 постов, а у сфинкса указан лимит выдачи 1000, то он выдаст всего 1000.

Link to comment
Share on other sites

Конфиг совершенно стандартный - тот, что генерируется в админке:

 

 

#############################################################################

## searchd settings

#############################################################################

 

searchd

{

listen = localhost:3312

log = /var/log/sphinx/searchd.log

query_log = /var/log/sphinx/query.log

read_timeout = 5

max_children = 30

pid_file = /var/run/sphinx/searchd.pid

max_matches = 1000

seamless_rotate = 0

preopen_indexes = 0

unlink_old = 1

}

 

# --eof--

 

 

 

@danilka, интересная мысль. Действительно, max_matches = 1000. Попробую увеличить. Может поможет.

А вот с блогами можно поподробнее, как мне это сделать?

 

@siv1987, если я правильно понимаю, при клике по "Найти весь контент" поиск осуществляется без использования сфинкса прямым запросом по id юзера, потому выдает полный и правильный ответ. А если я ищу по нику автора поста, то используется сфинкс.

 

Сейчас посчитал количество результатов - и вправду ровно 1000.

Link to comment
Share on other sites

И sphinx и SQL поиск имеют методы viewNewContent и viewUserContent. И если выбран сфинкс как поисковой движок, искать должен сфинкс. Не ищет он в новых публикациях если в настройках поиска выбрано "Новые публикации должны использовать только SQL".

viewUserContent еще использует настройку - Ограничить "Темы/Сообщения этого пользователя" результатами за X дней (search_ucontent_days). Хотя она находится в группе сфинкса, используется она также и при SQL поиске (традиционным).

Link to comment
Share on other sites

В админке у меня стоит View New Content: Use SQL Always - Yes. Немножко вводит в заблуждение то, что написано конкретно про View New Content, но, по всей видимости, касается и viewUserContent. Иначе как объяснить разницу в результатах поиска по юзеру.

 

Limit "My Content" results to X days у меня пусто. Не хочу ограничивать.

 

Вообще немного нелогично распределены эти настройки в ACP. Правильноее было бы отделить мух от котлет (настройки, касаемые sql-поиска и sphinx) и сделать блок универсальных настроек, касаемых обоих способов.

 

Поставил max_matches = 20000, переиндексировал. Последние сообщения стали показываться "правильнее", но поиск все равно ограничен 1000 постов. Видимо, ограничения где-то в скриптах.

В блогах по-прежнему пусто.

 

P.S. Кстати, что-то не доходят на gmail.com уведомления об ответах.

Edited by Mac
Link to comment
Share on other sites

Можно объяснить тем, что в одном случае используется обычный метод поиска, в другом метод viewUserContent (хотя из ограничений там только search_ucontent_days).

 

Лимиты у сфинкса есть в /admin/applications/forums/extensions/search/engines/sphinx.php

return array( 'count' => intval( $result['total_found'] ) > 1000 ? 1000 : $result['total_found'], 'resultSet' => $search_ids );

 

Для традиционного поиска в /admin/applications/forums/extensions/search/engines/sql.php

Link to comment
Share on other sites

Изменил лимиты в коде. Появился баг: когда делаю поиск по нику юзера, ссылка перехода на последнюю страницу результатов кидает на первую страницу.

 

Опытным путем обнаружил, что пагинация действительно доходит до 40 страницы, а при попытке попасть на 41-ю, кидает на первую.

  • Upvote 1
Link to comment
Share on other sites

Залез в БД, в таблице ipb_core_sys_conf_settings изменил опцию search_hardlimit, добавив две доп. строчки:

100=100
200=200
300=300
400=400
500=500
1000=1000
10000=10000
20000=20000

В настройках выставил 20000. Также в настройках указал лимит в днях на 10 лет. Изменилась только надпись в результатах поиска:

(Поиск ограничен от 07-Сентябрь 04)

Но на 41 страницу по-прежнему не переходит.

 

Про изменение лимитов в БД подглядел на другом форуме (да простят меня админы за ссылку). Странно, что там человеку это помогло (правда, он юзал обычный поиск).

Link to comment
Share on other sites

search_hardlimit (Ограничить результаты поиска по темам и сообщениям) используется только для SQL поиска.

 

		/* Hard limit - not used in Sphinx but may need to revisit if we bust IN()s */
	//IPSSearchRegistry::set('set.hardLimit', ( ipsRegistry::$settings['search_hardlimit'] ) ? ipsRegistry::$settings['search_hardlimit'] : 200 );

Трудно вслепую что-то подсказать, не зная даже где происходит этот редирект. Сфинксом к сожалению не пользуемся.

 

Залез в БД, в таблице ipb_core_sys_conf_settings изменил опцию search_hardlimit, добавив две доп. строчки:

Или SQL запросом:

 

UPDATE core_sys_conf_settings SET conf_extra="100=100
200=200
300=300
400=400
500=500
1000=1000
2000=2000
3000=3000
4000=4000
5000=5000
10000=10000
15000=15000
20000=20000"
WHERE conf_key='search_hardlimit'

Link to comment
Share on other sites

А попробуйте отредактировать значение для $this->_maxmatches в ./sphinxapi.php

Либо установить его из настроек поиска форума (search_hardlimit) в /admin/applications/forums/extensions/search/engines/sphinx.php

После

	parent::__construct( $registry );

Добавив

 

	$this->sphinxClient->SetLimits( 0, 1000, $this->settings['search_hardlimit'] );

  • Upvote 1
Link to comment
Share on other sites

Вроде я уже пытался менять это значение, но не помогало. Видимо, это надо было делать в связке с предложенными выше изменениями кода движка. Сейчас увеличил $this->_maxmatches в ./sphinxapi.php с 1000 до 20000 - наконец-то стало кидать на последнюю страницу. Правда, остальные результаты по-прежнему неадекватные: первыми идут два поста за сегодня, а следом за 29 августа. Т.е. посты за последнюю неделю куда-то пропали из хронологии, да и дальше идут результаты с большими пробелами.

 

Вообще очень по-дурацки сделана даже сортировка результатов - можно отсортировать результаты только по дате последнего обновления, но не по дате создания. А сортировки по имени, просмотрам, ответам - нафига это вообще нужно? 10 лет занимаюсь форумами, и вот ни разу не возникало необходимости сортировки по этим полям. Вообще чем больше копаюсь в IPB, тем меньше понимаю, как эти ребята с их напрочь потерянной логикой вообще смотгли создать такой известный продукт. По уровню логичности тот же старый phpBB выше на голову.

 

Добавлено позже

 

Вроде догнал наконец эту больную логику. Дело в том, что при поиске по имени автора результаты сортируются по дате последнего обновления в той теме, где этот юзер написал. Это ж надо было догадаться до такого! Т.е. если у вас на форуме есть огромная регулярно обновляемая тема (например, какие-нибудь "Мысли вслух"), где искомый юзер хотя бы раз отписался, то этот его пост будет постоянно маячить наверху результатов поиска, даже если пост был написал много лет назад, как ты ни сортируй. А если этот человек написал там не один пост, то все эти посты забьют все первые строчки результатов поиска. Сортировка указана "По дате последнего обновления".

 

Прикол в том, что если искать через профиль "Найти контент", то несмотря на тот же тип сортировки "По дате последнего обновления" результаты будут отсортированы по дате создания поста. ТП напрочь стоит на своем, дескать, все правильно, и так было задумано.

 

Очень интересует вопрос, как можно нафиг выпилить из движка эту идиотскую функцию сортировки по дате последнего обновления, и добавить вместо него сортировку по дате создания?

 

Кстати, вот еще прикол:

 

h_1409971921_2397524_5fc034c292.png

 

У меня форум с 2007 года, и этот год здесь выбрать невозможно, зато из 2020 пожалуйста. Я, конечно, понимаю, что можно и вручную вписать, но нафига такой недоделанный datepicker было вообще добавлять.

Edited by Mac
Link to comment
Share on other sites

По уровню логичности тот же старый phpBB выше на голову.

По своему уровню старый phpbb унылое гавно, потому что кроме одной функции там ничего другого нету. Говорить об "логичности" в данном случае довольно затруднительно в ввиду отсутствия равномерного с ИПБ функционала. Чем крупнее проект тем сложнее логика, ну и конечно, обязательно найдется кто-то у которого она не совпадает с его представлениями о логичности, это неизбежно.

 

Вроде догнал наконец эту больную логику.

Темы могут сортироватся либо по дате последнего сообщения в них, либо по дате искомого поста. Если сортировать по дате последнего сообщения темы, результат будет составлять из часто обновляемых тем. Если сортировать по дате поста, темы будут перемешены из-за разницы в дате между последним сообщением и опять будут кричать что находятся не все темы. Старая тема http://ipbskins.ru/forum/topic6990.html

Link to comment
Share on other sites

либо по дате последнего сообщения в них, либо по дате искомого поста
А это где? У меня только по дате последнего обновления (в теме, по всей видимости).

 

post-56753-0-99663400-1409990134_thumb.png

Link to comment
Share on other sites

Наконец-то удалось решить проблему разницы в сортировке при поиске по постам юзера из профиля и из общей формы поиска. В файле /admin/applications/forums/extensions/search/engines/sphinx.php находим:

/* Sorting */
switch( $sort_by )
{
default:
case 'date':
	$sortKey     = 'last_post';
	$sortKeyPost = 'post_date';

и последние две строчки заменяем на

$sortKeyPost = $sortKey = 'post_date';

Теперь сортировка результатов поиска будет по дате создания поста, а не по дате последнего сообщения в теме, где этот пост находится.

 

Осталась последняя проблема с поиском по блогам, который через Sphinx не работает вообще. Подскажите, где копать?

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...