如何在rails中使用弹性搜索实现结果的部分单词匹配

时间:2015-06-08 07:01:13

标签: ruby-on-rails elasticsearch

我是弹性搜索的新手,想在我的应用程序中实现部分单词匹配,不知道如何实现请建议我我的代码如下:

article.rb文件

    class Article < ActiveRecord::Base
        include Tire::Model::Search
      include Tire::Model::Callbacks


      settings analysis: {
        filter: {
          ngram_filter: { type: "nGram", min_gram: 2, max_gram: 12 }
        },
        analyzer: {
          partial_analyzer: {
            type: "snowball",
            tokenizer: "standard",
            filter: ["standard", "lowercase", "ngram_filter"]
          }
        }
      } do
        mapping do
          indexes :title, index_filter: "ngram_filter"
          indexes :body, index_analyzer: "partial_analyzer"
          indexes :id
        end
      end
      def self.search(params)
        tire.search() do
          query { string params[:query]} if params[:query].present?
        end
      end
    end

article_controller.rb

    class ArticlesController < ApplicationController
      def index
         if params[:query].present?
            @articles = Article.search(params)
            # @articles = Article.where(title: params["query"])
         else
            @articles = Article.all
         end

         respond_to do |format|
            format.js { render :layout => false }
            format.html 

         end

      end
    end

我也没有太多关于映射r索引的知识,所以请提前告诉我解决方法。

1 个答案:

答案 0 :(得分:1)

您可以通过在搜索框中传递星号(*)来执行部分搜索,如:

  

* SEARCH_TERM

默认情况下,您希望在搜索方法中将其添加为

def self.search(params)
        tire.search() do
          query { string "*#{params[:query]}*" } if params[:query].present?
        end
end