IndexTank autocomplete: изменение текста поля автозаполнения для каждого возвращаемого результата - PullRequest
2 голосов
/ 25 июля 2011

У меня установлено приложение Ruby / Sinatra на Heroku, и я использую плагин IndexTank для обеспечения возможности полнотекстового поиска.

В настоящее время я использую готовую функцию автозаполнения согласно Документация по автозаполнению IndexTank

В настоящее время я проиндексировал свои документы так, что текстовое поле по умолчанию: содержит название города и название страны документа. то есть:

@index.document("1").add({:text => "London England"})

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

Когда я набираю ' lon ' в поле, он возвращает ' london '. Это действительно правильный документ, но я надеялся, что он действительно вернет мне ' Лондон Англия '.

Кто-нибудь знает, как мне изменить данные, отображаемые в раскрывающемся поле автозаполнения, чтобы при поиске '1022 * lon ' отображалось « London England »?


UPDATE

Я также попробовал функциональность InstantLinks , как предложено в комментариях, но это также не вполне делает то, что мне нужно сделать. Кажется, что оба решения делают примерно 80% того, что мне нужно, но, к сожалению, мне нужно что-то дополнительное.

Две вещи в InstantLinks, которые не работают так, как мне нужно:

  • Хотя я могу выбрать, какое поле из индекса отображать в раскрывающемся списке (что я не мог сделать с функцией автозаполнения), когда я использую клавиши со стрелками, чтобы выбрать параметры в раскрывающемся списке выбранная опция не отображается в текстовом поле.

  • Когда я выбираю запись в раскрывающемся списке, меня перенаправляют на другую страницу, URL которой, как предполагается, был извлечен из индекса. Все, чего я хочу, это значение выбранной записи, которая будет заполнена в исходном текстовом поле.

Так что, к сожалению, я не вижу, как InstantLinks даст мне ту функциональность, которая мне нужна.

Ответы [ 2 ]

1 голос
/ 10 августа 2011

Хорошо, поэтому я наконец-то нашел способ решения своей проблемы, однако я не смог использовать ни функцию автозаполнения, ни функцию InstantLinks, предоставляемые IndexTank.

Короче говоря, я использовал выход изокно виджета автозаполнения jQuery (который я знаю, что автозаполнение IndexTank использует под обложками) для вызова созданной мной службы restful, которая запрашивает индекс IndexTank.

Сначала я создал службу restful в своем приложении Sinatra

get '/index/' do
    term = params['term']

    #Query IndexTank index using the IndexTank::Client

    #Parse index search results and return an array of the suggestions as JSON
end

Затем я использовал виджет автозаполнения jQuery, чтобы использовать свой отдыхающий сервис в качестве удаленного источника.Сначала есть мой HTML-ввод:

<form id="search_form" action="/" method="POST">
    <input id="search_field" name="search_field" type="text">
</form>

Затем JavaScript, чтобы связать виджет автозаполнения с вводом:

$(document).ready(function(){
    $("#search_field").autocomplete({
      source: function(request, response) {
        $.ajax({
          url: "/index/",
          dataType: 'json',
          data: { term: request.term },
          success: function(data) {
            response($.map(data, function(item) {
              return {label: __highlight(item, request.term),
                value: item};
            }));
          }
        });
      },
      minLength: 2
    })
    .data( "autocomplete" )._renderItem = function( ul, item ) {
      // only change here was to replace .text() with .html()
      return $( "<li></li>" )
        .data( "item.autocomplete", item )
        .append( $( "<a></a>" ).html(item.label) )
        .appendTo( ul );
    };
  });

  function __highlight(s, t) {
    var matcher = new RegExp("("+$.ui.autocomplete.escapeRegex(t)+")", "ig" );
    return s.replace(matcher, "<strong>$1</strong>");
  }

И вот, поле автозаполнения, которое запрашивает IndexTankиндекс и отображает нужное поле индекса в раскрывающемся списке предложений.

0 голосов
/ 27 июля 2011

Возможно, вы хотите использовать InstantLinks .

Если вы действительно хотите настроить автозаполнение, вам следует изменить свойство _renderItem виджета пользовательского интерфейса jQuery, связанного с Indextank Autocomplete.

$("#query").data("autocomplete")._renderItem = function(ul, item) { .. }

См. Документация по jQuery UI Autocomplete для примера.

...