Gerald_PONT
(Gérald PONT)
September 16, 2024, 2:45pm
1
Hi all,
We are using Elasticsearch in our software. We are migrating from version 8.10.1 to 8.15.1.
We had this code in our software :
rangeQueryBuilder = new RangeQuery.Builder()
.field(fieldName)
.gte(JsonData.of(criterion.getCriteriaSimple().getMinValue()))
.lte(JsonData.of(criterion.getCriteriaSimple().getMaxValue()));
but in 8.15.0 version, this is no more field method from RangeQuery.Build.
I didn't find any help on the web.
Can anyone tell me how to migrate this code properly since 8.15.x version ?
Thank you by advance
dadoonet
(David Pilato)
September 16, 2024, 10:03pm
2
Here's how I'm doing Range queries in 8.15:
@Test
void rangeQuery() throws IOException {
client.index(ir -> ir.index(indexName).id("1").withJson(new StringReader("{\"foo\":1}")));
client.index(ir -> ir.index(indexName).id("2").withJson(new StringReader("{\"foo\":2}")));
client.indices().refresh(rr -> rr.index(indexName));
SearchResponse<ObjectNode> response = client.search(sr -> sr.index(indexName)
.query(q -> q.range(rq -> rq
.number(nrq -> nrq.field("foo").from(0.0).to(1.0))
))
, ObjectNode.class);
assertNotNull(response.hits().total());
assertEquals(1, response.hits().total().value());
assertEquals("1", response.hits().hits().get(0).id());
}
Does this help?
Gerald_PONT
(Gérald PONT)
September 17, 2024, 6:35am
3
Hi,
Thank you very much for your answer. Unfortunaly, in my case, i just wonder how to replace the field method ? What becomes fieldName ? (my problem is that .field(fieldName) doesn't exist anymore)
private Query.Builder resolveFilterSimple(CriteriaFilter criterion) {
String fieldName = null;
if (criterion.getCriteriaSimple().getField() != null) {
fieldName = criterion.getCriteriaSimple().getField();
}
StringBuilder query;
//Echappe TOUS les caratères spéciaux
final String totallyEscapedCriterion = escapeReserved(criterion.getCriteriaSimple().getValue().toString());
//Echappe seulement les \
final String criterionWithEscapedSlashes = onlyEscapeSlash(criterion.getCriteriaSimple().getValue().toString());
RangeQuery.Builder rangeQueryBuilder;
switch (criterion.getCriteriaSimple().getOperator()) {
case BETWEEN:
rangeQueryBuilder = new RangeQuery.Builder()
.field(fieldName)
.gte(JsonData.of(criterion.getCriteriaSimple().getMinValue()))
.lte(JsonData.of(criterion.getCriteriaSimple().getMaxValue()));
return (Query.Builder) new Query.Builder().range(rangeQueryBuilder.build());
dadoonet
(David Pilato)
September 17, 2024, 8:29am
4
Bonjour !
I don't see the problem TBH. You have to use number
now as I shown in the previous example.
RangeQuery rangeQuery = RangeQuery.of(rq ->
rq.number(nrq ->
nrq.field(fieldName)
.from(JsonData.of(criterion.getCriteriaSimple().getMinValue()))
.to(JsonData.of(criterion.getCriteriaSimple().getMaxValue()))));
Does this work?
Gerald_PONT
(Gérald PONT)
September 17, 2024, 9:47am
5
Code is now ok, but problem is sometimes value is not a number, but a date a something else. How can i determine this value type
dadoonet
(David Pilato)
September 17, 2024, 1:49pm
6
I believe the value type will depend on the field type you are running the query against. The IDE is proposing this:
If it's a number, use number
.
If it's a date, use date
.
If it's a String, use term
.
If it's "unknown", use untyped
.
1 Like
dadoonet
(David Pilato)
October 11, 2024, 5:44pm
7
untyped
should help:
RangeQuery rangeQuery = RangeQuery.of(rq ->
rq.untyped(nf -> nf
.field(fieldName)
. from(criterion.getCriteriaSimple().getMinValue()))
. to(criterion.getCriteriaSimple().getMaxValue()))
)))).build();
Yes, it works perfectly with untyped.
Thank you very much for your help!