[Решено] Неполная индексация, модуль sphinxsearch

Главные вкладки

Аватар пользователя CSoft CSoft 10 ноября 2011 в 15:34

Очень странно ведёт себя сфинкс Sad Сижу на хостинге it-patrol, там sphinx установлен.

Ставлю модуль sphinxsearch, всё индексируется, всё в порядке. Нод у меня чуть больше 4к. При попытке поиска обнаруживаю, что очень много нод просто не находится Sad

Элементарный пример. Есть 28 нод, у которых в заголовке присутствует слово Margoroli. Из них он находит и показывает мне только 10 Sad Не понимаю, что за логика такая? Все 28 нод идентичны, с какой стати такой отбор происходит?

Смотрю у модуля вкладку Check connection. Там по индексации такая информация:

Total results found: 1609
Total results available: 1000
Last indexed node: 5301 (2011-11-09 12:58:14)

Да, последняя нода у меня имеет nid = 5301. А что значат первые 2 строки?

Поделитесь опытом, пожалуйста, почему поиск так плохо проиндексировал сайт? Sad

UPD: дело в конфигах сфинкса на хостинге. Нужно их перенастраивать более правильно...

Комментарии

Аватар пользователя CSoft CSoft 13 ноября 2011 в 19:42

"niko" wrote:
Выходные все таки :)

Да-да, я так и подумал Smile

"niko" wrote:
Ответил и поправил

Огромное Вам человеческое спасибо!!! Если посчитаете нужным - можно скопировать ответ и сюда, очень познавательно Smile

Аватар пользователя AndreyL AndreyL 20 ноября 2011 в 1:44

конечно, скопировали бы. м.б. пригодится. у меня такая же проблема, но со стандартным модулем. 1900 (чуть больше) материалов не индексирует.

Аватар пользователя CSoft CSoft 20 ноября 2011 в 1:50

"AndreyL" wrote:
у меня такая же проблема, но со стандартным модулем

Эти модули вообще никак не связаны, даже самой тонкой ниточкой в мире. Поэтому, Вам придётся решать проблему не в этой теме точно.

"AndreyL" wrote:
1900 (чуть больше) материалов не индексирует.

Мои 5 тысяч материалов до этого были проиндексированы стандартным модулем без каких-либо проблем. Что-то делаете не так.

Аватар пользователя niko niko 21 ноября 2011 в 4:41

Был в отпуске, потому слегка с задержкой, но публикую по просьбе ТС мои ответы на данный вопрос в немного перегруперованном, но по сути верном виде.

Кому будет полезно - пользуйтесь

коротко суть вопроса

На сайте около 5000 нод при этом после установки и базовой настройки модуля не все материалы сайта попадают в индекс. При увеличении количества нод в индексе индексация не проходит т.к. парсер вылетает по причине нехватки памяти .
На сайте установлен и настроен пользователем доработанный с целью повышения юзабилити модуль sphinxsearch.

Далее выдержки из переписки относящиеся к сути вопроса.
TC - топик стартер
Support - мой ответ

ТС:

Останавливаю демон сфинкса. Запускаю полную индексацию. Получаю:

using config file 'sphinx.conf'...
indexing index 'index_main0'...
collected 1589 docs, 1.8 MB
collected 0 attr values
sorted 0.0 Mvalues, nan% done
sorted 4.5 Mhits, 98.3% done
total 1589 docs, 1799974 bytes
total 1.933 sec, 930740 bytes/sec, 821.64 docs/sec
total 2 reads, 0.010 sec, 9195.9 kb/call avg, 5.2 msec/call avg
total 49 writes, 0.062 sec, 923.9 kb/call avg, 1.2 msec/call avg

Пишет, что всего полторы тысячу документов, а у меня на сайте их под пять тысяч вообще....

Support:

>> total 1589 docs, 1799974 bytes

это количество материалов в индексе а не на сайте.

Необходимо добавить source и index и добавить index в join_index в конфигурации сфинкса.

Я добавил source в конфигурацию сфинкса для сайта. Делал это не через админку а редактируя конфигурационный файл непосредственно.

source source_main0
{
type = xmlpipe
xmlpipe_command = /usr/bin/lynx -source http://domain.ru/sphinxsearch_scripts/sphinxsearch_xmlpipe.php?mode=main\&id=0\&first_nid=1\&last_nid=2000
}

source source_main1 : source_main0
{
type = xmlpipe
xmlpipe_command = /usr/bin/lynx -source http://domain.ru/sphinxsearch_scripts/sphinxsearch_xmlpipe.php?mode=main\&id=1\&first_nid=2001\&last_nid=3500
}

source source_main2 : source_main0
{
type = xmlpipe
xmlpipe_command = /usr/bin/lynx -source http://domain.ru/sphinxsearch_scripts/sphinxsearch_xmlpipe.php?mode=main\&id=2\&first_nid=3501\&last_nid=5000
}
source source_main3 : source_main0
{
type = xmlpipe
xmlpipe_command = /usr/bin/lynx -source http://domain.ru/sphinxsearch_scripts/sphinxsearch_xmlpipe.php?mode=main\&id=3\&first_nid=5001\&last_nid=6500
}
source source_delta : source_main0
{
xmlpipe_command = /usr/bin/lynx -source http://domain.ru/sphinxsearch_scripts/sphinxsearch_xmlpipe.php?mode=delta
}

обратите внимание на first_nid=2001 и last_nid=3500 в каждом source

это первый nid (номер ноды в друпал базе) и последний соответственно.

также для каждого из source добавил индекс

index index_main3 : index_main0
{
source = source_main3
path = index/main3
}

и индексы добавил в распределенный индекс

index index_join
{
type = distributed
local = index_main0
local = index_main1
local = index_main2
local = index_main3
local = index_delta
}

Модуль по умолчанию в main индекс добавляет ноды с nid c 1 до 2000 все остальные должно попадать в дельта индекс (по мере появления на сайте) однако так как нод слишком много и при первой индексации дельта индекса (у Вас 1500 нод попало в main индекс а на сайте 5000 нод, 3500 нод должно попасть в дельта индекс) для первичной индексации 3500 нод в дельта индекс не хватает памяти php_memory_limit

Соответственно дельта не создается и ноды не попадают в индекс и в поиск.

для обхода этой проблемы main индекс делается распределенным
index_main0 index_main1 index_main2 index_main3 каждая из частей делается со своим диапазоном nid

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

Delta индекс отличается от основного тем что при индексации нельзя ограничить диапазон нод которые попадают в него. Соответственно в него попадают все обновленные и новый ноды на сайте.

ТС:

Запускаю демон, получаю:

[Thu Nov 10 20:02:12.078 2011] [31656] using config file '/home/u4328/sphinx/dom-san.ru/config/sphinx.conf'...
[Thu Nov 10 20:02:12.078 2011] [31656] listening on UNIX socket /home/u4328/sphinx/dom-san.ru/socket/sphinx.s
[Thu Nov 10 20:02:12.080 2011] [31656] WARNING: index 'index_main0': mlock() failed: Cannot allocate memory
[Thu Nov 10 20:02:12.080 2011] [31656] WARNING: index 'index_delta': mlock() failed: Cannot allocate memory

Support:

параметр mlock=1 служит для предзагрузки индексов в память, это повышает производительность. Когда памяти не хватает ругается вот таким образом. Единственное решение у нас на хостинге (кроме выделенных серверов) - закоментировать опцию если варнинг появляется. - разницы в производительности на таком объеме данных практически нет.
Закомментировал.
Вот документация по опции http://sphinxsearch.com/docs/1.10/conf-mlock.html

Дополню свой ответ только, тем что на данный момент производится дальнейшая доработка модуля чтобы он мог конфигурироваться из админки сайта в независимости от количества материалов на сайте.
Этот пост не инструкция по настройке сфинкса а скорее дополнение к этой инструкции

Аватар пользователя niko niko 21 ноября 2011 в 4:58

"AndreyL" wrote:
конечно, скопировали бы. м.б. пригодится. у меня такая же проблема, но со стандартным модулем. 1900 (чуть больше) материалов не индексирует.

Топик о индексации сфинксом и действительно стандартный модуль поиска друпала отлично справиться с индексацией такого количества нод как у Вас. Весь смысл sphinx в том, что поисковый индекс выносится за пределы БД друпала и поиск на сайте отдается инструменту, который специально спроектирован для этой задачи.

таким образом решается несколько задач

1. снижается нагрузка на БД для сайтов с большим количеством нод
2. ускоряется поиск на сайте для пользователя
3. Снижается нагрузка на сервер в целом.

Оправдано или нет использование Sphinx зависит от того насколько большой индекс и насколько часто пользователи на сайте пользуется поиском.

По Вашему вопросу соглашусь с ТС - что то делаете не так - смотрите dblog думаю там найдете ответ или подсказку куда копать.

Аватар пользователя AndreyL AndreyL 23 ноября 2011 в 13:59

ок. индексация у меня прошла; но вывод материалов (настроенный через шаблоны - запрос к БД в template, в поле body) не индексируется. как это можно исправить? или в сфинксе эта функция присутствует по умолчанию? я пытался подключить solr, но никаких плюсов (в плане полноты индексации) в нем нет; как и раньше, гугл с яндексом индексируют на порядок (если не на несколько) полнее.