Hi, I have been experimenting with using a int payload as a unique identifier, one per Document. I have successfully loaded them in using the TermPositions API with something like:
public static void loadPayloadIntArray(IndexReader reader, Term term, int[] intArray, int from, int to) throws Exception { TermPositions tp = null; byte[] dataBuffer = new byte[4]; int intVal = -1; //System.out.println("loadPayloadIntArray(" + from + " -> " + to + ")"); try { tp = reader.termPositions(term); tp.skipTo(from); do { tp.nextPosition(); tp.getPayload(dataBuffer, 0); intVal = PayloadHelper.decodeInt(dataBuffer, 0); intArray[from] = intVal; } while (++from <= to && tp.next()); } finally { if (tp != null) { tp.close(); } } } This works fine, it even allows me to use several threads in parallel to each load a part of the array, thus reducing the time taken. However, performance is not as great as I would like - with indexes of ~4m docs it can take over 3 seconds. (These are cold start times, no reader cacheing and OS read caches completely flushed). Increasing the number of loader threads (calling the method shown) doesn't help much, which makes me suspect there is some synchronized stuff going on inside TermPositions. So ... onto my question(s): 1) Because this approach is still faster than using FieldCache, my belief is that payloads are stored sequentially in the index - is this true? 2) If so, is there some raw, lower level I/O I can call which will allow me to load much bigger chunks of payload rather than a single int at a time? Thanks for any help in this area. Chris