2016-09-27 8 views
0

現在、elasticsearchを使用してクライアントを名前で検索していますが、名前全体を入力すると機能します。しかし、顧客が名前の最初の2文字だけを入力したとしても、検索できるようにする必要があります。私は部分一致を使用しようとしていますが、このエラーが発生します。パーシャルマッチングelasticsearch rails

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} 

マイモデル/広告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 

任意のアイデアなぜですか?

答えて

-1

これはどれくらいの効果が得られるのかよく分かりませんが、ビジネスを検索したいクライアントにとってこれを処理しなければなりませんでした。 1年以上経過しているので、詳細は覚えていませんが、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フィールド内を検索することができました。

私はこれが何らかの助けになることを願っています。

Using SearchKick and ElasticSearch in Rails 4

1

問題は、あなたがsearch_analyzerindex_analyzerではなく、デフォルトanalyzerを定義しているということです。 documentationをご覧ください。このようにし

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

それはピックアップしますが、それは、インデックス時にデフォルトanalyzerがかかります。

それはあなたがにclient_nameのためのアナライザを設定するコードの行を変更した場合に動作しますクエリ時にsearch_analyzer

+0

ありがとうございます!それはまだ部分的なマッチをすることができませんが、その問題を解決しました。 –

+0

クエリには何を使用していますか?あなたの方法を投稿できますか? – davide

+0

ところで、最初の入力文字とマッチしたい場合は、 'edge_ngram'フィルタを使うのがよいでしょう。 – davide

関連する問題