/** * Create the results based on the search hits. Can be overridden by subclass to add particular * behavior (e.g. weight transformation) * * @throws IOException If there are problems reading fields from the underlying Lucene index. */ protected List<LookupResult> createResults( IndexSearcher searcher, TopFieldDocs hits, int num, CharSequence charSequence, boolean doHighlight, Set<String> matchedTokens, String prefixToken) throws IOException { BinaryDocValues textDV = MultiDocValues.getBinaryValues(searcher.getIndexReader(), TEXT_FIELD_NAME); // This will just be null if app didn't pass payloads to build(): // TODO: maybe just stored fields? they compress... BinaryDocValues payloadsDV = MultiDocValues.getBinaryValues(searcher.getIndexReader(), "payloads"); List<LookupResult> results = new ArrayList<>(); BytesRef scratch = new BytesRef(); for (int i = 0; i < hits.scoreDocs.length; i++) { FieldDoc fd = (FieldDoc) hits.scoreDocs[i]; textDV.get(fd.doc, scratch); String text = scratch.utf8ToString(); long score = (Long) fd.fields[0]; BytesRef payload; if (payloadsDV != null) { payload = new BytesRef(); payloadsDV.get(fd.doc, payload); } else { payload = null; } LookupResult result; if (doHighlight) { Object highlightKey = highlight(text, matchedTokens, prefixToken); result = new LookupResult(highlightKey.toString(), highlightKey, score, payload); } else { result = new LookupResult(text, score, payload); } results.add(result); } return results; }
/* * LUCENE-6006: Test undead norms. * ..... * C C / * /< / * ___ __________/_#__=o * /(- /(\_\________ \ * \ ) \ )_ \o \ * /|\ /|\ |' | * | _| * /o __\ * / ' | * / / | * /_/\______| * ( _( < * \ \ \ * \ \ | * \____\____\ * ____\_\__\_\ * /` /` o\ * |___ |_______| * */ public void testReadUndeadNorms() throws Exception { InputStream resource = TestLucene42NormsFormat.class.getResourceAsStream("index.42.undeadnorms.zip"); assertNotNull(resource); Path path = createTempDir("undeadnorms"); TestUtil.unzip(resource, path); Directory dir = FSDirectory.open(path); IndexReader r = DirectoryReader.open(dir); NumericDocValues undeadNorms = MultiDocValues.getNormValues(r, "content"); assertNotNull(undeadNorms); assertEquals(2, r.maxDoc()); assertEquals(0, undeadNorms.get(0)); assertEquals(0, undeadNorms.get(1)); dir.close(); r.close(); }
private void duellReaders(CompositeReader other, LeafReader memIndexReader) throws IOException { Fields memFields = memIndexReader.fields(); for (String field : MultiFields.getFields(other)) { Terms memTerms = memFields.terms(field); Terms iwTerms = memIndexReader.terms(field); if (iwTerms == null) { assertNull(memTerms); } else { NumericDocValues normValues = MultiDocValues.getNormValues(other, field); NumericDocValues memNormValues = memIndexReader.getNormValues(field); if (normValues != null) { // mem idx always computes norms on the fly assertNotNull(memNormValues); assertEquals(normValues.get(0), memNormValues.get(0)); } assertNotNull(memTerms); assertEquals(iwTerms.getDocCount(), memTerms.getDocCount()); assertEquals(iwTerms.getSumDocFreq(), memTerms.getSumDocFreq()); assertEquals(iwTerms.getSumTotalTermFreq(), memTerms.getSumTotalTermFreq()); TermsEnum iwTermsIter = iwTerms.iterator(); TermsEnum memTermsIter = memTerms.iterator(); if (iwTerms.hasPositions()) { final boolean offsets = iwTerms.hasOffsets() && memTerms.hasOffsets(); while (iwTermsIter.next() != null) { assertNotNull(memTermsIter.next()); assertEquals(iwTermsIter.term(), memTermsIter.term()); PostingsEnum iwDocsAndPos = iwTermsIter.postings(null, PostingsEnum.ALL); PostingsEnum memDocsAndPos = memTermsIter.postings(null, PostingsEnum.ALL); while (iwDocsAndPos.nextDoc() != PostingsEnum.NO_MORE_DOCS) { assertEquals(iwDocsAndPos.docID(), memDocsAndPos.nextDoc()); assertEquals(iwDocsAndPos.freq(), memDocsAndPos.freq()); for (int i = 0; i < iwDocsAndPos.freq(); i++) { assertEquals( "term: " + iwTermsIter.term().utf8ToString(), iwDocsAndPos.nextPosition(), memDocsAndPos.nextPosition()); if (offsets) { assertEquals(iwDocsAndPos.startOffset(), memDocsAndPos.startOffset()); assertEquals(iwDocsAndPos.endOffset(), memDocsAndPos.endOffset()); } if (iwTerms.hasPayloads()) { assertEquals(iwDocsAndPos.getPayload(), memDocsAndPos.getPayload()); } } } } } else { while (iwTermsIter.next() != null) { assertEquals(iwTermsIter.term(), memTermsIter.term()); PostingsEnum iwDocsAndPos = iwTermsIter.postings(null); PostingsEnum memDocsAndPos = memTermsIter.postings(null); while (iwDocsAndPos.nextDoc() != PostingsEnum.NO_MORE_DOCS) { assertEquals(iwDocsAndPos.docID(), memDocsAndPos.nextDoc()); assertEquals(iwDocsAndPos.freq(), memDocsAndPos.freq()); } } } } } }
/** @param reader IndexReader object created in {@link QryEval}. */ public DocLengthStore(IndexReader reader) throws IOException { this.reader = reader; for (String field : MultiFields.getIndexedFields(reader)) { this.values.put(field, MultiDocValues.getNormValues(reader, field)); } }