Apache Solr поиск автозаполнения

Apache Solr поиск автозаполнения

04.10.2016 05:52:01 Просмотров 51 Источник

Я использую поисковую систему apache solr для реализации поиска моего сайта. Я смог настроить модуль поиска Apache Solr, и теперь мой поиск работает так, как мне нужно. Теперь я пытаюсь реализовать автозаполнение поиска с помощью модуля автозаполнения Apache Solr, но дело в том, что я пытаюсь показать названия узлов как список предложений, а не ключевые слова. Наконец, я нашел этот учебник и попробовал это, я, кажется, работаю, но теперь я застрял с ошибкой AJAX HTTP (500). И я нашел 4 сообщения об ошибках в моем журнале ошибок drupal:-

Notice: Undefined index: facet.prefix in apachesolr_autocomplete_suggest() (line 461 of /home/test/webroot/sites/all/modules/apachesolr_autocomplete/apachesolr_autocomplete.module).

Warning: Invalid argument supplied for foreach() in apachesolr_autocomplete_suggest() (line 470 of /home/test/webroot/sites/all/modules/apachesolr_autocomplete/apachesolr_autocomplete.module).

Notice: Trying to get property of non-object in apachesolr_autocomplete_suggest() (line 470 of /home/test/webroot/sites/all/modules/apachesolr_autocomplete/apachesolr_autocomplete.module).

Notice: Undefined property: stdClass::$payslip in apachesolr_autocomplete_suggest() (line 469 of /home/test/webroot/sites/all/modules/apachesolr_autocomplete/apachesolr_autocomplete.module).

Я думаю, что этот учебник почти делает работу, которую мы ищем, к сожалению, они больше не предоставляют поддержку или какой-либо ответ на комментарии. Кто-нибудь может придумать способ реализовать эту классную функциональность? Даже если кто-то придумает лицензионную версию, я с удовольствием куплю. Спасибо, ребята.

Это текущий вид автозаполнения Apache Solr (ниже изображения), в этом списке предложений они перечисляют ключевые слова поиска из индекса поиска. То, что я пытаюсь сделать, - это перечислить названия узлов в этом списке предложений.

enter image description here

У вопроса есть решение - Посмотреть?

https://stackoverflow.com/questions/39843424/apache-solr-search-autocomplete#comment66984721_39843424
Какую версию модуля вы используете? Вы редактировали модуль? В последней версии строка 461 соответствует присвоению переменной ($context).
https://stackoverflow.com/questions/39843424/apache-solr-search-autocomplete#comment66989794_39843424
Ваш правильный, обычно я не переопределяю источник модуля. Но в данном случае у меня нет другого выхода. Поскольку я использую Solr в первый раз, и я не мог найти способ реализовать эту функцию, даже нет платных модулей версии лицензии. Не могли бы вы дать мне несколько советов по реализации этого модуля.
https://stackoverflow.com/questions/39843424/apache-solr-search-autocomplete#comment67217757_39843424
"Я думаю, что этот учебник почти делает работу, которую мы ищем" - что вы хотите сделать, вы хотите, чтобы поисковые статьи искали по названию узла, но отображались только один раз?
https://stackoverflow.com/questions/39843424/apache-solr-search-autocomplete#comment67218679_39843424
Я пытаюсь перечислить заголовок узла в разделе автозаполнения, а не искать по названию узла. Я добавил снимок экрана и еще несколько описаний к вопросу.

Ответы - Apache Solr поиск автозаполнения / Apache Solr search autocomplete

Является ответом!
TED

13.10.2016 03:14:29

Это просто трюк, а не не правильный путь, но вы можете попробовать.

Сначала вы должны захватить запрос Solr, который выполняется при нажатии кнопки Поиск.

Я использую модуль уровня Solr, чтобы поймать запрос. Затем создайте свой собственный модуль с крючками.

/**
 * Implements hook_menu().
*/
function mymodule_menu() {
    $items = array();

    //create a call back for autocomplete search box
    $items['searchauto/autocomplete'] = array(
        'page callback' => 'mymodule_search_autocomplete',
        //'access arguments' => array('access search autocomplete'),
        'type' => MENU_CALLBACK,
        'access arguments' => array('access content'),
    );

    return $items;
}

/**
* hook_form_FORM_ID_alter
* solr search form text box autocomplete
**/
function mymodule_form_search_block_form_alter(&$form, &$form_state, $form_id) {

    $form['search_block_form'] = array(
        '#type' => 'textfield',
        '#autocomplete_path' => 'searchauto/autocomplete',
    );
}

/**
* call back function for autocomplete
**/
function mymodule_search_autocomplete($string) {

    unset($results);
    $results = array();
    $matches = array();

    //replace the space with %20
    $key = preg_replace('/[[:space:]]+/', '%20', $string);
    //number of results you want to show
    $num_result = 15;
    //your Solr server path
    $solr_server = "http://locathost/solr";

    //this is the trick. first you should capture the Solr query, which executed when you hit search. I use the Solr level module to catch the query. you can change parameters if you want, I'm only changing the search keyword and number of results
    $request_url = $solr_server."/select?start=0&rows=$num_result&&spellcheck=true&q=$key&fl=id%2Centity_id%2Centity_type%2Cbundle%2Cbundle_name%2Clabel%2Css_language%2Cis_comment_count%2Cds_created%2Cds_changed%2Cscore%2Cpath%2Curl%2Cis_uid%2Ctos_name%2Czm_parent_entity%2Css_filemime%2Css_file_entity_title%2Css_file_entity_url&mm=1&pf=content%5E2.0&ps=15&hl=true&hl.fl=content&hl.snippets=3&hl.mergeContigious=true&f.content.hl.alternateField=teaser&f.content.hl.maxAlternateFieldLength=256&spellcheck.q=$key&qf=content%5E40&qf=label%5E21.0&qf=tags_h1%5E3.0&qf=tags_h2_h3%5E3.0&qf=tags_inline%5E1.0&qf=taxonomy_names%5E2.0&qf=tos_name%5E3.0&facet=true&facet.sort=count&facet.mincount=1&facet.field=im_field_taxonomy_app_cat&f.im_field_taxonomy_app_cat.facet.limit=50&f.im_field_taxonomy_app_cat.facet.mincount=1&boost=eff_popularity&debugQuery=on&wt=json&json.nl=map";
    //exit;
    // Retrieve data from the external API
    $response = drupal_http_request($request_url);

    // Check the HTTP response code to see if a valid response was received
    if($response->code >= 200 && $response->code < 300) {

        //make sure response has values
        if(isset($response)){
            $results = (array) json_decode($response->data);
        }
        if(isset($results)){
            //dsm($results);
            //store the values into an array
            if(isset($results['response']->docs)){
                $arrResults = $results['response']->docs;
            }
        }

        //check array count
        if(count($arrResults) > 0){
            //loop the results and add to array for json return data
            foreach($arrResults as $row){
                //dsm($row);
                //print $row->label;
                //print "<br>";
                $matches[$row->url] = $row->label;
            }

        }else{
            $matches[''] = "No Results Found!";
        }
    }else{
        $matches[''] = "Check server settings!";
    }
    drupal_json_output($matches);
}
Закрыть X