1

Rails アプリケーションで Tire を使用して Elasticsearch と通信します。これまでのところ、問題なく動作しています。

問題は、一部の外部データ ソースのインデックス作成です。

Rails内で更新されていない追加のソースがあり、Elasticsearch River JDBCプラグインを使用して60秒ごとにデータベースをポーリングしてこの情報を取得しています。

このデータは、Rails アプリケーション内でアクセスされます。他のモデルでは、単純なフィルターを使用して、ユーザーの検索データへのアクセスを制限しました。

def self.search(params)
  tire.search(page: params[:page], per_page: 50) do |s|
    ...
    filter << { :terms => { location_users: [params[:user_id]] }} if params[:user_id]
    ...
  end
end

タイヤによるインデックス作成中に location_users が配列としてマップされる場所。

def to_indexed_json
  to_json methods: [:location_users]
end

def location_users
  location.users.map(&:id) if location
end

(ユーザーに他人の会計データを検索させたくありません)

川を使用して、MySQL からデータと関連するテーブル列を取得するための SQL をいくつか書きました。location_users のリストを取得できる唯一の方法は、次のようにすることでした。

SELECT a.*, l.location_name, GROUP_CONCAT(lu.id) as location_users FROM accounts...

これにより、カンマ区切りの値を持つ location_users フィールドが得られました。しかし、明らかに配列ではありません。

検索すると、フィルターが配列を探していて、返されたのは単なるリストであるため、結果はゼロです。

このフィールドを配列としてインデックス付けする方法はありますか? または、再び機能するようにフィルターを変更する方法はありますか?

4

1 に答える 1

0

次のように SQL を書き換えることができます。

SELECT a.*, l.location_name, GROUP_CONCAT(lu.id) as `location_users[]` FROM accounts...

フィールド名が '[]' で終わる場合、Elasticsearch River JDBC プラグインは、値を分割して (区切りとしてコンマを使用)、値を配列に変換して格納します。したがって、フィールド データ'1, 2, 3, 4, 5'は、インデックス作成時に [1, 2, 3, 4, 5]になります。

于 2013-11-28T09:16:48.527 に答える