Кому то удавалось при жизни? Вроде очевидная вещь, но у меня упорно возвращает не всю фразу а только слово из неё. Бился день над этим. Желательно без написания класса на Java, этим никогда не занимался :/
Пример того, что нужно: в индексе есть поле ss_my_title, в нём текст 'Мама мыла раму мылом'
Юзеринпут скажем 'ма', возвращает 'мама', а нужно 'Мама мыла раму мылом'
Не предлагайте модуль Apache Solr Autocomplete
Комментарии
Делал отдалённо похожее здесь - http://computerbild.ru/questions - на вкладке "Задать вопрос" после авторизации показывается форма задания вопроса, в которую возвращаются похожие вопросы в виде заголовка вопроса, залинкованного на этот похожий вопрос.
Реализовано в виде кастомного MLT search listener в конфиге самого солра, которому кормятся введённые на форме слова - и он возвращает заголовки и ссылки совпавших вопросов. Плюс джаваскрипт - http://computerbild.ru/sites/all/modules/custom/cobi_helpcomm/js/cobi_he... - и меню колбек...
search listener из стандартных компонентов или самопись? xml конфига можно ли увидеть? Я так понял под словом ("которому кормятся введённые на форме слова") имеется ввиду словарь?
Чёрт, неужели нет чего нибудь простого, вроде ж очевидная фича.
http://solr.pl/en/2010/11/15/solr-and-autocomplete-part-2/
Suggesting phrases
To implement the entire phrase suggestions our text_autocomplete type should be defined as follows:
<?php
<fieldType class="solr.TextField" name="text_auto">
<analyzer>
<tokenizer class="solr.KeywordTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType> ?>
If you want to use phrases you may want to define your own query converter.
Очевидно нужно писать этот "query converter", знать бы как
План-максимум выводить из запроса не одно поле, а несколько, чтобы показывать не только тайтл но и скажем тизер и картинку товара,
стандартный, не самопись, только конфиг для него самопись
да, можно. как домой доберусь - скину
нет, не словарь... целиком индекс. жди конфига в общем
без проблем, можно будет вывести всё, что захочется (запросить в ответе от солра нужные поля, которые есть в его индексе; либо по ответу позвать ещё какие-нить дру-фукнции, которые догрузят то, что нужно)
Ок, жду конфига
Вижу разбираешься по теме, вопрос по мультиязычности: я решил так:
При индексировании, через hook_apachesolr_index_documents_alter() , добавил для каждого солр соответсвующие варианты путём добавления суффикса в название, например обычное поле ss_field_string имеет языковые версии ss_field_string_i18nuk - для украинского, ss_field_string_i18nru - для русского
далее, через hook_apachesolr_query_alter отбираем с нужным суффиксом
Встречал ли более человеческое решение?
Файл конфига - тебя интересует вот это:
<lst name="defaults">
<str name="mlt.minwl">3</str>
<str name="mlt.mindf">1</str>
<str name="fl">url,label,score</str>
<str name="mlt.boost">true</str>
<str name="mlt.mintf">1</str>
<str name="mlt.maxwl">15</str>
<str name="mlt.maxqt">20</str>
<str name="sort">score desc</str>
<str name="start">0</str>
<str name="rows">5</str>
<str name="mlt.interestingTerms">details</str>
<str name="echoParams">all</str>
<str name="mlt.fl">content,label</str>
<str name="fq">bundle:question</str>
<!-- Abort any searches longer than 1.5 seconds -->
<!-- <int name="timeAllowed">1500</int> -->
</lst>
</requestHandler>
Далее, у себя в колбеке, на который джаваскрипт (ссылка на джаваскрипт выше) шлет пост запрос:
<?php
function cobi_helpcomm_menu() {
$items = array();
$items['cobi_helpcomm/ajax/suggestions'] = array(
'page callback' => 'cobi_helpcomm_suggestions_callback',
//'access callback' => 'user_access',
'access arguments' => array('cobi_helpcomm ask'),
'type' => MENU_CALLBACK,
);
return $items;
}
function
cobi_helpcomm_suggestions_callback() {$docs = cobi_helpcomm_mlt_suggestions($_POST['text']);
print theme('cobi_helpcomm_suggestions', array('docs' => $docs));
exit;
}
function
cobi_helpcomm_mlt_suggestions($text) {try {
$params = array(
'qt' => 'mlt_cobi_helpcomm',
'fl' => array('entity_id', 'entity_type', 'label', 'path', 'url', 'score'),
//'start' => 0,
//'rows' => 5,
'stream.body' => $text,
);
$query = apachesolr_drupal_query('apachesolr_mlt', $params);
$response = $query->search();
if ($response->response) {
$docs = (array) end($response->response);
return $docs;
}
}
catch (Exception $e) {
watchdog('Apache Solr', nl2br(check_plain($e->getMessage())), NULL, WATCHDOG_ERROR);
}
}
?>
С мультиязычностью не работал (тем более в связке с солром), так что тут не подскажу (кроме как посмотреть на apachesolr_multilingual).
ОО, круто, завтра и попробую, спасибо!
Я вот думаю, имеет ли смысл кэшировать локально предлагаемые результаты по ключевикам? Скажем введённые фразы шифровать через base_64 - это будет ключом кэша. Или сам солр намного быстрее работает?
Солр сам кэширует запросы (насколько я помню это тоже задаётся какими-то опциями конфига, про это можно найти более подробную инфу, например в этой книжке - http://rutracker.org/forum/viewtopic.php?t=3864005), так что не думаю, что это как-то ускорит работу (во всяком случае точно не стал бы это делать в первой итерации).
После некоторых размышлений - suggester тебе тут точно не поможет, он работает по спелчек словарю (обычно), либо по файлу слов, либо ещё по какому-то списку слов, но никак не фраз (тайтлов). Ты хочешь получать в ответе "документы" из индекса (с пристёгнутыми к ним картинками...), а не предложения слов (или популярных поисковых фраз).
MLT тоже не совсем катит здесь - он не возвращает результаты по части слов (хорош именно для поиска текстов, похожих на введённый текст)... Нужно курить книжку, на которую ссылку дал выше. Там есть такой вот пример, основанный на фасетах:
There are plenty of web-based applications that help the users choose what they want to
search for. One of the features that helps users is the autocomplete (or autosuggest) feature—
like the one that most of the commonly used world search engines have. Let's assume that
we have an e-commerce library and we want to help a user to choose a book title—we want to
enable autosuggest on the basis of the title. This recipe will show you how to do that.
Спасибо, книга и впрямь полезная