職場では、これ以上存在しない人が作成したスクリプトがあります。このように見ているノードを持つXMLファイルを取得するために使用されます。Perlを使用してElasticSearchクエリを動的に変更します
<query maxresults='15000'>
<![CDATA[
and(
isavailable:1,
not(designation:string("test wine", mode="or")),
visibility:10,
bestprice:>0
)
]]>
</query>
我々はこのためにPerlを使用しています。目標は、ノード内に含まれるFAST要求を修正して、いくつかのパラメータを動的に追加する(例えば、 "maxresults"属性を用いて結果を制限する)ことである。コードのこの部分は機能しますが、ElasticSearchに切り替えるので、コードを変更して動作させる必要があります。
問題は、PerlでElasticSearchクエリを変更する信頼できる方法が見つからないということです。これまでのところ私はこれでした:
use strict;
use warnings;
use JSON;
use Data::Dumper;
use Search::Elasticsearch;
my $json =
'{"query":
{"bool":
{"must":
[
{"term":
{"isavailable":"1"}
},
{"term":
{"visibility":"10"}
},
{"range":
{"bestprice":
{"gt":"0"}
}
}
],
"must_not":
[{"regexp":
{"designation":"[Tt]+[Ee]+[Ss]+[Tt]+"}
},
{"regexp":
{"designation":"[Ww]+[Ii]+[Ne]+[Ee]+"}
}
]
}
}
}';
my $result = decode_json($json);
をしかし、それは私に、ハッシュの代わりに、オブジェクトを与え、私は動的にちょうど(例えば)追加するには、このハッシュを変更しようと頭痛を取得しています:
{"regexp": {"designation":"[Ff]+[Oo]+"}}
を「must_not」オブジェクト内の配列に追加します。
私はこれを実行しようとしました:
my %must = (must_not => [{"regexp" =>
{"designation" => "[Ff]+[Oo]+"}
}
]);
$result{"query"} = \%must;
print keys(%{$result{query}});
しかし、これは単に%と、全ノードのコンテンツはハッシュしなければならないと私はそれを正しく追加する方法を見つけることができません置き換えられます。私はmust_notオブジェクトに含まれている配列の内部でハッシュをプッシュしようとしましたが、エラーが発生するだけです。
私は本当にこの状況に困惑しています。特に、私は本当にPerlのエキスパートではないので、どんな助けも歓迎すべきものではありません。
ありがとうございます!
JSONから何かを変換すると、プレーンなデータ構造になります。デフォルトでPerlにはオブジェクトはありません。あなたはデータ構造を変更する必要があります、それは正しいです。あなたは完全に行かなければならない、またはそれが置き換えられる、それは正しい。 – simbabque