Модуль поиска: как проиндексировать контk

Обсуждение CMS Made Simple в России.

Moderators: iturbay, wdwp

Post Reply
Eugene_K
New Member
New Member
Posts: 6
Joined: Sun Jun 28, 2009 7:37 pm

Модуль поиска: как проиндексировать контk

Post by Eugene_K »

Здравствуйте все!

Пишу свой модуль.
Состоит из 2х таблиц, 1 из них - таблица для фронтенда.
Хочу, чтобы стандартный поиск по сайту индексировал контент моего модуля.
Кто-нибудь сталкивался с подобной задачей?
я новичок в php и smarty и не совсем могу понять как работает модуль search.

нашёл вот такую статью:
http://forum.cmsmadesimple.org/index.php?topic=33025.0

там приводится вызов функции addwords - но там не прокомментировано толком инчего и параметры вызывают вопросы...

словом, если кто разбирался - сообщите свои соображения.
Sonya

Re: Модуль поиска: как проиндексировать контk

Post by Sonya »

Eugene_K wrote: Пишу свой модуль.
Состоит из 2х таблиц, 1 из них - таблица для фронтенда.
Хочу, чтобы стандартный поиск по сайту индексировал контент моего модуля.
.....
словом, если кто разбирался - сообщите свои соображения.
API для модуля search. Объяснение на английском, так как копирую из своих "запасников"

1. Immediately after an entry relevant for search is added to the database (or updated in database!) in the custom module, do add search words for this entry to the standard Search module

Code: Select all

//Update search index
    $module =& $this->GetModuleInstance('Search');
    if ($module != FALSE)
    {
      $content = $field1. ' '. $field2; 
      $module->AddWords($this->GetName(), $id, 'mymodule', $content, NULL);
      /**
       *  AddWords
       *  @module string name of used Search module, 'Search' by default for standard Search module
       *  @id integer id of the entry to build link to it from search result
       *  @attr string unique name of the custom module for the entry to build link to it from search results
       *  @content string any fields that contain text relevant for search
       *  @expires date if the content has to expire 
       */
      // AddWords($module = 'Search', $id = -1, $attr = '', $content = '', $expires = NULL)
    } 
1a. Immediately after entry is deleted from custom module, delete it from Search module as well

Code: Select all

        // delete from Search
        $module =& $this->GetModuleInstance('Search');
        if ($module != FALSE)
        {
          $module->DeleteWords($this->GetName(),$id, 'mymodule');
        }
2. Add API function to Mymodule.module.php that is called from standatd Search module to display search results

Code: Select all

 function SearchResult($returnid, $entryid, $attr = '') {
   if( $attr == 'mymodule' )
    {
      $db =& $this->GetDb();
      $q = 'SELECT * FROM '.cms_db_prefix().'module_mytable
             WHERE id = ?';
      $row = $db->GetRow($q,array($entryid));
      if( $row )
        {
          $result[0] = $this->GetFriendlyName(); // the prefix displayed in the list results
          $result[1] = $row['field1']; // the title in the search results
          
          // this should create a link from search result to the found entry
          $result[2] = $this->CreateLink('cntnt01','default',$returnid,
                                         $row['field1']);
          
        }
    }
    return $result;
    }
This function should return $result as Array as shown above.

3. Add function SearchReindex that is called from standard Search module when search index is reindexed
   

Code: Select all

    function SearchReindex(&$module) {
    $db =& $this->GetDb();
    $query = 'SELECT * FROM '.cms_db_prefix().'module_mytable';
    $result =& $db->Execute($query);
    
    while( $result && !$result->EOF )
    { 
      $row =& $result->fields;
      $module->AddWords($this->GetName(),$row['field1'],'mymodule',
               $row['content']);
      $result->MoveNext();
    }
    $result->Close();
  }

Если кому не лень перевести это на русский, милости прошу, закину на cmsmadesimple.ru и добавлю Ваше честное имя с Вашей любимой ссылкой :)
Last edited by Sonya on Sun Aug 16, 2009 11:03 am, edited 1 time in total.
Eugene_K
New Member
New Member
Posts: 6
Joined: Sun Jun 28, 2009 7:37 pm

Re: Модуль поиска: как проиндексировать контk

Post by Eugene_K »

Спасибо Соня, что отозвались на мой вопрос.

Буду реализовывать. Как только сделаю - напишу перевод текста, который вы выложили и выложу сюда же.

Спасибо!
Eugene_K
New Member
New Member
Posts: 6
Joined: Sun Jun 28, 2009 7:37 pm

Re: Модуль поиска: как проиндексировать контk

Post by Eugene_K »

Соня, и все, кто в теме.. буду очень признателен, если разъясните..

########### Вопрос номер Раз:

      $content = $field1. ' '. $field2;

не понмаю что должнобыть $field1 и $field2 ?

Инструкция:
1. Immediately after an entry relevant for search is added to the database (or updated in database!) in the custom module, do add search words for this entry to the standard Search module
т.е. вот как я перевёл это для себя:
1. Сразу после того, как запись, относящаяся к поиску, добавлена в базу данных (или обновлена в базе данных!) в вашем собственном модуле, вызовите функцию AddWords стандартного модуля Поиска для этой записи.

Правильно?.. Но всё равно полного понимания где именно в своём модуле я должен вызвать AddWords - нет. Я вызываю её после того, как отобразил контент, а именно, у меня выглядит так:

Code: Select all

DisplayStarsTable($identity, $query1); //Вызываю функцию, отображающую контент

//Update search index
    $module =& $this->GetModuleInstance('Search');
    if ($module != FALSE)
    {
      $content = $field1. ' '. $field2; 
      $module->AddWords($this->GetName(), $id, 'starsshop', $content, NULL);

    }
Идём дальше.
1a. Immediately after entry is deleted from custom module, delete it from Search module as well
Перевожу:

Немедленно сразу после того, как запись удалена из вашего модуля, удалите её из модуля Поиска.
Хм. т.е. код я должен разместить в своём модуле там, где присутствует удаление контента (если присутствует). Так я понял?
Если да - то пока пропускаю и не использую эту штуку.
2. Add API function to Mymodule.module.php that is called from standatd Search module to display search results
Добавьте API функцию в ваш модуль (вашеимяфайла.module.php). Эта АПИ функция вызывается модулем Поиска для того, чтобы показать результаты поиска.

Таким образом, я ввёл у себя следующее:

Code: Select all

 function SearchResult($returnid, $entryid, $attr = '') {
   if( $attr == 'starsshop' )
    {
      $db =& $this->GetDb();
      $q = 'SELECT * FROM '.cms_db_prefix().'module_starsshop_products
             WHERE id = ?';
      $row = $db->GetRow($q,array($entryid));
      if( $row )
        {
          $result[0] = $this->GetFriendlyName(); // the prefix displayed in the list results
          $result[1] = $row['field1']; // the title in the search results
          
          // this should create a link from search result to the found entry
          $result[2] = $this->CreateLink('cntnt01','default',$returnid,
                                         $row['field1']);
          
        }
    }
    return $result;
    }

далее вы пишите:
This function should return $result as Array as shown above.
Т.е. Эта функция должна вернуть array $result (как показано выше).

Хм. Не совсем понятно кто и что должен делать потом с этим $result - Search сам делает с ним что-то?
В файле Search.module.php я не нашёл вызова функции SearchResult, в файле action.dosearch.php нашёл вот это:

Code: Select all

$searchresult = $moduleobj->SearchResult( $returnid,
                                                                    $result->fields['content_id'],
                                                                    $result->fields['extra_attr']);

Но это тоже не очень прояснило ситуацию мне...

Ладно, закрыл пока на это непонимание глаза, иду дальше:

3. Add function SearchReindex that is called from standard Search module when search index is reindexed
   
Добавьте функцию SearchReindex, которая вызывается из стандартного модуля Поиска, когда поисковый индекс реиндексируется.

Хорошо, добавляю эту функцию:
    function SearchReindex(&$module) {
    $db =& $this->GetDb();
    $query = 'SELECT * FROM '.cms_db_prefix().'module_starsshop_products';
    $result =& $db->Execute($query);
   
    while( $result && !$result->EOF )
    {
      $row =& $result->fields;
      $module->AddWords($this->GetName(),$row['field1'],'starsshop',
              $row['content']);
      $result->MoveNext();
    }
    $result->Close();
  }
в связи с ней

########### Вопрос номер Два:

в Search.module.php вижу следующее:

Code: Select all

	    if (method_exists($gCms->modules[$key]['object'], 'SearchReindex'))
	      {
		$gCms->modules[$key]['object']->SearchReindex($this);
	      }
Это наводит на мысль, что надо использовать параметр modules, при вызове модуля Search. Делаю так:
{search lang='ru_RU' searchtext='Введите текст' modules='starsshop, search'}
Правильно, или нет?..

Словом, непонмание ещё осталось, а в связи с этим, результат поиска по моему контенту, конечно, нулевой.

Если можете направить мысль в нужную сторону - буду премного благодарен.

Спасибо всем, кто хотя бы дочитал до сюда. :)
Sonya

Re: Модуль поиска: как проиндексировать контk

Post by Sonya »

Eugene_K wrote: ########### Вопрос номер Раз:

      $content = $field1. ' '. $field2;

не понмаю что должнобыть $field1 и $field2 ?
Поле (или поля) в которых находится текст, который релевантен для поиска. Допустим, title и content записи в модуле.
Eugene_K wrote: Но всё равно полного понимания где именно в своём модуле я должен вызвать AddWords - нет. Я вызываю её после того, как отобразил контент
Отображение контента не играет никакой роли. В инструкции стоит, сразу же после того, как запись добавлена в базу данных (INSERT) или изменена в базе данных (UPDATE).
Eugene_K wrote: Хм. Не совсем понятно кто и что должен делать потом с этим $result - Search сам делает с ним что-то?
Да, сам. На то это и API, чтобы не лазить в другие модули :)
Eugene_K wrote: ########### Вопрос номер Два:

в Search.module.php вижу следующее:

Code: Select all

	    if (method_exists($gCms->modules[$key]['object'], 'SearchReindex'))
	      {
		$gCms->modules[$key]['object']->SearchReindex($this);
	      }
Это наводит на мысль, что надо использовать параметр modules, при вызове модуля Search:
Мысль неверная, функция используется только для переиндексации поиска и к самому поиску отношения не имеет.
Post Reply

Return to “Russian - русский”