4

ActiveRecord モデルが関連付けられた Rails アプリがあります。

簡単にするために、 https://github.com/elastic/elasticsearch-rails/blob/master/elasticsearch-model/examples/activerecord_associations.rb#L95とまったく同じ DB スキーマがあるとしましょう。

そして、「ジョン」という名前の記事の著者を検索したいと思います。

Article.search('john')article.authorsの指定されたフィールド first_name と last_name を期待どおりに検索します。

より具体的に、Article から article.authors までを first_name のみで検索すると言いたいと思います。

Article.search(authors: {first_name: 'john'})動作しません。

上記を行う正しい方法は何ですか?

また、Elastic HQ を使用して、記事のインデックスにフィールドauthorsがあります。これは、elasticsearch-rails のインデックス作成が正しく、ネストされた作成者であることを意味しますか? エラスティック本社記事のマッピング

4

1 に答える 1

6

アクセス可能で機能している ElasticSearch インスタンスがあると仮定します。ネストされたエンティティでクエリを使用する場合は、chewygem によって提供されるインターフェイスを使用する必要があります。つまり、カスタム インデックス フィールドを定義します。これはバニラのドキュメントの例です。まず、作成する必要があります/app/chewy/article_index.rb

class ArticleIndex < Chewy::Index
  define_type Article.published.includes(:author_name) do
    # `published` above is example scope of published-only articles
    # I guess you may have :title and :body fields in model
    field :title, :body
    # Here is custom index field with *full* author name.
    # We use lambda to extract it from article:
    field :author_name, value: ->(article) { "#{article.author.first_name} #{article.author.last_name}" }
  end
end

次のようにクエリします。

UsersIndex.query(text: {author_name: 'John'})
# or
UsersIndex.query(text: {author_name: 'Smith'})
# or even ...
UsersIndex.query(text: {author_name: 'John Smith'}) 

その他の読み物:

乾杯!

于 2015-09-14T08:23:41.910 に答える