Apache Solr Suggester: вернуть suggestion в виде полной фразы

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

Аватар пользователя volocuga@drupal.org volocuga@drupal.org 13 июня 2013 в 14:07

Кому то удавалось при жизни? Вроде очевидная вещь, но у меня упорно возвращает не всю фразу а только слово из неё. Бился день над этим. Желательно без написания класса на Java, этим никогда не занимался :/

Пример того, что нужно: в индексе есть поле ss_my_title, в нём текст 'Мама мыла раму мылом'

Юзеринпут скажем 'ма', возвращает 'мама', а нужно 'Мама мыла раму мылом'

Не предлагайте модуль Apache Solr Autocomplete

Комментарии

Аватар пользователя duozersk duozersk 13 июня 2013 в 16:47

Делал отдалённо похожее здесь - http://computerbild.ru/questions - на вкладке "Задать вопрос" после авторизации показывается форма задания вопроса, в которую возвращаются похожие вопросы в виде заголовка вопроса, залинкованного на этот похожий вопрос.
Реализовано в виде кастомного MLT search listener в конфиге самого солра, которому кормятся введённые на форме слова - и он возвращает заголовки и ссылки совпавших вопросов. Плюс джаваскрипт - http://computerbild.ru/sites/all/modules/custom/cobi_helpcomm/js/cobi_he... - и меню колбек...

Аватар пользователя volocuga@drupal.org volocuga@drupal.org 13 июня 2013 в 17:05

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", знать бы как Smile

Аватар пользователя volocuga@drupal.org volocuga@drupal.org 13 июня 2013 в 17:07

План-максимум выводить из запроса не одно поле, а несколько, чтобы показывать не только тайтл но и скажем тизер и картинку товара,

Аватар пользователя duozersk duozersk 13 июня 2013 в 17:32

"<a href="mailto:volocuga@drupal.org">volocuga@drupal.org</a>" wrote:
search listener из стандартных компонентов или самопись?

стандартный, не самопись, только конфиг для него самопись
"<a href="mailto:volocuga@drupal.org">volocuga@drupal.org</a>" wrote:
xml конфига можно ли увидеть?

да, можно. как домой доберусь - скину
"<a href="mailto:volocuga@drupal.org">volocuga@drupal.org</a>" wrote:
Я так понял под словом ("которому кормятся введённые на форме слова") имеется ввиду словарь?

нет, не словарь... целиком индекс. жди конфига в общем Smile
"<a href="mailto:volocuga@drupal.org">volocuga@drupal.org</a>" wrote:
План-максимум выводить из запроса не одно поле, а несколько, чтобы показывать не только тайтл но и скажем тизер и картинку товара,

без проблем, можно будет вывести всё, что захочется (запросить в ответе от солра нужные поля, которые есть в его индексе; либо по ответу позвать ещё какие-нить дру-фукнции, которые догрузят то, что нужно)

Аватар пользователя volocuga@drupal.org volocuga@drupal.org 13 июня 2013 в 18:24

Ок, жду конфига

Вижу разбираешься по теме, вопрос по мультиязычности: я решил так:
При индексировании, через hook_apachesolr_index_documents_alter() , добавил для каждого солр соответсвующие варианты путём добавления суффикса в название, например обычное поле ss_field_string имеет языковые версии ss_field_string_i18nuk - для украинского, ss_field_string_i18nru - для русского

далее, через hook_apachesolr_query_alter отбираем с нужным суффиксом

Встречал ли более человеческое решение?

Аватар пользователя duozersk duozersk 10 ноября 2015 в 11:49

Файл конфига - тебя интересует вот это:

  <requestHandler name="mlt_cobi_helpcomm" class="solr.MoreLikeThisHandler">
    <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())), NULLWATCHDOG_ERROR);
  }
}
?>

С мультиязычностью не работал (тем более в связке с солром), так что тут не подскажу (кроме как посмотреть на apachesolr_multilingual).

Аватар пользователя volocuga@drupal.org volocuga@drupal.org 14 июня 2013 в 0:00

Я вот думаю, имеет ли смысл кэшировать локально предлагаемые результаты по ключевикам? Скажем введённые фразы шифровать через base_64 - это будет ключом кэша. Или сам солр намного быстрее работает?

Аватар пользователя duozersk duozersk 14 июня 2013 в 2:00

"<a href="mailto:volocuga@drupal.org">volocuga@drupal.org</a>" wrote:
Я вот думаю, имеет ли смысл кэшировать локально предлагаемые результаты по ключевикам? Скажем введённые фразы шифровать через base_64 - это будет ключом кэша. Или сам солр намного быстрее работает?

Солр сам кэширует запросы (насколько я помню это тоже задаётся какими-то опциями конфига, про это можно найти более подробную инфу, например в этой книжке - http://rutracker.org/forum/viewtopic.php?t=3864005), так что не думаю, что это как-то ускорит работу (во всяком случае точно не стал бы это делать в первой итерации).

Аватар пользователя duozersk duozersk 14 июня 2013 в 12:04

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

MLT тоже не совсем катит здесь - он не возвращает результаты по части слов (хорош именно для поиска текстов, похожих на введённый текст)... Нужно курить книжку, на которую ссылку дал выше. Там есть такой вот пример, основанный на фасетах:

How to implement the autosuggest feature using faceting
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.