Typeahead/Rails:不工作

use*_*382 4 typeahead elasticsearch bootstrap-typeahead typeahead.js

我在我的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>
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)

Jam*_*s R 6

好吧,我认为你有两个问题.

问题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)

  • 谢谢!我复制了你的代码并且它有效.他们真的应该为更新的版本更新他们的文档! (2认同)