0

特定のプロジェクトに属する Doc モデル has_and_belongs_to_many プロジェクトを検索しようとしています。

models/doc.rb には「elasticsearch/model」が必要です

class Doc < ActiveRecord::Base
  include Elasticsearch::Model
  include Elasticsearch::Model::Callbacks

  settings index: {
    analysis: {
      tokenizer: {
        ngram_tokenizer: {
          type: "nGram",
          min_gram: "2",
          max_gram: "3",
          token_chars: [
            "letter",
            "digit",
            "punctuation"
          ]
        }
      },
      analyzer: {
        ngram_analyzer: {
          tokenizer: "ngram_tokenizer"
        }
      },
    },
  } do
      mappings do
        indexes :sourcedb, type: 'string', analyzer: 'ngram_analyzer'
        indexes :sourceid, type: 'string', analyzer: 'ngram_analyzer'
        indexes :body, type: 'string', analyzer: 'ngram_analyzer'
        indexes :docs_projects do
          indexes :doc_id
          indexes :project_id
          indexes :projects do
            indexes :id, index: :not_analyzed
          end
        end
      end
  end

  def as_indexed_json(options={})
    as_json(
      only: [:id, :sourcedb, :sourceid, :body],
      include: { projects: {only: :id} }  
    )
  end
end

検索方法は以下

  search_docs = docs.search(
    query: {
      bool:{
        must: [
          {match: {
              'projects.id' => project_id
            }
          }
        ]
      }
    },
    size: 5000,
  ).records.order('sourcedb ASC, sourceid ASC').paginate(page:params[:page], per_page: 10)

この検索メソッドはエラーなしで終了しますが、何も返されません。

  Doc Load (4.6ms)  SELECT "docs".* FROM "docs" INNER JOIN "docs_projects" ON "docs"."id" = "docs_projects"."doc_id" WHERE "docs_projects"."project_id" = 56
   (0.4ms)  SELECT COUNT(*) FROM "docs" WHERE 1=0
  Doc Load (0.3ms)  SELECT "docs".* FROM "docs" WHERE 1=0 ORDER BY sourcedb ASC, sourceid ASC LIMIT 10 OFFSET 0
  CACHE (0.0ms)  SELECT COUNT(*) FROM "docs" WHERE 1=0

where([projects.id IN (?)], project_ids) で検索しようとしましたが、最大サイズのプロジェクトに属するドキュメントを検索できません。
アソシエーションとの一致で検索する方法は?
前もって感謝します。

4

1 に答える 1