На работе у меня есть сценарий, сделанный людьми, которых больше нет. Он используется для извлечения файла XML с таким узлом:Динамически модифицировать запрос ElasticSearch с использованием Perl
<query maxresults='15000'>
<![CDATA[
and(
isavailable:1,
not(designation:string("test wine", mode="or")),
visibility:10,
bestprice:>0
)
]]>
</query>
Мы используем Perl для этого. Цель состоит в том, чтобы изменить запрос FAST, содержащийся внутри узла, для динамического добавления некоторых параметров (например, ограничить результаты с помощью атрибута maxresults). Эта часть кода работает, но мы переходим к ElasticSearch, и мне нужно изменить код, чтобы он работал.
Проблема в том, что я не могу найти надежный способ изменить запрос ElasticSearch с помощью Perl. До сих пор я сделал это:
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