我在Rails应用程序中使用Elasticsearch&Typeahead执行自动完成。我从这里得到了主意
https://shellycloud.com/blog/2013/10/adding-search-and-autocomplete-to-a- rails-app-with-elasticsearch
我已经正确配置了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>
控制者
def autocomplete es = ESClient.get_client games = es.suggest index: 'games', body: { apple_game: { text: params[:keyword], completion: { field: "title"} } } render json: games end
控制器方法的示例浏览器结果
{ "_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 } ] } ] }
编辑 我每当运行typeahead时也注意到控制台中出现以下错误
Uncaught Error: missing source
好的,我认为您有两个问题。
问题1:
您看起来像是在使用10.0版之前的预输入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() });
我确实必须对所做的事情稍作修改;我在前端使用骨干并将上面的内容拼接到其中(为此,我在typeahead项目中拥有PR)
问题二
就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" } } } } } } }