Hello.

My model has the following Root structure, which consists of N
"TimeSpaceIntervals":

{
  id: <int>,
  intervals: [
  {
    sector: <string>,
     entry: <int>,
     exit: <int>
   }, ....
  ]
}

(exit>=entry is guaranteed)

Given a new Root record, I must check for intersections with the incoming
data, which means, finding any document in the index having a sector whose
time interval [entry, exit] overlaps with a corresponding sector of the
incoming data.

Currently, given a Root r, I am converting the records to documents as
follows:

    public Document doc(Root r) {
        var doc = new Document();
        doc.add(new IntPoint("id", r.id));

        r.intervals.forEach(i -> {
            doc.add(new IntPoint(i.sector + ".entry", i.entry));
            doc.add(new IntPoint(i.sector + ".exit", i.exit));
        });
        return doc;
    }

And for a given Root n, the intersection query becomes:

    Query intersection(Root n) {
        var q = new BooleanQuery.Builder();
        // exclude same id
        q.add(new BooleanClause(IntPoint.newExactQuery("id", n.id),
Occur.MUST_NOT));
        // find overlapping sectors
        n.intervals().forEach(i -> {
            var sub = new BooleanQuery.Builder();
            // other docs must start before this exits
            sub.add(new BooleanClause(IntPoint.newRangeQuery(i.sector +
".entry", 0, i.exit), Occur.FILTER));
            // other docs must end after this starts
            sub.add(new BooleanClause(IntPoint.newRangeQuery(i.sector +
".exit", i.entry, Integer.MAX_VALUE), Occur.FILTER));

            q.add(new BooleanClause(sub.build(), Occur.SHOULD));
        });

        return q.build();
    }

The problem with this approach is that the index will have as many fields
as twice the cardinality of sectors. Currently, the number of distinct
sectors small (< 500), so I think this strategy is OK, but I don't like the
idea of having "dynamic fields".

Given the intersection query requirement, is there a better way to model
the index, aside from creating multiple documents per Root entry?

Regards

Reply via email to