ESはint配列で範囲検索を実行します(ESのパワーを体験してください!)

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 })"

}


 

 

おすすめ

転載: blog.csdn.net/u012452555/article/details/84998086