2016-05-14 12 views
2

私は書籍のISBN、本のタイトルと本の件名のタイトルのすべての種類の検索帳のElasticSearchサーバーを使用しています。私は、検索方法を持って、ElasticSearchの検索クエリは、多くのリレーションシップモデルを持っています。

aliase、などの

ブックhash_manyのadditional_isbns、被験者

ブックhash_oneを関係を持っており、私のインデックスがどのように見える三つのモデルを使用してインデックスを作成

{ 
"_index":"books","_type":"book","_id":"9781135028411","_score":0.6377245, 
    "_source":{"book_vbid": "9781135028411","book_title": "Objectivity, Science and Society","book_author":"Paul A Komesaroff", 
       "additional_isbn": [{"isbn_value": "0415474876"},{"isbn_value": "9780415474870"}], 
       "aliase": {"eisbn_canonical":"9781135028411","isbn_canonical":"9781135028411","print_isbn_canonical":"9780415474870","isbn13":"9781135028411","isbn10":"1135028419"}, 
       "subjects": [{"title": "General"},{"title": "General"},{"title": "General"},{"title": "Physical & Earth Sciences -> Science -> General"},{"title": "Social Sciences -> Philosophy -> General"},{"title": "Social Sciences -> Social Sciences -> General"}]}},{ 
"_index":"books","_type":"book","_id":"9781135027896","_score":0.6348529, 
    "_source":{"book_vbid": "9781135027896","book_title": "Beyond Empiricism","book_author":"Andrew Tudor", 
       "additional_isbn": [{"isbn_value": "0415475007"},{"isbn_value": "9780415475006"}], 
       "aliase": {"eisbn_canonical":"9781135027896","isbn_canonical":"9781135027896","print_isbn_canonical":"9780415475006","isbn13":"9781135027896","isbn10":"1135027897"}, 
       "subjects": [{"title": "General"},{"title": "General"},{"title": "General"},{"title": "Physical & Earth Sciences -> Science -> General"},{"title": "Social Sciences -> Philosophy -> General"},{"title": "Social Sciences -> Social Sciences -> General"}]}},{ 
"_index":"books","_type":"book","_id":"9781134429059","_score":0.6258716, 
    "_source":{"book_vbid": "9781134429059","book_title": "Your Murderer","book_author":"Vassily Aksyonov", 
       "additional_isbn": [{"isbn_value": "9057551039"},{"isbn_value": "9789057551031"}], 
       "aliase": {"eisbn_canonical":"9781134429059","isbn_canonical":"9781134429059","print_isbn_canonical":"9789057551031","isbn13":"9781134429059","isbn10":"1134429053"}, 
       "subjects": [{"title": "General"},{"title": "General"},{"title": "Humanities -> Performing Arts -> General"},{"title": "Humanities -> TheatrGeneral"}]}} 

を行っていますlike、

def self.search(query, options = {}) 
es_options = 
    { 
    query: { 
     query_string: { 
     query:   query, 
     default_operator: 'AND', 
    } 
    }, 
    sort: '_score', 
}.merge!(options) 
__elasticsearch__.search(es_options) end 

私の要件は次のとおりです。 Book.search('general')で検索したときのように、検索はすべての書籍の件名の値でなければなりません。 どのようにして、他の列ではなく主題だけで検索することができますか?

答えて

0

ここでは、どのようにしてクエリを追加できるかを示すために、2つの特定の列のオブジェクトを検索する方法の例を示します。 2番目のクエリを使用すると、弾性検索であなたの正確なクエリを実行する方法を示します。

User.search(from: 0, size: 1000, query: { bool: { must: [ {match: { assembly_district: "AD\-13"}}, {match: { election_district: "ED\-011"}} ] } }).records.last 

これはAssemblyDistrictのAD-13と「ALSO」election_district ED-011と一致する最初の1000件のレコードを返します。あなたの場合、あなたはそうするでしょう:

'From'はオフセットです、 'size'は返される最大データセットです。また、多くの人が見落としている重要なことは、データベースで探している正確な値を知っているデータを検索しているときに、クエリの代わりにフィルタを使用すると、はるかに高速になるということです。以下は、あなたが "一般的な"被写体に完全に一致する必要があることを知っていて、それに近いものではなく、それに近いものではない場合、フィルターを使用する方法です。

Book.search(query: { bool: { filter: [ {term: { subject: "general"}} ] } }).results 
+0

ありがとうございます。だから私はすべての本のすべての科目のタイトルだけを検索し、その結果だけを必要とするような要件があります。 – rick

+0

ああ、今は自分の電話から入力していますが、件名に「{general:}」の代わりに{title: 'general}}を使用することをお勧めします。私が私の恋人に戻ったとき、私はもっと深く見ていきます。 – bkunzi01

0

あなたはデフォルトhttps://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-query-string-query.html#_default_fieldとして_allあるdefault fieldを変更することができますいずれかquery_stringクエリを使用する場合:私はそれが希望を推測

{ 
    query: { 
     query_string: { 
      query:   query, 
      default_operator: 'AND', 
      fields : ['subject.title'] 
     } 
    } 
} 

{ 
    query: { 
     query_string: { 
      query:   query, 
      default_operator: 'AND', 
      default_field : 'subject.title' 
     } 
    } 
} 

か、fieldshttps://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-query-string-query.html#_multi_fieldを使用することができますあなたのメソッドのパラメータとしてフィールド名を取る方が良いでしょう。

+0

私は主題の題名のみを検索する必要があります。だから私は件名のようなクエリを作ることができます[:title]は、件名の 'title'フィールドのみを検索することを意味します – rick

+0

["subject.title"] – alpert

関連する問題