/** * conversion from a SolrQueryResponse (which is a solr-internal data format) to SolrDocumentList * (which is a solrj-format) The conversion is done inside the solrj api using the * BinaryResponseWriter and a very complex unfolding process via * org.apache.solr.common.util.JavaBinCodec.marshal. * * @param request * @param sqr * @return */ public SolrDocumentList SolrQueryResponse2SolrDocumentList( final SolrQueryRequest req, final SolrQueryResponse rsp) { SolrDocumentList sdl = new SolrDocumentList(); NamedList<?> nl = rsp.getValues(); ResultContext resultContext = (ResultContext) nl.get("response"); DocList response = resultContext == null ? new DocSlice(0, 0, new int[0], new float[0], 0, 0.0f) : resultContext.docs; sdl.setNumFound(response == null ? 0 : response.matches()); sdl.setStart(response == null ? 0 : response.offset()); String originalName = Thread.currentThread().getName(); if (response != null) { try { SolrIndexSearcher searcher = req.getSearcher(); final int responseCount = response.size(); DocIterator iterator = response.iterator(); for (int i = 0; i < responseCount; i++) { int docid = iterator.nextDoc(); Thread.currentThread() .setName("EmbeddedSolrConnector.SolrQueryResponse2SolrDocumentList: " + docid); Document responsedoc = searcher.doc(docid, (Set<String>) null); SolrDocument sordoc = doc2SolrDoc(responsedoc); sdl.add(sordoc); } } catch (IOException e) { ConcurrentLog.logException(e); } } Thread.currentThread().setName(originalName); return sdl; }
@Test public void testCollateWithFilter() throws Exception { SolrCore core = h.getCore(); SearchComponent speller = core.getSearchComponent("spellcheck"); assertTrue("speller is null and it shouldn't be", speller != null); ModifiableSolrParams params = new ModifiableSolrParams(); params.add(SpellCheckComponent.COMPONENT_NAME, "true"); params.add(SpellCheckComponent.SPELLCHECK_BUILD, "true"); params.add(SpellCheckComponent.SPELLCHECK_COUNT, "10"); params.add(SpellCheckComponent.SPELLCHECK_COLLATE, "true"); params.add(SpellCheckComponent.SPELLCHECK_MAX_COLLATION_TRIES, "5"); params.add(SpellCheckComponent.SPELLCHECK_MAX_COLLATIONS, "2"); params.add(CommonParams.Q, "lowerfilt:(+fauth +home +loane)"); params.add(CommonParams.FQ, "NOT(id:1)"); // Because a FilterQuery is applied which removes doc id#1 from possible hits, we would // not want the collations to return us "lowerfilt:(+faith +hope +loaves)" as this only matches // doc id#1. SolrRequestHandler handler = core.getRequestHandler("spellCheckCompRH"); SolrQueryResponse rsp = new SolrQueryResponse(); rsp.add("responseHeader", new SimpleOrderedMap()); SolrQueryRequest req = new LocalSolrQueryRequest(core, params); handler.handleRequest(req, rsp); req.close(); NamedList values = rsp.getValues(); NamedList spellCheck = (NamedList) values.get("spellcheck"); NamedList suggestions = (NamedList) spellCheck.get("suggestions"); List<String> collations = suggestions.getAll("collation"); assertTrue(collations.size() == 1); assertTrue(collations.get(0).equals("lowerfilt:(+faith +hope +love)")); }
@Test public void testCollateWithMultipleRequestHandlers() throws Exception { SolrCore core = h.getCore(); SearchComponent speller = core.getSearchComponent("spellcheck"); assertTrue("speller is null and it shouldn't be", speller != null); ModifiableSolrParams params = new ModifiableSolrParams(); params.add(SpellCheckComponent.COMPONENT_NAME, "true"); params.add(SpellCheckComponent.SPELLCHECK_DICT, "multipleFields"); params.add(SpellCheckComponent.SPELLCHECK_BUILD, "true"); params.add(SpellCheckComponent.SPELLCHECK_COUNT, "10"); params.add(SpellCheckComponent.SPELLCHECK_COLLATE, "true"); params.add(SpellCheckComponent.SPELLCHECK_MAX_COLLATION_TRIES, "1"); params.add(SpellCheckComponent.SPELLCHECK_MAX_COLLATIONS, "1"); params.add(CommonParams.Q, "peac"); // SpellCheckCompRH has no "qf" defined. It will not find "peace" from "peac" despite it being // in the dictionary // because requrying against this Request Handler results in 0 hits. SolrRequestHandler handler = core.getRequestHandler("spellCheckCompRH"); SolrQueryResponse rsp = new SolrQueryResponse(); rsp.add("responseHeader", new SimpleOrderedMap()); SolrQueryRequest req = new LocalSolrQueryRequest(core, params); handler.handleRequest(req, rsp); req.close(); NamedList values = rsp.getValues(); NamedList spellCheck = (NamedList) values.get("spellcheck"); NamedList suggestions = (NamedList) spellCheck.get("suggestions"); String singleCollation = (String) suggestions.get("collation"); assertNull(singleCollation); // SpellCheckCompRH1 has "lowerfilt1" defined in the "qf" param. It will find "peace" from // "peac" because // requrying field "lowerfilt1" returns the hit. params.remove(SpellCheckComponent.SPELLCHECK_BUILD); handler = core.getRequestHandler("spellCheckCompRH1"); rsp = new SolrQueryResponse(); rsp.add("responseHeader", new SimpleOrderedMap()); req = new LocalSolrQueryRequest(core, params); handler.handleRequest(req, rsp); req.close(); values = rsp.getValues(); spellCheck = (NamedList) values.get("spellcheck"); suggestions = (NamedList) spellCheck.get("suggestions"); singleCollation = (String) suggestions.get("collation"); assertEquals(singleCollation, "peace"); }
@Test public void testComponent() throws Exception { SolrCore core = h.getCore(); SearchComponent sc = core.getSearchComponent("clustering"); assertTrue("sc is null and it shouldn't be", sc != null); ModifiableSolrParams params = new ModifiableSolrParams(); params.add(ClusteringComponent.COMPONENT_NAME, "true"); params.add(CommonParams.Q, "*:*"); params.add(ClusteringParams.USE_SEARCH_RESULTS, "true"); SolrRequestHandler handler = core.getRequestHandler("standard"); SolrQueryResponse rsp; rsp = new SolrQueryResponse(); rsp.add("responseHeader", new SimpleOrderedMap()); SolrQueryRequest req = new LocalSolrQueryRequest(core, params); handler.handleRequest(req, rsp); NamedList values = rsp.getValues(); Object clusters = values.get("clusters"); // System.out.println("Clusters: " + clusters); assertTrue("clusters is null and it shouldn't be", clusters != null); req.close(); params = new ModifiableSolrParams(); params.add(ClusteringComponent.COMPONENT_NAME, "true"); params.add(ClusteringParams.ENGINE_NAME, "mock"); params.add(ClusteringParams.USE_COLLECTION, "true"); params.add(QueryComponent.COMPONENT_NAME, "false"); handler = core.getRequestHandler("docClustering"); rsp = new SolrQueryResponse(); rsp.add("responseHeader", new SimpleOrderedMap()); req = new LocalSolrQueryRequest(core, params); handler.handleRequest(req, rsp); values = rsp.getValues(); clusters = values.get("clusters"); // System.out.println("Clusters: " + clusters); assertTrue("clusters is null and it shouldn't be", clusters != null); req.close(); }
@Test public void testExtractOnly() throws Exception { ExtractingRequestHandler handler = (ExtractingRequestHandler) h.getCore().getRequestHandler("/update/extract"); assertTrue("handler is null and it shouldn't be", handler != null); SolrQueryResponse rsp = loadLocal("extraction/solr-word.pdf", ExtractingParams.EXTRACT_ONLY, "true"); assertTrue("rsp is null and it shouldn't be", rsp != null); NamedList list = rsp.getValues(); String extraction = (String) list.get("solr-word.pdf"); assertTrue("extraction is null and it shouldn't be", extraction != null); assertTrue( extraction + " does not contain " + "solr-word", extraction.indexOf("solr-word") != -1); NamedList nl = (NamedList) list.get("solr-word.pdf_metadata"); assertTrue("nl is null and it shouldn't be", nl != null); Object title = nl.get("title"); assertTrue("title is null and it shouldn't be", title != null); assertTrue(extraction.indexOf("<?xml") != -1); rsp = loadLocal( "extraction/solr-word.pdf", ExtractingParams.EXTRACT_ONLY, "true", ExtractingParams.EXTRACT_FORMAT, ExtractingDocumentLoader.TEXT_FORMAT); assertTrue("rsp is null and it shouldn't be", rsp != null); list = rsp.getValues(); extraction = (String) list.get("solr-word.pdf"); assertTrue("extraction is null and it shouldn't be", extraction != null); assertTrue( extraction + " does not contain " + "solr-word", extraction.indexOf("solr-word") != -1); assertTrue(extraction.indexOf("<?xml") == -1); nl = (NamedList) list.get("solr-word.pdf_metadata"); assertTrue("nl is null and it shouldn't be", nl != null); title = nl.get("title"); assertTrue("title is null and it shouldn't be", title != null); }
@Test public void testGroupCollapseNoGroups() throws IOException { NamedList values = mock(NamedList.class); when(rsp.getValues()).thenReturn(values); when(values.get("grouped")).thenReturn(null); when(rb.grouping()).thenReturn(true); when(params.getBool(GroupCollapseParams.GROUP_COLLAPSE, false)).thenReturn(true); when(params.get(GroupCollapseParams.GROUP_COLLAPSE_FL)).thenReturn("price,discount,isCloseout"); component.process(rb); verify(rsp, never()).add(anyString(), anyObject()); }
private void mockResponse(boolean allDocsCloseout) throws IOException { NamedList values = mock(NamedList.class); NamedList grouped = mock(NamedList.class); NamedList productId = mock(NamedList.class); when(rsp.getValues()).thenReturn(values); when(values.get("grouped")).thenReturn(grouped); when(grouped.get("productId")).thenReturn(productId); List groups = new ArrayList(); when(productId.get("groups")).thenReturn(groups); int[] docIds = new int[] {1, 2, 3, 4}; float[] scores = new float[] {1.0f, 1.0f, 1.0f, 1.0f}; NamedList firstProduct = mock(NamedList.class); DocSlice firstDocList = new DocSlice(0, 2, docIds, scores, 2, 1.0f); NamedList secondProduct = mock(NamedList.class); DocSlice secondDocList = new DocSlice(2, 2, docIds, scores, 2, 1.0f); if (allDocsCloseout) { mockDocument(1, 100.0, 0.0, true); mockDocument(2, 80.0, 20.0, true); mockDocument(3, 80.0, 20.0, true); mockDocument(4, 60.0, 40.0, true); } else { mockDocument(1, 100.0, 0.0, false); mockDocument(2, 80.0, 20.0, true); mockDocument(3, 80.0, 20.0, true); mockDocument(4, 60.0, 40.0, false); } groups.add(firstProduct); groups.add(secondProduct); when(firstProduct.get("groupValue")).thenReturn("product1"); when(firstProduct.get("doclist")).thenReturn(firstDocList); when(secondProduct.get("groupValue")).thenReturn("product2"); when(secondProduct.get("doclist")).thenReturn(secondDocList); }
@Override public String getContentType( SolrQueryRequest solrQueryRequest, org.apache.solr.response.SolrQueryResponse solrQueryResponse) { final MessageContext msgContext = (MessageContext) solrQueryResponse.getValues().get("MessageContext"); final SolrSRWDatabase.Transport transport = (SolrSRWDatabase.Transport) msgContext.getProperty(SolrSRWDatabase.Transport.class.getSimpleName()); switch (transport) { default: return CONTENT_TYPE_XML_UTF8; case JSON: return CONTENT_TYPE_JSON_UTF8; } }
@Test public void testXPath() throws Exception { ExtractingRequestHandler handler = (ExtractingRequestHandler) h.getCore().getRequestHandler("/update/extract"); assertTrue("handler is null and it shouldn't be", handler != null); SolrQueryResponse rsp = loadLocal( "extraction/example.html", ExtractingParams.XPATH_EXPRESSION, "/xhtml:html/xhtml:body/xhtml:a/descendant:node()", ExtractingParams.EXTRACT_ONLY, "true"); assertTrue("rsp is null and it shouldn't be", rsp != null); NamedList list = rsp.getValues(); String val = (String) list.get("example.html"); val = val.trim(); assertTrue( val + " is not equal to " + "linkNews", val.equals("linkNews") == true); // there are two <a> tags, and they get collapesd }
public DocListSearcher( final String querystring, String sort, final int offset, final int count, final String... fields) { // construct query final SolrQuery params = AbstractSolrConnector.getSolrQuery(querystring, sort, offset, count, fields); // query the server this.request = EmbeddedSolrConnector.this.request(params); SolrQueryResponse rsp = query(request); NamedList<?> nl = rsp.getValues(); ResultContext resultContext = (ResultContext) nl.get("response"); if (resultContext == null) log.warn("DocListSearcher: no response for query '" + querystring + "'"); this.response = resultContext == null ? new DocSlice(0, 0, new int[0], new float[0], 0, 0.0f) : resultContext.docs; }
// If ok==true, we shouldn't be seeing any failure cases. // if ok==false, the core being examined should have a failure in the list. private void checkStatus(CoreContainer cc, Boolean ok, String core) throws Exception { SolrQueryResponse resp = new SolrQueryResponse(); final CoreAdminHandler admin = new CoreAdminHandler(cc); admin.handleRequestBody( req( CoreAdminParams.ACTION, CoreAdminParams.CoreAdminAction.STATUS.toString(), CoreAdminParams.CORE, core), resp); Map<String, Exception> failures = (Map<String, Exception>) resp.getValues().get("initFailures"); if (ok) { if (failures.size() != 0) { fail("Should have cleared the error, but there are failues " + failures.toString()); } } else { if (failures.size() == 0) { fail("Should have had errors here but the status return has no failures!"); } } }
@Test public void testXPath() throws Exception { ExtractingRequestHandler handler = (ExtractingRequestHandler) h.getCore().getRequestHandler("/update/extract"); assertTrue("handler is null and it shouldn't be", handler != null); SolrQueryResponse rsp = loadLocal( "extraction/example.html", ExtractingParams.XPATH_EXPRESSION, "/xhtml:html/xhtml:body/xhtml:a/descendant::node()", ExtractingParams.EXTRACT_ONLY, "true"); assertTrue("rsp is null and it shouldn't be", rsp != null); NamedList list = rsp.getValues(); String val = (String) list.get("example.html"); assertEquals("News", val.trim()); // there is only one matching <a> tag loadLocal( "extraction/example.html", "literal.id", "example1", "captureAttr", "true", "defaultField", "text", "capture", "div", "fmap.div", "foo_t", "boost.foo_t", "3", "xpath", "/xhtml:html/xhtml:body/xhtml:div//node()", "commit", "true"); assertQ(req("+id:example1 +foo_t:\"here is some text in a div\""), "//*[@numFound='1']"); }
@Test public void testExtendedCollate() throws Exception { SolrCore core = h.getCore(); SearchComponent speller = core.getSearchComponent("spellcheck"); assertTrue("speller is null and it shouldn't be", speller != null); ModifiableSolrParams params = new ModifiableSolrParams(); params.add(CommonParams.QT, "spellCheckCompRH"); params.add(CommonParams.Q, "lowerfilt:(+fauth +home +loane)"); params.add(SpellCheckComponent.SPELLCHECK_EXTENDED_RESULTS, "true"); params.add(SpellCheckComponent.COMPONENT_NAME, "true"); params.add(SpellCheckComponent.SPELLCHECK_BUILD, "true"); params.add(SpellCheckComponent.SPELLCHECK_COUNT, "10"); params.add(SpellCheckComponent.SPELLCHECK_COLLATE, "true"); // Testing backwards-compatible behavior. // Returns 1 collation as a single string. // All words are "correct" per the dictionary, but this collation would // return no results if tried. SolrRequestHandler handler = core.getRequestHandler("spellCheckCompRH"); SolrQueryResponse rsp = new SolrQueryResponse(); rsp.add("responseHeader", new SimpleOrderedMap()); SolrQueryRequest req = new LocalSolrQueryRequest(core, params); handler.handleRequest(req, rsp); req.close(); NamedList values = rsp.getValues(); NamedList spellCheck = (NamedList) values.get("spellcheck"); NamedList suggestions = (NamedList) spellCheck.get("suggestions"); String singleCollation = (String) suggestions.get("collation"); assertEquals("lowerfilt:(+faith +homer +loaves)", singleCollation); // Testing backwards-compatible response format but will only return a // collation that would return results. params.remove(SpellCheckComponent.SPELLCHECK_BUILD); params.add(SpellCheckComponent.SPELLCHECK_MAX_COLLATION_TRIES, "5"); params.add(SpellCheckComponent.SPELLCHECK_MAX_COLLATIONS, "1"); handler = core.getRequestHandler("spellCheckCompRH"); rsp = new SolrQueryResponse(); rsp.add("responseHeader", new SimpleOrderedMap()); req = new LocalSolrQueryRequest(core, params); handler.handleRequest(req, rsp); req.close(); values = rsp.getValues(); spellCheck = (NamedList) values.get("spellcheck"); suggestions = (NamedList) spellCheck.get("suggestions"); singleCollation = (String) suggestions.get("collation"); assertEquals("lowerfilt:(+faith +hope +loaves)", singleCollation); // Testing returning multiple collations if more than one valid // combination exists. params.remove(SpellCheckComponent.SPELLCHECK_MAX_COLLATION_TRIES); params.remove(SpellCheckComponent.SPELLCHECK_MAX_COLLATIONS); params.add(SpellCheckComponent.SPELLCHECK_MAX_COLLATION_TRIES, "5"); params.add(SpellCheckComponent.SPELLCHECK_MAX_COLLATIONS, "2"); handler = core.getRequestHandler("spellCheckCompRH"); rsp = new SolrQueryResponse(); rsp.add("responseHeader", new SimpleOrderedMap()); req = new LocalSolrQueryRequest(core, params); handler.handleRequest(req, rsp); req.close(); values = rsp.getValues(); spellCheck = (NamedList) values.get("spellcheck"); suggestions = (NamedList) spellCheck.get("suggestions"); List<String> collations = suggestions.getAll("collation"); assertTrue(collations.size() == 2); for (String multipleCollation : collations) { assertTrue( multipleCollation.equals("lowerfilt:(+faith +hope +love)") || multipleCollation.equals("lowerfilt:(+faith +hope +loaves)")); } // Testing return multiple collations with expanded collation response // format. params.add(SpellCheckComponent.SPELLCHECK_COLLATE_EXTENDED_RESULTS, "true"); handler = core.getRequestHandler("spellCheckCompRH"); rsp = new SolrQueryResponse(); rsp.add("responseHeader", new SimpleOrderedMap()); req = new LocalSolrQueryRequest(core, params); handler.handleRequest(req, rsp); req.close(); values = rsp.getValues(); spellCheck = (NamedList) values.get("spellcheck"); suggestions = (NamedList) spellCheck.get("suggestions"); List<NamedList> expandedCollationList = suggestions.getAll("collation"); Set<String> usedcollations = new HashSet<String>(); assertTrue(expandedCollationList.size() == 2); for (NamedList expandedCollation : expandedCollationList) { String multipleCollation = (String) expandedCollation.get("collationQuery"); assertTrue( multipleCollation.equals("lowerfilt:(+faith +hope +love)") || multipleCollation.equals("lowerfilt:(+faith +hope +loaves)")); assertTrue(!usedcollations.contains(multipleCollation)); usedcollations.add(multipleCollation); int hits = (Integer) expandedCollation.get("hits"); assertTrue(hits == 1); NamedList misspellingsAndCorrections = (NamedList) expandedCollation.get("misspellingsAndCorrections"); assertTrue(misspellingsAndCorrections.size() == 3); String correctionForFauth = (String) misspellingsAndCorrections.get("fauth"); String correctionForHome = (String) misspellingsAndCorrections.get("home"); String correctionForLoane = (String) misspellingsAndCorrections.get("loane"); assertTrue(correctionForFauth.equals("faith")); assertTrue(correctionForHome.equals("hope")); assertTrue(correctionForLoane.equals("love") || correctionForLoane.equals("loaves")); } }
@Test public void testCoreAdminHandler() throws Exception { final File workDir = createTempDir().toFile(); final CoreContainer cores = h.getCoreContainer(); final CoreAdminHandler admin = new CoreAdminHandler(cores); Path instDir; try (SolrCore template = cores.getCore("collection1")) { assertNotNull(template); instDir = template.getCoreDescriptor().getInstanceDir(); } assertTrue("instDir doesn't exist: " + instDir, Files.exists(instDir)); final File instPropFile = new File(workDir, "instProp"); FileUtils.copyDirectory(instDir.toFile(), instPropFile); SolrQueryResponse resp = new SolrQueryResponse(); // Sneaking in a test for using a bad core name try { admin.handleRequestBody( req( CoreAdminParams.ACTION, CoreAdminParams.CoreAdminAction.CREATE.toString(), CoreAdminParams.INSTANCE_DIR, instPropFile.getAbsolutePath(), CoreAdminParams.NAME, "ugly$core=name"), resp); } catch (SolrException se) { assertTrue( "Expected error message for bad core name.", se.toString().contains("Invalid core")); } CoreDescriptor cd = cores.getCoreDescriptor("ugly$core=name"); assertNull("Should NOT have added this core!", cd); // create a new core (using CoreAdminHandler) w/ properties admin.handleRequestBody( req( CoreAdminParams.ACTION, CoreAdminParams.CoreAdminAction.CREATE.toString(), CoreAdminParams.INSTANCE_DIR, instPropFile.getAbsolutePath(), CoreAdminParams.NAME, "props", CoreAdminParams.PROPERTY_PREFIX + "hoss", "man", CoreAdminParams.PROPERTY_PREFIX + "foo", "baz"), resp); assertNull("Exception on create", resp.getException()); cd = cores.getCoreDescriptor("props"); assertNotNull("Core not added!", cd); assertEquals(cd.getCoreProperty("hoss", null), "man"); assertEquals(cd.getCoreProperty("foo", null), "baz"); // attempt to create a bogus core and confirm failure ignoreException("Could not load config"); try { resp = new SolrQueryResponse(); admin.handleRequestBody( req( CoreAdminParams.ACTION, CoreAdminParams.CoreAdminAction.CREATE.toString(), CoreAdminParams.NAME, "bogus_dir_core", CoreAdminParams.INSTANCE_DIR, "dir_does_not_exist_127896"), resp); fail("bogus collection created ok"); } catch (SolrException e) { // :NOOP: // :TODO: CoreAdminHandler's exception messages are terrible, otherwise we could assert // something useful here } unIgnoreException("Could not load config"); // check specifically for status of the failed core name resp = new SolrQueryResponse(); admin.handleRequestBody( req( CoreAdminParams.ACTION, CoreAdminParams.CoreAdminAction.STATUS.toString(), CoreAdminParams.CORE, "bogus_dir_core"), resp); Map<String, Exception> failures = (Map<String, Exception>) resp.getValues().get("initFailures"); assertNotNull("core failures is null", failures); NamedList<Object> status = (NamedList<Object>) resp.getValues().get("status"); assertNotNull("core status is null", status); assertEquals("wrong number of core failures", 1, failures.size()); Exception fail = failures.get("bogus_dir_core"); assertNotNull("null failure for test core", fail); assertTrue( "init failure doesn't mention problem: " + fail.getCause().getMessage(), 0 < fail.getCause().getMessage().indexOf("dir_does_not_exist")); assertEquals( "bogus_dir_core status isn't empty", 0, ((NamedList) status.get("bogus_dir_core")).size()); // Try renaming the core, we should fail // First assert that the props core exists cd = cores.getCoreDescriptor("props"); assertNotNull("Core disappeared!", cd); // now rename it something else just for kicks since we don't actually test this that I could // find. admin.handleRequestBody( req( CoreAdminParams.ACTION, CoreAdminParams.CoreAdminAction.RENAME.toString(), CoreAdminParams.CORE, "props", CoreAdminParams.OTHER, "rename_me"), resp); cd = cores.getCoreDescriptor("rename_me"); assertNotNull("Core should have been renamed!", cd); // Rename it something bogus and see if you get an exception, the old core is still there and // the bogus one isn't try { admin.handleRequestBody( req( CoreAdminParams.ACTION, CoreAdminParams.CoreAdminAction.RENAME.toString(), CoreAdminParams.CORE, "rename_me", CoreAdminParams.OTHER, "bad$name"), resp); } catch ( SolrException e) { // why the heck does create return a SolrException (admittedly wrapping an IAE) assertTrue( "Expected error message for bad core name.", e.getMessage().contains("Invalid core")); } cd = cores.getCoreDescriptor("bad$name"); assertNull("Core should NOT exist!", cd); cd = cores.getCoreDescriptor("rename_me"); assertNotNull("Core should have been renamed!", cd); // :TODO: because of SOLR-3665 we can't ask for status from all cores }
public void testCopyFieldsAndFieldBoostsAndDocBoosts() throws Exception { SolrCore core = h.getCore(); IndexSchema schema = core.getLatestSchema(); SolrInputDocument doc = new SolrInputDocument(); final float DOC_BOOST = 3.0F; doc.setDocumentBoost(DOC_BOOST); doc.addField("id", "42"); SolrInputField inTitle = new SolrInputField("title"); inTitle.addValue("titleA", 2.0F); inTitle.addValue("titleB", 7.0F); final float TITLE_BOOST = 2.0F * 7.0F; assertEquals(TITLE_BOOST, inTitle.getBoost(), 0.0F); doc.put(inTitle.getName(), inTitle); SolrInputField inFoo = new SolrInputField("foo_t"); inFoo.addValue("summer time", 1.0F); inFoo.addValue("in the city", 5.0F); inFoo.addValue("living is easy", 11.0F); final float FOO_BOOST = 1.0F * 5.0F * 11.0F; assertEquals(FOO_BOOST, inFoo.getBoost(), 0.0F); doc.put(inFoo.getName(), inFoo); Document out = DocumentBuilder.toDocument(doc, schema); IndexableField[] outTitle = out.getFields(inTitle.getName()); assertEquals("wrong number of title values", 2, outTitle.length); IndexableField[] outNoNorms = out.getFields("title_stringNoNorms"); assertEquals("wrong number of nonorms values", 2, outNoNorms.length); IndexableField[] outFoo = out.getFields(inFoo.getName()); assertEquals("wrong number of foo values", 3, outFoo.length); IndexableField[] outText = out.getFields("text"); assertEquals("wrong number of text values", 5, outText.length); // since Lucene no longer has native document boosts, we should find // the doc boost multiplied into the boost on the first field value // of each field. All other field values should be 1.0f // (lucene will multiply all of the field value boosts later) assertEquals(TITLE_BOOST * DOC_BOOST, outTitle[0].boost(), 0.0F); assertEquals(1.0F, outTitle[1].boost(), 0.0F); // assertEquals(FOO_BOOST * DOC_BOOST, outFoo[0].boost(), 0.0F); assertEquals(1.0F, outFoo[1].boost(), 0.0F); assertEquals(1.0F, outFoo[2].boost(), 0.0F); // assertEquals(TITLE_BOOST * DOC_BOOST, outText[0].boost(), 0.0F); assertEquals(1.0F, outText[1].boost(), 0.0F); assertEquals(FOO_BOOST, outText[2].boost(), 0.0F); assertEquals(1.0F, outText[3].boost(), 0.0F); assertEquals(1.0F, outText[4].boost(), 0.0F); // copyField dest with no norms should not have recieved any boost assertEquals(1.0F, outNoNorms[0].boost(), 0.0F); assertEquals(1.0F, outNoNorms[1].boost(), 0.0F); // now index that SolrInputDocument to check the computed norms assertU(adoc(doc)); assertU(commit()); SolrQueryRequest req = req("q", "id:42"); try { // very hack-ish SolrQueryResponse rsp = new SolrQueryResponse(); core.execute(core.getRequestHandler(req.getParams().get(CommonParams.QT)), req, rsp); DocList dl = ((ResultContext) rsp.getValues().get("response")).docs; assertTrue("can't find the doc we just added", 1 == dl.size()); int docid = dl.iterator().nextDoc(); SolrIndexSearcher searcher = req.getSearcher(); AtomicReader reader = SlowCompositeReaderWrapper.wrap(searcher.getTopReaderContext().reader()); assertTrue( "similarity doesn't extend DefaultSimilarity, " + "config or defaults have changed since test was written", searcher.getSimilarity() instanceof DefaultSimilarity); DefaultSimilarity sim = (DefaultSimilarity) searcher.getSimilarity(); NumericDocValues titleNorms = reader.getNormValues("title"); NumericDocValues fooNorms = reader.getNormValues("foo_t"); NumericDocValues textNorms = reader.getNormValues("text"); assertEquals(expectedNorm(sim, 2, TITLE_BOOST * DOC_BOOST), titleNorms.get(docid)); assertEquals(expectedNorm(sim, 8 - 3, FOO_BOOST * DOC_BOOST), fooNorms.get(docid)); assertEquals( expectedNorm(sim, 2 + 8 - 3, TITLE_BOOST * FOO_BOOST * DOC_BOOST), textNorms.get(docid)); } finally { req.close(); } }
@Override public void write( Writer writer, SolrQueryRequest solrQueryRequest, org.apache.solr.response.SolrQueryResponse solrQueryResponse) throws IOException { final MessageContext msgContext = (MessageContext) solrQueryResponse.getValues().get("MessageContext"); final Message message = msgContext.getResponseMessage(); if (message == null) return; SolrSRWDatabase.RequestTypes requestType = (SolrSRWDatabase.RequestTypes) msgContext.getProperty(SolrSRWDatabase.RequestTypes.class.getSimpleName()); String tag = (requestType == null) ? null : "</" + requestType.name().replace("Request", "Response") + ">"; final SolrSRWDatabase.Transport transport = (SolrSRWDatabase.Transport) msgContext.getProperty(SolrSRWDatabase.Transport.class.getSimpleName()); switch (transport) { case SRW: ByteArrayOutputStream baos = new ByteArrayOutputStream(); try { message.writeTo(baos); } catch (SOAPException e) { log.error(e, e); // Impossible at this point. } writer.write(baos.toString("UTF-8")); break; case SRU: // Response which requires removal of SOAP envelope and xsi:type attributes. writer.write("<?xml version=\"1.0\" encoding=\"UTF-8\"?>"); Object resource = msgContext.getProperty("resource"); if (resource == null) // No system stylesheet... but sometimes people may add a custom one. { resource = msgContext.getProperty("stylesheet"); if (resource != null) { writer.write( "<?xml-stylesheet title=\"Custom XSL formatting\" type=\"text/xsl\" href=\""); writer.write(String.valueOf(resource)); writer.write("\"?>"); } } else { Object _stylesheet = msgContext.getProperty("stylesheet"); String stylesheet = (_stylesheet == null) ? String.valueOf(resource) : String.valueOf(_stylesheet); if (stylesheet.length() != 0) { writer.write( "<?xml-stylesheet title=\"OCLC XSL formatting\" type=\"text/xsl\" href=\""); writer.write(String.valueOf(resource)); writer.write("\"?>"); } } // We need to change the SOAP response into SRU writer.write(cleanup(message, tag, true)); break; case JSON: SolrSRWDatabase db = (SolrSRWDatabase) msgContext.getProperty("db"); String jsonp = (String) msgContext.getProperty("jsonp"); writer.write(jsonp); writer.write("("); Transformer t = db.getTransformers("xml-2-json"); StreamSource source = new StreamSource(new StringReader(cleanup(message, tag, true))); try { t.transform(source, new StreamResult(writer)); } catch (TransformerException e) { log.error(e, e); } writer.write(")"); break; } }