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



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

的文章。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

我也不太了解映射和索引,所以请给我建议解决方案,谢谢。

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

search_term

*

默认情况下,你想在搜索方法中添加它只需像

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

您需要这样写,并确保修复搜索的模糊性以及用于搜索的列(如title)

@term = params[:keyword].to_s
@results =  JobSubcategory.search({#size: 20 ,
                                     query: {
                                         multi_match:{
                                                        query: @term,
                                                        fields: [ "title"],
                                                        fuzziness: 2
                                                     }
                                                    }}).paginate(page: params[:page], per_page: params[:per_page])

最新更新