我在Heroku上部署了一个Ruby / Sinatra应用程序,我正在使用IndexTank插件来提供全文搜索功能。
我目前正在使用IndexTank Autocomplete Documentation
开箱即用的自动填充功能目前,我已将文档编入索引,以使默认:文本字段包含文档的城市名称和国家/地区名称。即:
@index.document("1").add({:text => "London England"})
当我在默认的自动填充字段中进行搜索时,它确实可以正常工作并返回结果,但不是我期望或喜欢的结果。
当我在字段中输入“ lon ”时,会返回“ london ”。这确实是正确的文件,但我希望它实际上会让我'伦敦英格兰'。
有人知道如何修改自动填充字段下拉列表中呈现的数据,以便在搜索“ lon ”时显示“伦敦英格兰” ?
更新
我还尝试了评论中建议的InstantLinks功能,但这也不是完全做我需要做的事情。似乎两种解决方案都能满足我所需要的80%,但不幸的是我需要额外的东西。
关于InstantLinks的两件事我不需要工作:
虽然我可以选择索引中的哪个字段显示在下拉列表中(这是我无法使用自动完成功能执行的操作),但当我使用箭头键选择下拉列表中的选项时,所选选项不会显示在文本字段中。
当我从下拉列表中选择一个条目时,我将被带到另一个页面,其URL应该从索引中提取。我想要发生的是选择填充到原始文本字段中的条目的值。
所以,遗憾的是我无法看到InstantLinks如何为我提供我所追求的功能。
答案 0 :(得分:1)
好的,所以我终于找到了解决问题的方法,但是我无法使用IndexTank提供的自动完成功能或InstantLinks功能。
简而言之,我所做的就是使用开箱即用的jQuery自动完成小部件(我知道IndexTank Autocomplete在封面下使用)来调用我创建的查询IndexTank索引的宁静服务。
首先,我在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>
然后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索引并在建议下拉列表中显示所需的索引字段。
答案 1 :(得分:0)
您可能希望改为使用InstantLinks。
如果您确实想要调整自动填充,则应更改与Indextank自动填充相关联的jQuery UI窗口小部件的_renderItem属性。
$("#query").data("autocomplete")._renderItem = function(ul, item) { .. }
有关示例,请参阅jQuery UI Autocomplete documentation。