0

マルチテナントアプリでtiregemを介してelasticsearchを使用しようとしています。アプリには多くのアカウントがあり、各アカウントには多くのユーザーがいます。

ここで、アカウントIDに基づいてユーザーにインデックスを付けたいと思います。

ユーザーモデル:

  include Tire::Model::Search
  mapping do
    indexes :name, :boost => 10
    indexes :account_id
    indexes :company_name
    indexes :description
  end

  def to_indexed_json
    to_json( :only => [:name, :account_id, :description, :company_name], 
           )
  end

検索クエリー:

  User.tire.search do
    query do
      filtered do
        query { string 'vamsikrishna' }
        filter :term, :account_id => 1
      end
    end
  end

フィルタは正常に機能し、結果はフィルタされたアカウントID(1)に対してのみ表示されます。しかし、クエリ文字列1を検索すると、

  User.tire.search do
    query do
      filtered do
        query { string '1' }
        filter :term, :account_id => 1
      end
    end
  end

1という名前のユーザーがいるとします。その場合、結果はアカウントID1のすべてのユーザーとそのユーザーに対しても表示されます。これは、to_indexed_jsonにaccount_idを追加したためです。では、名前1のユーザーのみを表示するにはどうすればよいですか?(すべてのユーザーがヒットに参加できるわけではありません。名前が1のユーザーのみが表示されます)

名前、会社名、説明が1のユーザーがいない場合は、結果を表示したくありません。しかし、私の場合、説明したように、アカウントID1のすべてのユーザーを取得します。

4

1 に答える 1

0

_allインデックスを作成したすべてのフィールドのコンテンツのコピーを含む特別なフィールドを検索しています。次のような正しい結果を得るには、特定のフィールドを検索する必要がありますfield_name:1

必要に応じて、クエリ文字列を使用して複数のフィールドを検索できます。

{
    "query_string" : {
        "fields" : ["field1", "field2", "field3"],
        "query" : "1"
    }
}
于 2012-10-30T12:39:56.510 に答える