ESを使用して検索すると、コンテンツは父と息子の2つのテーブル(親は1対多の子)にあります。logstash同期スキームを設計するときに、多くのピットが発生しました。
それらの多くは中国の素材を使った人間の土地ではなく、私は多くの時間を探求し、ここに記録しました。
親テーブルのフィールド検索は比較的簡単で、一致、範囲、ブースト、キーワードを直接使用できます
サブテーブルには値が列挙されています。group_concatを使用してコンマ区切りのフィールドに集約します。
同時に、es / _templateの下で、テンプレートをインデックスに追加し、集計フィールドにカスタムコンマトークナイザーを使用して、検索するフィールドをgeo_pointタイプまでの距離に変更します(logstashも追加する必要があります)
add_field => {"location" => "%{latitude},%{longitude}" })
このようにして、子テーブルでのほとんどの検索を照合できます(たとえば、Aを含む子テーブルタイプの親テーブルデータを検索する場合、group_concatはA、AB、ACであり、Aをチェックすると見つけることができます)
実際、ほとんどのニーズはこの方法で解決できますが、異常が発生しているため、サブテーブルの[価格]フィールドで範囲検索を実行する必要があります。
たとえば、1200、2300、3450の場合、このような検索は1000〜2000の範囲で見つかります。
同時に、プロダクトマネージャーは非常に頑固で、この要求を主張します
まさか、子テーブルをメインテーブルとして使うことを考えたのですが、親テーブルフィールドが子テーブルの10倍で、冗長データが多すぎるので、まず子テーブルをチェックしてから、すべてを取り出すことを考えました。クエリ条件としての親テーブルID。関連付けに広範囲の価格をチェックさせると、崩壊します。親子インデックスの使用も検討しましたが、関連するドキュメントが少なく、そうではないように感じます。 esの主なプロモーション。
結局、大きな男がついに解決策を見つけました。複数の数字を検索するときは、数字の配列を使用します。範囲は任意の1つを検索し、ヒットする可能性があります。
666を呼び出した後、残りはLogstashの構成です
カンマ区切りのフィールドを配列に分割するのは非常に簡単です
split => ["price", ","]
発生する問題も非常に単純です、文字列が分割されているか、文字列
最後に、長い間検索した後、https://stackoverflow.com/questions/41400364/logstash-convert-array-of-objects-into-array-of-termsでRubyを使用した型変換を見つけました。これは信頼できると感じています
私は自分でルビーの文法をチェックし、最後に配列を変換するスクリプトを書きました
ruby {
code => "event.set('price', event.get('price').map{ |n| n=n.to_i })"
}