📄 memoryindex.java
字号:
public ArrayIntList() { this(10); } public ArrayIntList(int initialCapacity) { elements = new int[initialCapacity]; } public void add(int elem) { if (size == elements.length) ensureCapacity(size + 1); elements[size++] = elem; } public void add(int pos, int start, int end) { if (size + 3 > elements.length) ensureCapacity(size + 3); elements[size] = pos; elements[size+1] = start; elements[size+2] = end; size += 3; } public int get(int index) { if (index >= size) throwIndex(index); return elements[index]; } public int size() { return size; } public int[] toArray(int stride) { int[] arr = new int[size() / stride]; if (stride == 1) { System.arraycopy(elements, 0, arr, 0, size); // fast path } else { for (int i=0, j=0; j < size; i++, j += stride) arr[i] = elements[j]; } return arr; } private void ensureCapacity(int minCapacity) { int newCapacity = Math.max(minCapacity, (elements.length * 3) / 2 + 1); int[] newElements = new int[newCapacity]; System.arraycopy(elements, 0, newElements, 0, size); elements = newElements; } private void throwIndex(int index) { throw new IndexOutOfBoundsException("index: " + index + ", size: " + size); } /** returns the first few positions (without offsets); debug only */ public String toString(int stride) { int s = size() / stride; int len = Math.min(10, s); // avoid printing huge lists StringBuffer buf = new StringBuffer(4*len); buf.append("["); for (int i = 0; i < len; i++) { buf.append(get(i*stride)); if (i < len-1) buf.append(", "); } if (len != s) buf.append(", ..."); // and some more... buf.append("]"); return buf.toString(); } } /////////////////////////////////////////////////////////////////////////////// // Nested classes: /////////////////////////////////////////////////////////////////////////////// private static final Term MATCH_ALL_TERM = new Term("", ""); /** * Search support for Lucene framework integration; implements all methods * required by the Lucene IndexReader contracts. */ private final class MemoryIndexReader extends IndexReader { private Searcher searcher; // needed to find searcher.getSimilarity() private MemoryIndexReader() { super(null); // avoid as much superclass baggage as possible } // lucene >= 1.9 or lucene-1.4.3 with patch removing "final" in superclass protected void finalize() {} private Info getInfo(String fieldName) { return (Info) fields.get(fieldName); } private Info getInfo(int pos) { return (Info) sortedFields[pos].getValue(); } public int docFreq(Term term) { Info info = getInfo(term.field()); int freq = 0; if (info != null) freq = info.getPositions(term.text()) != null ? 1 : 0; if (DEBUG) System.err.println("MemoryIndexReader.docFreq: " + term + ", freq:" + freq); return freq; } public TermEnum terms() { if (DEBUG) System.err.println("MemoryIndexReader.terms()"); return terms(MATCH_ALL_TERM); } public TermEnum terms(Term term) { if (DEBUG) System.err.println("MemoryIndexReader.terms: " + term); int i; // index into info.sortedTerms int j; // index into sortedFields sortFields(); if (sortedFields.length == 1 && sortedFields[0].getKey() == term.field()) { j = 0; // fast path } else { j = Arrays.binarySearch(sortedFields, term.field(), termComparator); } if (j < 0) { // not found; choose successor j = -j -1; i = 0; if (j < sortedFields.length) getInfo(j).sortTerms(); } else { // found Info info = getInfo(j); info.sortTerms(); i = Arrays.binarySearch(info.sortedTerms, term.text(), termComparator); if (i < 0) { // not found; choose successor i = -i -1; if (i >= info.sortedTerms.length) { // move to next successor j++; i = 0; if (j < sortedFields.length) getInfo(j).sortTerms(); } } } final int ix = i; final int jx = j; return new TermEnum() { private int i = ix; // index into info.sortedTerms private int j = jx; // index into sortedFields public boolean next() { if (DEBUG) System.err.println("TermEnum.next"); if (j >= sortedFields.length) return false; Info info = getInfo(j); if (++i < info.sortedTerms.length) return true; // move to successor j++; i = 0; if (j >= sortedFields.length) return false; getInfo(j).sortTerms(); return true; } public Term term() { if (DEBUG) System.err.println("TermEnum.term: " + i); if (j >= sortedFields.length) return null; Info info = getInfo(j); if (i >= info.sortedTerms.length) return null;// if (DEBUG) System.err.println("TermEnum.term: " + i + ", " + info.sortedTerms[i].getKey()); return createTerm(info, j, (String) info.sortedTerms[i].getKey()); } public int docFreq() { if (DEBUG) System.err.println("TermEnum.docFreq"); if (j >= sortedFields.length) return 0; Info info = getInfo(j); if (i >= info.sortedTerms.length) return 0; return numPositions(info.getPositions(i)); } public void close() { if (DEBUG) System.err.println("TermEnum.close"); } /** Returns a new Term object, minimizing String.intern() overheads. */ private Term createTerm(Info info, int pos, String text) { // Assertion: sortFields has already been called before Term template = info.template; if (template == null) { // not yet cached? String fieldName = (String) sortedFields[pos].getKey(); template = new Term(fieldName, ""); info.template = template; } return template.createTerm(text); } }; } public TermPositions termPositions() { if (DEBUG) System.err.println("MemoryIndexReader.termPositions"); return new TermPositions() { private boolean hasNext; private int cursor = 0; private ArrayIntList current; public void seek(Term term) { if (DEBUG) System.err.println(".seek: " + term); Info info = getInfo(term.field()); current = info == null ? null : info.getPositions(term.text()); hasNext = (current != null); cursor = 0; } public void seek(TermEnum termEnum) { if (DEBUG) System.err.println(".seekEnum"); seek(termEnum.term()); } public int doc() { if (DEBUG) System.err.println(".doc"); return 0; } public int freq() { int freq = current != null ? numPositions(current) : 0; if (DEBUG) System.err.println(".freq: " + freq); return freq; } public boolean next() { if (DEBUG) System.err.println(".next: " + current + ", oldHasNext=" + hasNext); boolean next = hasNext; hasNext = false; return next; } public int read(int[] docs, int[] freqs) { if (DEBUG) System.err.println(".read: " + docs.length); if (!hasNext) return 0; hasNext = false; docs[0] = 0; freqs[0] = freq(); return 1; } public boolean skipTo(int target) { if (DEBUG) System.err.println(".skipTo: " + target); return next(); } public void close() { if (DEBUG) System.err.println(".close"); } public int nextPosition() { // implements TermPositions int pos = current.get(cursor); cursor += stride; if (DEBUG) System.err.println(".nextPosition: " + pos); return pos; } /** * Not implemented. * @throws UnsupportedOperationException */ public int getPayloadLength() { throw new UnsupportedOperationException(); } /** * Not implemented. * @throws UnsupportedOperationException */ public byte[] getPayload(byte[] data, int offset) throws IOException { throw new UnsupportedOperationException(); } public boolean isPayloadAvailable() { // unsuported return false; } }; } public TermDocs termDocs() { if (DEBUG) System.err.println("MemoryIndexReader.termDocs"); return termPositions(); } public TermFreqVector[] getTermFreqVectors(int docNumber) { if (DEBUG) System.err.println("MemoryIndexReader.getTermFreqVectors"); TermFreqVector[] vectors = new TermFreqVector[fields.size()];// if (vectors.length == 0) return null; Iterator iter = fields.keySet().iterator(); for (int i=0; i < vectors.length; i++) { String fieldName = (String) iter.next(); vectors[i] = getTermFreqVector(docNumber, fieldName); } return vectors; } public void getTermFreqVector(int docNumber, TermVectorMapper mapper) throws IOException { if (DEBUG) System.err.println("MemoryIndexReader.getTermFreqVectors"); // if (vectors.length == 0) return null; for (Iterator iterator = fields.keySet().iterator(); iterator.hasNext();) { String fieldName = (String) iterator.next(); getTermFreqVector(docNumber, fieldName, mapper); } }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -