2016-06-24 10 views
1

これは本当に簡単な問題のようですが、他のソリューションやウェブサイトから試したことはありません。私は索引付けまたは照会したくない3つのフィールドを持っています - :p_s:genderおよび:part_of_speech - ただし、索引付けまたは照会を指定していないにもかかわらず、elasticsearchはこれらのフィールドから値を戻しています。途中で、this articleは、インデックス作成にnoと言っていますが、これはどこで発生するのかを示していません。レールで弾性検索の特定のフィールドを返します

用語コントローラー:

def search 
    @terms = Term.search(params[:query]).page(params[:page]) 
    end 

モデル:含まelasticsearchメソッドを使用すると、多くの意味になると思い

require 'elasticsearch/model' 

class Term < ActiveRecord::Base 

include Elasticsearch::Model 
include Elasticsearch::Model::Callbacks 

    settings index: { number_of_shards: 1, number_of_replicas: 0 }, 
    do 

    mappings dynamic: 'false' do 
     indexes :id, index: :not_analyzed 
     indexes :name, analyzer: :spanish_analyzer 
     indexes :definition, analyzer: :combined_analyzer 
     indexes :etymology1, analyzer: :combined_analyzer 
     indexes :etymology2, analyzer: :combined_analyzer 
     indexes :uses, analyzer: :combined_analyzer 
     indexes :notes1, analyzer: :combined_analyzer 
     indexes :notes2, analyzer: :combined_analyzer 
    end 
    end 

    def self.search(query) 
    __elasticsearch__.search(
     { 
     query: { 
      multi_match: { 
      query: query, 
      fields: ['name^7', 'definition^6', 'etymology1^5', 'etymology2^4', 'uses^3', 'notes1^2', 'notes2^1'], 
      operator: 'and' 
      } 
     } 
     } 
    ) 
    end 
end 

# Delete the previous term index in Elasticsearch 
Term.__elasticsearch__.client.indices.delete index: Term.index_name rescue nil 

# Create the new index with the new mapping 
Term.__elasticsearch__.client.indices.create \ 
    index: Term.index_name, 
    body: { settings: Term.settings.to_hash, mappings: Term.mappings.to_hash } 

# Index all term records from the DB to Elasticsearch 
Term.import(force: true) 

答えて

0

。デフォルトElasticsearchで、それは必要なデータを得るためにあなたのモデルにas_indexed_jsonメソッドを呼び出しますので

def as_indexed_json 
    as_json(only: [:id, :name, :definition, :etymology1, :etymology2, :uses, :notes1, :notes2]) 
end 

これは動作するはずです:しかし、私自身の場合には、私のモデルでは、私はあなた自身のケースのために変更、このような何かをしました索引付けする

+0

遅れて申し訳ありませんが、私は最初に解決する必要があった新しい問題が発生しました...あなたの解決策は私が私のために働かなかった方法の一つです。明確にするために、このコードは私の 'def self.search(query)'メソッドの代わりに使うべきでしょうか?それは私のマッピングの後に行くべきですよね? – evanejin

+0

この方法を使用すると、マッピングはもはや索引付けされないため、全く照会することができないため、マッピングをもう一度行う必要はありません。あなたの検索は今のままであり、他のすべての設定をあなたの設定で行うことができると思います。 – oreoluwa

+0

ええと、まあまあ私が言ったようにしようとしましたが、私は含まれたくない余分なフィールドをまだ返しています – evanejin

0

非インデックス付きの使用などは、このフィールドをマークする:"_source"キーの下にあるすべてのドキュメントフィールドを返しelasticsearchデフォルトで

mappings dynamic: 'false' do 
    ... 
    indexes :p_s, index: :no 
    indexes :gender, index: :no 
    indexes :part_of_speech, index: :no 
    ... 
end 

を。 multi_match句を使用する場合、特定のフィールドのみを取得するには、この

def self.search(query) 
    __elasticsearch__.search(
     { 
     query: { 
      multi_match: { 
      query: query, 
      fields: ['name^7', 'definition^6', 'etymology1^5', 'etymology2^4', 'uses^3', 'notes1^2', 'notes2^1'], 
      operator: 'and' 
      } 
     }, 
     fields: ['name', 'definition', 'etymology1', 'etymology2', 'uses', 'notes1', 'notes2'] 
     } 
    ) 
    end 

ようトップクエリレベルでfields配列を指定するか、または"_source"

def self.search(query) 
    __elasticsearch__.search(
     { 
     query: { 
      multi_match: { 
      query: query, 
      fields: ['name^7', 'definition^6', 'etymology1^5', 'etymology2^4', 'uses^3', 'notes1^2', 'notes2^1'], 
      operator: 'and' 
      } 
     }, 
     '_source': ['name', 'definition', 'etymology1', 'etymology2', 'uses', 'notes1', 'notes2'] 
     } 
    ) 
end 

See Elasticsearch source filtering docs for more.

フィルタリング内部fields要素は、検索を実行するフィールドを指定します。 ptionally、あなたの例のようなブースト。外側のfieldsまたは '_source'句は、どのフィールドを返すかを決定します。これが後にあるフィールドです。

elasticsearchクエリのデバッグ中に何が起きているかをよりよく把握するには、Senseのようなツールを使用します。結果が得られたら、ルビーコードにクエリを転送するほうがずっと簡単です。

+0

大丈夫、トップレベルのクエリでフィールドを指定しようとしましたが、このエラーを受け取りました。 #[Elasticsearch :: Model :: Response :: Result']これは私の検索ビューテンプレート '<%= term.name %>'です。リンクを削除して再度クエリを実行しましたが、 'term.name'と同じエラーが発生しました – evanejin

+0

私は'_source'メソッドも同様ですが、間違った場所に置いていると思います。私はたくさんのドキュメンテーションを読んで理解していますが、初心者の方には、これが私の頭の中にたくさんあることがわかります。たとえば、この行「term」:{"user": "kimchy"} 'を私のコードにどのように適用するのですか?私は本当に私がそれを取り替えるはずのものを手に入れません。 – evanejin

+0

最新の '' _source ''の使用例を見てください。 –

関連する問題