簡體   English   中英

部分匹配的Elasticsearch導軌

[英]Partial matching elasticsearch rails

我目前正在使用elasticsearch按名稱查找客戶端,如果您輸入全名,則可以使用。 但是,即使客戶僅輸入名稱的前兩個字母,我也需要能夠進行搜索。 盡管出現此錯誤,但我嘗試使用部分匹配。

AdGroup.__elasticsearch__.create_index!  force:true
[!!!] Index does not exist (Elasticsearch::Transport::Transport::Errors::NotFound)
Elasticsearch::Transport::Transport::Errors::BadRequest: [400] {"error":{"root_cause":[{"type":"mapper_parsing_exception","reason":"analyzer on field 
[client_name] must be set when search_analyzer is 
set"}],"type":"mapper_parsing_exception","reason":"Failed to parse   
mapping [ad_group]: analyzer on field [client_name] must be set when 
 search_analyzer is set","caused_by":{"type":"mapper_parsing_exception","reason":"analyzer on field [client_name] must be set when search_analyzer is set"}},"status":400}

我的模型/ad-group.rb

class AdGroup < ActiveRecord::Base
   include Elasticsearch::Model
   include Elasticsearch::Model::Callbacks

 settings analysis: {
  filter: {
    ngram_filter: { type: "nGram", min_gram: 2, max_gram: 12 }
  },
  analyzer: {
        index_ngram_analyzer: {
            type: 'custom',
            tokenizer: 'standard',
            filter: ['lowercase', 'ngram_filter']
        },
        search_ngram_analyzer: {
            type: 'custom',
            tokenizer: 'standard',
            filter: ['lowercase']
        }
    }
} do
mapping do 
    indexes :published
    indexes :client_name,:type => "string", index_analyzer:   "index_ngram_analyzer", search_analyzer: "search_ngram_analyzer"
    indexes :created_at
    indexes :updated_at
    indexes :preview_updated_at
end
end

控制器/廣告組

class AdGroupsController < ApplicationController
    def index
      if params[:client_name]
       @ad_groups = AdGroup.search(params[:client_name]).page(params[:page]).results
      else
          @ad_groups = AdGroup.includes(:client).where(is_template: false).paginate(:page =>  params[:page]).order('id DESC')
      end

    end
end

知道為什么嗎?

問題是您要定義search_analyzerindex_analyzer ,而不是默認analyzer 看一下文檔

如果您修改將client_name的分析器設置為的代碼行,它將起作用:

    indexes :client_name,:type => "string", analyzer:   "index_ngram_analyzer", search_analyzer: "search_ngram_analyzer"

這樣,它將在索引時間使用默認analyzer ,而在查詢時間將使用search_analyzer

我不確定這對您有多大幫助,但是我不得不為想要搜索業務的客戶處理這個問題。 當然,這是一年多以前的事情了,所以我不記得詳細信息了,但是我必須在business_profiles_controller.rb進行此更改。

def index
  if params[:query].present?
    @business_profiles = BusinessProfile.search(params[:query], fields: [{ name: :word_middle }])
  else
    @business_profiles = BusinessProfile.all
  end
end

標志:word_middle允許我們在:name字段中搜索每個業務資料。

我希望這會有所幫助。

在Rails 4中使用SearchKick和ElasticSearch

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM