rails - Elasticsearch完成建议器和搜索API

use*_*696 6 autocomplete ruby-on-rails elasticsearch

我正在使用搜索API,现在需要添加完成建议器,我正在使用elasticsearch-rails gem.

当我搜索文章时,一切都在 http:// localhost:9200/articles/_search

  "query": {
    "multi_match": {
      "query": "test",
      "fields": [
        "title", "tags", "content"
      ]
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

但是,由于我已经实现了完成建议,我必须进行编辑as_indexed_json以使其工作,但现在搜索API不再起作用,只有建议.

这是我的文章模型:

  def self.search(query)
    __elasticsearch__.search(
        {
            query: {
                multi_match: {
                    query: query,
                    fields: ['title', 'content', 'tags']
                }
            }
        })
end

      def self.suggest(query)
        Article.__elasticsearch__.client.suggest(:index => Article.index_name, :body => {
            :suggestions => {
                :text => query,
                :completion => {
                    :field => 'suggest'
                }
            }
        })
      end

      def as_indexed_json(options={}) 
       {
            :name => self.title,
            :suggest => {
                :input => self.title,
                :output => self.title,
                :payload => {
                    :content => self.content,
                    :tags => self.tags,
                    :title => self.title
                }
            }
        }.as_json
      end
Run Code Online (Sandbox Code Playgroud)

是否可以将_search和_suggest与同一模型一起使用?

Eug*_*rov 5

我只是深入研究elasticsearch,但据我所知,你可以在序列化程序功能中修改之前添加你所拥有的内容并重新创建索引,它们将在数据库中很好地共存.例如:

def as_indexed_json(options={}) 
       {
           :name => self.title,
            :suggest => {
                :input => self.title,
                :output => self.title,
                :payload => {
                    :content => self.content,
                    :tags => self.tags,
                    :title => self.title
                }
            }
        }.as_json.merge(self.as_json) # or the customized hash you used
Run Code Online (Sandbox Code Playgroud)

要避免索引冗余,您可以查看别名和路由.