use*_*382 4 typeahead elasticsearch bootstrap-typeahead typeahead.js
我在我的Rails应用程序中使用Elasticsearch和Typeahead来执行自动完成.我从这里得到了这个想法
我正确配置了elasticsearch自动完成功能,因为当我通过浏览器直接访问它时,它可以正常工作.但是,当我尝试使用typeahead从自动完成查询调用显示数据时,它甚至不会在我的调试器中触发.这是我的表单和javascript,其中调用了typeahead
形成
<script>
$('#autcomplete_search').typeahead({
highlight: true
},
{
name: 'apple_game',
remote: "/search/autocomplete?query=%QUERY"
});
</script>
<h1>Keyword</h1>
<form action="/search/keyword">
<div>
<%= text_field_tag :query, params[:query], class: "form-control", id: "autcomplete_search" %>
<br/>
<br/>
</div>
<div>
<input type="submit">/</input>
</div>
</form>
Run Code Online (Sandbox Code Playgroud)
调节器
def autocomplete
es = ESClient.get_client
games = es.suggest index: 'games',
body: {
apple_game: {
text: params[:keyword],
completion: {
field: "title"}
}
}
render json: games
end
Run Code Online (Sandbox Code Playgroud)
控制器方法的示例浏览器结果
{
"_shards": {
"total": 5,
"successful": 5,
"failed": 0
},
"apple_game": [
{
"text": "ma",
"offset": 0,
"length": 2,
"options": [
{
"text": "Macabre Mysteries: Curse of the Nightingale Collector's Edition HD",
"score": 1
},
{
"text": "Mad Cop - Police Car Race and Drift (Ads Free)",
"score": 1
},
{
"text": "Mad Freebording (Snowboarding)",
"score": 1
},
{
"text": "Mad Merx: Nemesis",
"score": 1
},
{
"text": "Mad River Whitewater Kayak Rush",
"score": 1
}
]
}
]
}
Run Code Online (Sandbox Code Playgroud)
编辑 我还注意到,当typeahead运行时,控制台中出现以下错误
Uncaught Error: missing source
Run Code Online (Sandbox Code Playgroud)
好吧,我认为你有两个问题.
问题1:
你看我就像使用10.0之前的typeahead API.要使用远程,你必须使用Bloodhound或类似的东西来获取你的结果.
我最近实现了这个,这是一个工作示例:
var $vartypeahead = $(yourjqueryelement);
var engine = new Bloodhound({
name: 'typeaheads',
remote: {"url":'/search/typeahead?q=%QUERY'},
datumTokenizer: function(d) { return d;},
queryTokenizer: function(d) { return d;}
});
engine.initialize();
$vartypeahead.typeahead({
"minLength": 2,
"highlight": true
},
{
"source": engine.ttAdapter()
});
Run Code Online (Sandbox Code Playgroud)
我确实必须从我所做的事情中略微修改上述内容; 我在前端使用骨干并将上面的内容拼接到其中(我在typeahead项目中有PR)
问题#2
就ES而言,我不确定你的映射是否正确,通常你对一个预先计划项目的映射看起来像这样:
{
"settings": {
"analysis": {
"filter": {
"autocomplete_ngram": {
"max_gram": 24,
"min_gram": 2,
"type": "edge_ngram"
}
},
"analyzer": {
"autocomplete_index": {
"filter": [
"lowercase",
"autocomplete_ngram"
],
"tokenizer": "keyword"
},
"autocomplete_search": {
"filter": [
"lowercase"
],
"tokenizer": "keyword"
}
}
},
"index": {
"number_of_shards": 20,
"number_of_replicas": 1
}
},
"mappings": {
"yourtype": {
"properties": {
"title": {
"type": "multi_field",
"fields": {
"title_edgengram": {
"type": "string",
"index": "analyzed",
"index_analyzer": "autocomplete_index",
"search_analyzer": "autocomplete_search"
},
"title": {
"type": "string",
"index": "not_analyzed"
}
}
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1878 次 |
| 最近记录: |