2013-06-17 3 views
3

Я новичок в Solr, и я использую версию 4.3.0. Я просто хочу включить базовое выделение. Я создал пользовательский интерфейс с использованием AJAX-Solr, и я использую обработчики запросов по умолчанию. Пожалуйста, направляйте меня с нуля. Кроме того, я хочу включить подсветку через обработчики запросов, а не через параметры URL-адреса запроса. Спасибо заранее.Как выделить текст в solr?

ответ

2

Если вы используете Ajax-solr, вы не будете использовать параметр подсветки сервера Solr.

Solr-Ajax создаст список javascript с соответствующими словами, которые вы вводите, используя facet component.

Другими словами, если вы используете Ajax-Solr вам нужно будет изменить AutocompleteWidget.js

Вам нужно изменить из исходного autocomplete reuters example от линии 23 до 33.

и заменить его с этим частичного кода

$(self.target).find('input').autocomplete('destroy').autocomplete({ 
     source: function(request, response) { 

      var srchTerm = request.term.split(/\s+/).join ('|'); 
      var matcher = new RegExp("(" + AjaxSolr.Parameter.escapeValue(srchTerm)+")", "ig"); 
      response($.grep(list, function(item){ 
       return matcher.test(item.value); 
      })); 
     }, 
     select: function(event, ui) {   
      if (ui.item) { 
      self.requestSent = true; 
      if (self.manager.store.addByValue('fq', ui.item.field + ':' + AjaxSolr.Parameter.escapeValue(ui.item.value))) { 
       self.doRequest(); 
      } 
      } 
     } 
     }).data('autocomplete')._renderItem = function(ul, item) { 

      var srchTerm = this.term.trim().split(/\s+/).join ('|');   
      var strNewLabel = item.label;   

      regexp = new RegExp ('(' + srchTerm + ')', "ig");   
      var strNewLabel = strNewLabel.replace(regexp,"<span style='font-weight:bold;color:#880010;'>$1</span>"); 

      return $("<li></li>") 
      .data("item.autocomplete", item) 
      .append("<a>" + strNewLabel + ' (' + item.counter + ') ' + "</a>") 
     .appendTo(ul); 
}; 

Вот полный файл Я использовал для проекта.

(function (callback) { 
    if (typeof define === 'function' && define.amd) { 
    define(['../core/AbstractTextWidget'], callback); 
    } 
    else { 
    callback(); 
    } 
}(function() { 

(function ($) { 

AjaxSolr.AutocompleteWidget = AjaxSolr.AbstractTextWidget.extend({ 
    afterRequest: function() { 
    $(this.target).find('input').unbind().removeData('events').val(''); 

    var self = this; 

    var callback = function (response) { 
     var list = []; 
     for (var i = 0; i < self.fields.length; i++) { 
     var field = self.fields[i]; 
     for (var facet in response.facet_counts.facet_fields[field]) {   
      list.push({ 
      field: field, 
      counter: response.facet_counts.facet_fields[field][facet], 
      value: facet, 
      label: facet 
      }); 
     } 
     } 

     self.requestSent = false; 
     $(self.target).find('input').autocomplete('destroy').autocomplete({ 
     source: function(request, response) { 

      var srchTerm = request.term.split(/\s+/).join ('|'); 
     var matcher = new RegExp("(" + AjaxSolr.Parameter.escapeValue(srchTerm)+")", "ig"); 
     response($.grep(list, function(item){ 
      return matcher.test(item.value); 
     })); 
    }, 
    select: function(event, ui) {   
     if (ui.item) { 
     self.requestSent = true; 
     if (self.manager.store.addByValue('fq', ui.item.field + ':' + AjaxSolr.Parameter.escapeValue(ui.item.value))) { 
       self.doRequest(); 
      } 
      } 
     } 
     }).data('autocomplete')._renderItem = function(ul, item) { 

      var srchTerm = this.term.trim().split(/\s+/).join ('|');   
      var strNewLabel = item.label;   

      regexp = new RegExp ('(' + srchTerm + ')', "ig");   
      var strNewLabel = strNewLabel.replace(regexp,"<span style='font-weight:bold;color:#880010;'>$1</span>"); 

      return $("<li></li>") 
      .data("item.autocomplete", item).append("<a>" + strNewLabel + ' (' + item.counter + ') ' + "</a>") 
     .appendTo(ul); 
    }; 

     // This has lower priority so that requestSent is set. 
     $(self.target).find('input').bind('keydown', function(e) {   
     if (self.requestSent === false && e.which == 13) { 
      var value = $(this).val(); 
      if (value && self.set(value)) { 
      self.doRequest(); 
      } 
     } 
     }); 
    } // end callback 

    var params = [ 'rows=0&facet=true&facet.limit=30&facet.mincount=1&json.nl=map&hl=true&hl.q='+this.manager.store.get('q').val() ]; 
    var hightLithing='&hl.fl='; 
    for (var i = 0; i < this.fields.length; i++) { 
     params.push('facet.field=' + this.fields[i]); 
     hightLithing = hightLithing + this.fields[i]+','; 
    } 
    hightLithing.slice(0,-1); 
    params.push(hightLithing); 
    var values = this.manager.store.values('fq');  
    for (var i = 0; i < values.length; i++) { 
     params.push('fq=' + encodeURIComponent(values[i]));  
    } 
    params.push('q=' + this.manager.store.get('q').val()); 
    $.getJSON(this.manager.solrUrl + 'select?' + params.join('&') + '&wt=json&json.wrf=?', {}, callback); 
    }//end afterRequest 
}); 

})(jQuery); 

})); 
0

Подсветка в SOLR может быть достигнута путем редактирования файла solr.xml и указания параметров там. Вы можете проверить документацию здесь: http://wiki.apache.org/solr/HighlightingParameters

+0

Я не вижу ни одного файла с именем solr.xml. Должно ли это быть solrconfig.xml? – fanchyna

3

Вы можете непосредственно протестировать highlighting, передав параметры выделения.

например. hl=true&hl.fl=name,features

Кроме того, вы можете настроить значения по умолчанию в вашем обработчике запросов в файле solrconfig.xml, например.

<requestHandler name="/browse" class="solr.SearchHandler"> 
<lst name="defaults"> 

    ................ 

    <!-- Highlighting defaults --> 
    <str name="hl">on</str> 
    <str name="hl.fl">content features title name</str> 
    <str name="hl.encoder">html</str> 
    <str name="hl.simple.pre">&lt;b&gt;</str> 
    <str name="hl.simple.post">&lt;/b&gt;</str> 
    <str name="f.title.hl.fragsize">0</str> 
    <str name="f.title.hl.alternateField">title</str> 
    <str name="f.name.hl.fragsize">0</str> 
    <str name="f.name.hl.alternateField">name</str> 
    <str name="f.content.hl.snippets">3</str> 
    <str name="f.content.hl.fragsize">200</str> 
    <str name="f.content.hl.alternateField">content</str> 
    <str name="f.content.hl.maxAlternateFieldLength">750</str> 


</lst> 

</requestHandler> 
+0

Привет, я внес изменения, как вам было предложено, но функция выделения еще не работает. –

+0

Можете ли вы объяснить, что не работает для вас? – Jayendra

+0

У меня встроенный solr с ajax-solr, который помогает в создании пользовательского интерфейса. В ajax solr, Manager.response.highlighting отражает выделенный контент. Я внес изменения в файл solrconfig.xml, как вам было предложено, однако Manager.response.highlighting не показывает никакого результата. Не могли бы вы посоветовать мне, как мне включить эту функцию с нуля? Я использую обработчик по умолчанию/поиска. Нужно ли мне что-то активировать? благодаря –

Смежные вопросы