СоНоты

Поисковые подсказки с DataparkSearch

Возможность реализации поисковых подсказок при использовании движка DataparkSearch Engine появилась в 2009 году. Для этого в движок был добавлена специальная функция индексирования, которая автоматически для каждого поиндексированного слова строит все его префиксы. Чтобы включить эту опцию в файл конфигурации indexer.conf необходимо добавить команду


MakePrefixes yes


В виду этой особенности, для поисковых подсказок создается отдельная база (имеющая свою отдельную DBAaddr). В остальном эта база конфигурируется аналогично. Пример можно найди в директории doc/samples/ дистрибутива DataparkSearch (файл qsimilar.conf).

Следующим этапом является определение источников, откуда берутся сами подсказки. Первый вариант: создание отдельной таблицы в SQL базе, куда вручную (или как-то иначе, если хотите) заносятся все рекомендуемые подсказки. В примере такая табоицы называется и имеет два поля: rec_id типа serial (уникальный идентификатор) и qwords типа text - собственно сами подсказки.

Соответствующие команды из qsimilar.conf (аналог стандартного indexer.conf) выглядят следующим образом:


HTDBAddr pgsql://user@host.ext/search/
HTDBList "SELECT 'htdb:/hint/'||rec_id FROM hint"
HTDBText query "SELECT qwords FROM hint WHERE rec_id=$2"
HTDBText mode "SELECT 'all'"
HTDBText Pop_Rank "SELECT '0.999999'"
Server path htdb:/hint/

Секция query - это сама подсказка, она будет показана пользователю; секция mode задает режим поиска DataparkSearch при выполнении запроса по этой подсказке; секция Pop_Rank устанавливает приоритет записей из этого источника перед записями из других источников, при прочих равных.

Следующим источником поисковых подсказок может служить таблица логирования поисковых запросов к DataparkSearch хранимая в таблице qtrack, если соответствующая команда DBAaddr содержит параметр trackquery. Очевидным недостатком этого источника является то, что пользователи могут выдавать совершенно любые запросы, и далеко не все будет приятно видеть в качестве подсказок. Какого-либо механизма перлюстрирования этих записей в DataparkSearch Engine нет. Команды, относящиеся к этому источнику в qsimilar.conf выглядят так:


HTDBAddr pgsql://user@host.ext/search/
HTDBList "SELECT 'htdb:/ru/'||MIN(rec_id) FROM qtrack t, qinfo q WHERE q.q_id=t.rec_id AND q.name='tmplt' AND q.value!='suggest.htm' AND found > 0 AND length(qwords) < 128 AND length(qwords) > 2 AND qtime > now()::abstime::int - 40*24*3600 GROUP BY qwords"
HTDBText query "SELECT qwords FROM qtrack WHERE rec_id=$2"
HTDBText mode "SELECT value FROM qinfo WHERE q_id=$2 AND name='m'"
HTDBText Pop_Rank "SELECT '0.75'"
Server path htdb:/ru/

Ну и наконец, если у вас есть каталог сайтов, можно использовать названия сайтов из этого каталога в качестве подсказок.


HTDBAddr pgsql://user@host.ext/com/
HTDBList "SELECT 'htdb:/dir_ru/'||id FROM url_desc WHERE lang='ru' ORDER BY id"
HTDBText query "SELECT url_desc FROM url_desc WHERE id=$2 AND lang='ru'"
HTDBText mode "SELECT 'all'"
HTDBText Pop_Rank "SELECT '0.65'"
RemoteCharset koi8-r
Server path htdb:/dir_ru/

После того, как вы опишите все свои источники, запускайте indexer на индексирование, по окончании его работы база подсказок будет готова к внедрению на страницы результатов вашего основного поиска.


./indexer -TW /usr/local/dpsearch/etc/qsimilar.conf

При реализации поисковых подсказок на страницах результатов поиска используется AJAX-технология. В первоначальном варианте использовался немного модифицированный htmlhttprequest.js, который находится в директории doc/samples. На сегодняшний день, более удобно реализовывать подсказки при помощи библиотеки YUI, разработанной компанией Yahoo!.

Первый шаг модификации поискового шаблона стандартный - добавляем скрипт библиотеки YUI:


<script src="http://yui.yahooapis.com/3.11.0/build/yui/yui-min.js"></script>

В шаблоне janus.htm.ru он загружается в секции bottom, но вы можете перенести загрузку в заголовок, если посчитаете нужным.

Далее необходимо заключить поле ввода запроса в специальный div, по которому будет работать магия YUI:


<div id="demo" class="yui3-skin-sam">
  <input class="inputsearch" type="text" name="q" id="q" size="60" value="$&(q)" style="width:100%;" autocomplete="off">
</div>

Последняя модификация в поисковом шаблоне - вызов функций библиотеки YUI, описывающих, какую магию мы от неё хотим:


<script type="text/javascript">
    YUI().use('autocomplete', 'autocomplete-filters', 'autocomplete-highlighters', 'node-load', function (Y) {
    Y.one('#q').plug(Y.Plugin.AutoComplete, {
    resultFilters    : 'phraseMatch',
    resultHighlighter: 'phraseMatch',
    source           : '/cgi-bin/search.cgi?q={query}&m=any&sp=1&sy=0&GroupBySite=yes&s=IRPD&ps=10&tmplt=yui.htm&label=qsimilar&callback={callback}'
    });
  });
</script>

Последняя деталька - поисковый шаблон yui.htm, который формирует результаты поиска в формате JSON, принимаемом библиотекой YUI в качестве своего источника подсказок.