elasticsearchをなんとなく触っていたら、勘違いしてハマったので記事として残します。
resultsとrecordsメソッドの違い
結論から書くとresultsメソッドはelasticsearchのドキュメントを返しますが、recordsメソッドはデータベースから取得したモデルインスタンスのコレクションを返します。
response = Article.search 'sample'
response.results.map { |r| r._source.title }
# => ["sample article 1", "sample article 2"]
response.records.to_a
# Article Load (0.3ms) SELECT "articles".* FROM "articles" WHERE "articles"."id" IN (1, 2)
# => [#<Article id: 1, title: "sample article 1">, #<Article id: 2, title: "sample article 2">]
仮に<Article id: 1, title: "sample article 1">
のレコードは削除したが、elasticsearchのドキュメントは削除していない状態だと、
response = Article.search 'sample'
response.results.map { |r| r._source.title }
# => ["sample article 1", "sample article 2"]
response.records.to_a
# Article Load (0.3ms) SELECT "articles".* FROM "articles" WHERE "articles"."id" IN (1, 2)
# => [#<Article id: 2, title: "sample article 2">]
recordsメソッドではデータベースから取得した情報を返すので削除されたレコードは結果に返ってきませんが、
resultsメソッドだとelasticsearchのドキュメントを削除していないため削除されたレコードの結果も返ってきてしまいます。
ちなみに二つのメソッドの使い分けですが、基本的にはresultsメソッドを使ってモデルのメソッドにアクセスしたいときのみrecordsメソッドを使うとよさそうです。
参考