ruby - IndexTank 自动完成 : modifying the autocomplete field text for each result returned

标签 ruby heroku indextank

我在 Heroku 上部署了一个 Ruby/Sinatra 应用程序,我正在使用 IndexTank 插件来提供全文搜索功能。

我目前正在根据 IndexTank Autocomplete Documentation 使用开箱即用的自动完成功能

目前我已经为我的文档编制了索引,这样默认的 :text 字段包含文档的城市名称和国家/地区名称。即:

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

当我在默认的自动完成字段中进行搜索时,它确实有效并返回结果,但不是我所期望或喜欢的结果。

当我在字段中输入“lon”时,它会返回“london”。这确实是正确的文档,但我希望它实际上会返回“英国伦敦”。

有谁知道我如何修改自动完成字段下拉列表中呈现的数据,以便在我搜索“lon”时显示“London England” ?


更新

我也试过 InstantLinks评论中建议的功能,但这也不是完全做我需要做的。似乎这两种解决方案都可以完成我需要的大约 80%,但不幸的是我还需要一些额外的东西。

有关 InstantLinks 的两件事不能按我的需要工作:

  • 虽然我可以从索引中选择要在下拉列表中显示的字段(这是我无法使用自动完成功能执行的操作),但当我使用箭头键选择下拉列表中的选项时,所选选项不会显示在文本字段中。

  • 当我从下拉列表中选择一个条目时,我被带到另一个页面,该页面的 URL 应该是从索引中提取的。我只想将所选条目的值填充到原始文本字段中。

因此,不幸的是,我看不到 InstantLinks 如何为我提供我所追求的功能。

最佳答案

好吧,我终于找到了解决问题的方法,但是,我无法使用 IndexTank 提供的自动完成功能或 InstantLinks 功能。

简而言之,我所做的是使用开箱即用的 jQuery 自动完成小部件(我知道 IndexTank 自动完成在幕后使用)来调用我创建的查询 IndexTank 索引的 restful 服务。

首先,我在我的 Sinatra 应用程序中创建了 restful 服务

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 自动完成小部件将我的 restful 服务用作远程源。首先是我的 HTML 输入:

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

然后将自动完成小部件绑定(bind)到输入的 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 索引并在建议下拉列表中显示所需的索引字段。

关于ruby - IndexTank 自动完成 : modifying the autocomplete field text for each result returned,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6818928/

相关文章:

python - 推送被拒绝,无法编译 Python 应用程序 - Python 版本错误

Symfony 5 Heroku 无法从给定配置创建签名的 JWT

ruby - RVM/Heroku/ gem : lazy symbol binding failed

ruby-on-rails - 运行 bundle install 时出现 sqlite3 错误

ruby - Sinatra session 成员 "disappearing"

php - 使用 Indextank 进行站点搜索

java - IndexTank:如何在没有查询字符串的情况下进行查询,仅限地理位置

ruby-on-rails - mongoid 中 embeds_many 和 has_many 的区别

ruby-on-rails - 带有 VI 命令的 Windows 最佳 Ruby 编辑器