2

フィルターの代わりに用語をクエリに追加すると、ファセットが 0 になります。参考までに、タイヤの宝石をRubyで使用しています。

マッピングを含む私のモデルコードは次のとおりです。

class Property < ActiveRecord::Base
  include Tire::Model::Search
  include Tire::Model::Callbacks

  has_and_belongs_to_many :tags

   mapping do
    indexes :id,                type: 'integer'
    indexes :status
    indexes :refno,             type: 'integer'
    indexes :name,              :analyzer => 'snowball', :boost => 100
    indexes :description
    indexes :tags,              type: 'object',
                                  properties: {
                                    name: { type: 'multi_field',
                                      fields: {
                                        name: { type: 'string', analyzer: 'snowball' },
                                        exact: { type: 'string', index: 'not_analyzed' }
                                      }
                                    }
                                   }                                 
  end

  def to_indexed_json
    to_json( include: { 
      tags: { only: [:name] },
     })
  end

それでは検索方法です

  def self.search(params={})
    tire.search(page: params[:page], per_page: 2, load: true) do
      query do
        boolean do
         must { string params[:name], default_operator: "AND" } if params[:name].present?
         must { term :status, 'live' }
         must { term :refno, params[:refno]} if params[:refno].present?
         # must { term :tag, params[:tag]} if params[:tag].present? ## does not work either
         must { term 'tags.name.exact', params[:tag]} if params[:tag].present?
        end
      end
      facet "tags" do
        terms 'tags.name.exact'
      end
      raise to_json
      # raise to_curl
    end
  end

0 ファセットを取得します。 しかし、ファセットをフィルター、つまり下に移動すると、完全なファセットが得られます。

  def self.search(params={})
    tire.search(page: params[:page], per_page: 2, load: true) do
      query do
        boolean do
         must { string params[:name], default_operator: "AND" } if params[:name].present?
         must { term :status, 'live' }
         must { term :refno, params[:refno]} if params[:refno].present?
        end
      end
      filter :term, 'tags.name.exact' => params[:tag] if params[:tag].present?
      facet "tags" do
        terms 'tags.name.exact'
      end
      raise to_json
      # raise to_curl
    end
  end

これは問題ありませんが、ファセット フィルターがクリックされたときに、使用できないタグをファセット フィルターから削除し、新しいファセット カウントを更新したいと考えています。

ここで役立つ場合は、機能するクエリと機能しないクエリのjsonです。

## No Factes
{
   "query":{
      "bool":{
         "must":[
            {
               "query_string":{
                  "query":"England",
                  "default_operator":"AND"
               }
            },
            {
               "term":{
                  "status":"live"
               }
            },
            {
               "term":{
                  "tags.name.exact":[
                     "Pet Friendly"
                  ]
               }
            }
         ]
      }
   },
   "facets":{
      "tags":{
         "terms":{
            "field":"tags.name.exact",
            "size":10,
            "all_terms":false
         }
      }
   },
   "size":2
}

## Facets working
{
   "query":{
      "bool":{
         "must":[
            {
               "query_string":{
                  "query":"England",
                  "default_operator":"AND"
               }
            },
            {
               "term":{
                  "status":"live"
               }
            }
         ]
      }
   },
   "facets":{
      "tags":{
         "terms":{
            "field":"tags.name.exact",
            "size":10,
            "all_terms":false
         }
      }
   },
   "filter":{
      "term":{
         "tags.name.exact":[
            "Pet Friendly"
         ]
      }
   },
   "size":2
}

誰かがアドバイスできることを本当に願っています。これで私の髪を引っ張り始めます。

4

3 に答える 3

3

私は実際に非常に近くにいました。タグには複数のタグを付けることができるため、用語ではなく用語を使用する必要がありました。

  def self.search(params={})
    tire.search(page: params[:page], per_page: 2, load: true) do
      query do
        boolean do
         must { string params[:name], default_operator: "AND" } if 
         must { term :status, 'live' }
         must { term :refno, params[:refno]} if params[:refno].present?
         must { terms 'tags.name.exact', params[:tag]} if params[:tag].present?
        end
      end
      facet "tags" do
        terms 'tags.name.exact'
      end
      # raise to_json
      # raise to_curl
    end
  end

Hoangさん、imotovさん、アドバイスありがとうございます。

于 2012-03-28T18:47:28.720 に答える
3

正確な結果を得るには、ファセット検索にフィルターされたクエリを使用する必要があります。

query do          
  filtered do
     query { <search keywords> }
     filter <your filter> (pass in facet values)
  end
end
<facet>
...
<facet>
于 2012-03-28T02:15:05.273 に答える
2

検索リクエストは通常​​、クエリとフィルタの2つの部分で構成されます。検索リクエストにクエリ部分のみが含まれている場合、ファセットは完全な検索結果に基づいて計算されます。つまり、検索結果に「PetFriendly」というタグが付いた10レコードと、「No Pets Allowed」というタグが付いた5レコードが含まれる場合、ファセット応答には「PetFriendly」と「NoPetsAllowed」の2つのファセットが含まれます。ここで、ユーザーが「ペットフレンドリー」タグを選択して結果を制限するとします。リクエストのクエリ部分に「PetFriendly」句が追加された場合、検索結果は「PetFriendly」タグが付いた10レコードに制限され、「PetFriendly」という1つのファセットのみが返されます。ただし、「PetFriendly」句がフィルターとして追加された場合、検索結果は引き続き10レコードに制限されますが、2つのファセットが返されます。これは、ファセットが検索要求のクエリ部分のみに基づいて計算され、クエリ部分が変更されなかったために発生します。それでも、2つの異なるファセットを持つ15レコードの検索結果が生成されます。

質問に答えるために、クエリが結果を返さない場合(たとえば、ユーザーが「ペットフレンドリー」タグと「ペット許可なし」タグの両方を選択した場合)、結果にはファセットが含まれないため、ファセットは返されません。

于 2012-03-28T00:49:11.010 に答える