package eu.europeana.cloud.service.dps.index; /* import eu.europeana.cloud.service.dps.index.exception.IndexerException; import eu.europeana.cloud.service.dps.index.structure.IndexedDocument; import eu.europeana.cloud.service.dps.index.structure.SearchResult; import java.io.File; import java.io.IOException; import java.net.URISyntaxException; import java.nio.file.Paths; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.commons.io.FileUtils; import org.apache.solr.client.solrj.SolrClient; import org.apache.solr.client.solrj.SolrQuery; import org.apache.solr.client.solrj.SolrServerException; import org.apache.solr.client.solrj.embedded.EmbeddedSolrServer; import org.apache.solr.client.solrj.request.CoreAdminRequest; import org.apache.solr.client.solrj.response.QueryResponse; import org.apache.solr.common.SolrDocument; import org.apache.solr.common.SolrInputDocument; import org.junit.After; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import org.junit.Before; import org.junit.Test; */ /** * * @author Pavel Kefurt <Pavel.Kefurt@gmail.com> *//* public class SolrTest { private SolrClient client; @Before public void before() throws URISyntaxException, SolrServerException, IOException { client = new EmbeddedSolrServer(Paths.get(getClass().getResource("/solr_home").toURI()), "test_core"); CoreAdminRequest.Create createRequest = new CoreAdminRequest.Create(); createRequest.setCoreName("test_core"); createRequest.setConfigSet("minimal"); client.request(createRequest); } @After public void after() throws IOException { client.close(); File f = FileUtils.toFile(getClass().getResource("/solr_home/test_core")); if(f != null && f.exists()) { FileUtils.deleteDirectory(f); } } @Test public void searchTest() throws IndexerException, SolrServerException, IOException { SolrInputDocument document1 = new SolrInputDocument(); document1.addField("id", "1"); document1.addField("field1", "value1"); SolrInputDocument document2 = new SolrInputDocument(); document2.addField("id", "2"); document2.addField("field1", "value2"); SolrInputDocument document3 = new SolrInputDocument(); document3.addField("id", "3"); document3.addField(IndexFields.RAW_TEXT.toString(), "some full text with lot of informations"); SolrInputDocument document4 = new SolrInputDocument(); document4.addField("id", "4"); document4.addField(IndexFields.RAW_TEXT.toString(), "dog is an animal"); SolrInputDocument document5 = new SolrInputDocument(); document5.addField("id", "5"); document5.addField("field1", "value3"); document5.addField("field2", "value1 and value2"); SolrInputDocument document6 = new SolrInputDocument(); document6.addField("id", "6"); document6.addField("field1", "value4"); document6.addField("field2", "value5"); SolrInputDocument document7 = new SolrInputDocument(); document7.addField("id", "7"); document7.addField("field3", "my phrase"); SolrInputDocument document8 = new SolrInputDocument(); document8.addField("id", "8"); document8.addField("field3", "my dog and phrase"); SolrInputDocument document9 = new SolrInputDocument(); document9.addField("id", "9"); document9.addField("field3", "my dog and cat"); SolrInputDocument document10 = new SolrInputDocument(); document10.addField("id", "10"); document10.addField("field3", "my dog and your cat"); SolrInputDocument document11 = new SolrInputDocument(); document11.addField("id", "11"); document11.addField("field3", "my cat and dog"); client.add(document1); client.add(document2); client.add(document3); client.add(document4); client.add(document5); client.add(document6); client.add(document7); client.add(document8); client.add(document9); client.add(document10); client.add(document11); client.commit(); Solr es = new Solr(client, "test_core"); SearchResult result; //----- search ----- String[] fields1 = {"field1"}; result = es.search("value2", fields1); assertTrue(result.getTotalHits() == 1); String[] fields2 = {"field1", "field2"}; result = es.search("value2", fields2); assertTrue(result.getTotalHits() == 2); result = es.search("xxxxx", fields2); assertTrue(result.getTotalHits() == 0); result = es.search("value2", fields2, 1, Indexer.TIMEOUT); assertTrue(result.getTotalHits() == 2); assertTrue(result.getHits().size() == 1); result = es.search("value2", fields2, -2, Indexer.TIMEOUT); assertTrue(result.getTotalHits() == 0); result = es.search("value2", null); assertTrue(result.getTotalHits() == 0); result = es.search(null, fields1); assertTrue(result.getTotalHits() == 0); //----- full text ----- result = es.searchFullText("cat is animal"); assertTrue(result.getTotalHits() == 1); result = es.searchFullText("superman and batman"); assertTrue(result.getTotalHits() == 0); result = es.searchFullText(null); assertTrue(result.getTotalHits() == 0); //----- phrase ----- result = es.searchPhrase("dog and cat", "field3", 0); assertTrue(result.getTotalHits() == 1); result = es.searchPhrase("dog and cat", "field3", 1); assertTrue(result.getTotalHits() == 2); result = es.searchPhrase("dog and cat", "field3", 4); assertTrue(result.getTotalHits() == 3); result = es.searchPhrase("xxx ccc", "field3", 1); assertTrue(result.getTotalHits() == 0); result = es.searchPhrase("dog and cat", "field3", -1); assertTrue(result.getTotalHits() == 0); result = es.searchPhrase("dog and cat", "field3", 1, -2, Indexer.TIMEOUT); assertTrue(result.getTotalHits() == 0); result = es.searchPhrase("dog and cat", null, 1); assertTrue(result.getTotalHits() == 0); result = es.searchPhrase(null, "field3", 1); assertTrue(result.getTotalHits() == 0); //----- advanced search ----- result = es.advancedSearch("field3:(+dog -your phrase^4)"); assertTrue(result.getTotalHits() == 3); assertEquals("8", result.getHits().get(0).getId()); Map<String, Object> p1 = new HashMap<>(); p1.put("default_operator", Indexer.Operator.AND); result = es.advancedSearch("field3:(+dog -your phrase^4)", p1); assertTrue(result.getTotalHits() == 1); Map<String, Object> p2 = new HashMap<>(); p2.put("default_field", "field3"); result = es.advancedSearch("+dog -your phrase^4", p2); assertTrue(result.getTotalHits() == 3); result = es.advancedSearch("field3:(+dog -your phrase^4)", null); assertTrue(result.getTotalHits() == 3); result = es.advancedSearch("field3:(+dog -your phrase^4)", null, -2, Indexer.TIMEOUT); assertTrue(result.getTotalHits() == 0); result = es.advancedSearch(""); assertTrue(result.getTotalHits() == 0); result = es.advancedSearch(null); assertTrue(result.getTotalHits() == 0); } @Test public void moreLikeThisTest() throws IndexerException, IOException, SolrServerException { SolrInputDocument document7 = new SolrInputDocument(); document7.addField("id", "7"); document7.addField("field3", "my phrase"); SolrInputDocument document8 = new SolrInputDocument(); document8.addField("id", "8"); document8.addField("field3", "my dog and phrase"); SolrInputDocument document9 = new SolrInputDocument(); document9.addField("id", "9"); document9.addField("field3", "my dog and cat"); SolrInputDocument document10 = new SolrInputDocument(); document10.addField("id", "10"); document10.addField("field3", "my dog and your cat"); SolrInputDocument document11 = new SolrInputDocument(); document11.addField("id", "11"); document11.addField("field3", "my cat and dog"); client.add(document7); client.add(document8); client.add(document9); client.add(document10); client.add(document11); client.commit(); Solr es = new Solr(client, "test_core"); SearchResult result; String[] fields3 = {"field3", IndexFields.RAW_TEXT.toString()}; result = es.getMoreLikeThis("9",fields3, 20, 1, 1, 20, 1, 20, 10, 0, true); assertTrue(result.getTotalHits() == 5); result = es.getMoreLikeThis("9",fields3, 20, 1, 1, 20, 1, 20, 10, 0, false); assertTrue(result.getTotalHits() == 4); result = es.getMoreLikeThis("9", null, 20, 1, 1, 20, 1, 20, 10, 0, false); assertTrue(result.getTotalHits() == 4); result = es.getMoreLikeThis("9", null, 20, 1, 1, 20, 1, 20, -2, 0, false); assertTrue(result.getTotalHits() == 0); result = es.getMoreLikeThis("", null, 20, 1, 1, 20, 1, 20, 10, 0, false); assertTrue(result.getTotalHits() == 0); result = es.getMoreLikeThis(null, null, 20, 1, 1, 20, 1, 20, 10, 0, false); assertTrue(result.getTotalHits() == 0); } @Test public void scrollTest() throws IndexerException, SolrServerException, IOException { SolrInputDocument document1 = new SolrInputDocument(); document1.addField("id", "1"); document1.addField("field1", "value1"); SolrInputDocument document2 = new SolrInputDocument(); document2.addField("id", "2"); document2.addField("field1", "value2"); SolrInputDocument document5 = new SolrInputDocument(); document5.addField("id", "5"); document5.addField("field1", "value3"); document5.addField("field2", "value1 and value2"); SolrInputDocument document6 = new SolrInputDocument(); document6.addField("id", "6"); document6.addField("field1", "value4"); document6.addField("field2", "value5"); client.add(document1); client.add(document2); client.add(document5); client.add(document6); client.commit(); Solr es = new Solr(client, "test_core"); SearchResult result; String[] fields2 = {"field1", "field2"}; result = es.search("value2", fields2, 1, 5000); assertTrue(result.getTotalHits() == 2); assertTrue(result.getHits().size() == 1); result = es.getNextPage(result.getScrollId(), result); assertTrue(result.getTotalHits() == 2); assertTrue(result.getHits().size() == 1); result = es.getNextPage(result.getScrollId(), result); assertNull(result.getScrollId()); } @Test public void manipulationTest() throws IndexerException, SolrServerException, IOException { SolrInputDocument document1 = new SolrInputDocument(); document1.addField("id", "1"); document1.addField("field1", "value1"); client.add(document1); client.commit(); Solr es = new Solr(client, "test_core"); //---- Map<String, Object> data = new HashMap<>(); data.put("field2", "value2"); data.put("field1", "value99"); es.insert(data); es.insert("keyX", data); assertTrue(client.query(new SolrQuery("*:*")).getResults().getNumFound() == 3); //---- Map<String, Object> data2 = new HashMap<>(); data.put("field1", "value9"); es.update("keyX", data); QueryResponse response = client.query(new SolrQuery("*:*")); assertTrue(response.getResults().getNumFound() == 3); for(SolrDocument hit: response.getResults()) { if("keyX".equals(hit.get("id"))) { assertEquals("value9", ((Collection<Object>)hit.get("field1")).toArray()[0]); assertEquals("value2", ((Collection<Object>)hit.get("field2")).toArray()[0]); break; } } //---- es.update("keyX", (String)null); response = client.query(new SolrQuery("*:*")); assertTrue(response.getResults().getNumFound() == 3); for(SolrDocument hit: response.getResults()) { if("keyX".equals(hit.get("id"))) { assertEquals("value9", ((Collection<Object>)hit.get("field1")).toArray()[0]); assertEquals("value2", ((Collection<Object>)hit.get("field2")).toArray()[0]); break; } } //---- es.update("keyX", (Map)null); response = client.query(new SolrQuery("*:*")); assertTrue(response.getResults().getNumFound() == 3); for(SolrDocument hit: response.getResults()) { if("keyX".equals(hit.get("id"))) { assertEquals("value9", ((Collection<Object>)hit.get("field1")).toArray()[0]); assertEquals("value2", ((Collection<Object>)hit.get("field2")).toArray()[0]); break; } } //---- es.update("keyX", new HashMap<String, Object>()); response = client.query(new SolrQuery("*:*")); assertTrue(response.getResults().getNumFound() == 3); for(SolrDocument hit: response.getResults()) { if("keyX".equals(hit.get("id"))) { assertEquals("value9", ((Collection<Object>)hit.get("field1")).toArray()[0]); assertEquals("value2", ((Collection<Object>)hit.get("field2")).toArray()[0]); break; } } //---- es.update("keyX", ""); response = client.query(new SolrQuery("*:*")); assertTrue(response.getResults().getNumFound() == 3); for(SolrDocument hit: response.getResults()) { if("keyX".equals(hit.get("id"))) { assertEquals("value9", ((Collection<Object>)hit.get("field1")).toArray()[0]); assertEquals("value2", ((Collection<Object>)hit.get("field2")).toArray()[0]); break; } } //---- es.delete("1"); assertTrue(client.query(new SolrQuery("*:*")).getResults().getNumFound() == 2); //---- es.delete(null); assertTrue(client.query(new SolrQuery("*:*")).getResults().getNumFound() == 2); //---- es.delete(""); assertTrue(client.query(new SolrQuery("*:*")).getResults().getNumFound() == 2); //---- es.insert(null, data); assertTrue(client.query(new SolrQuery("*:*")).getResults().getNumFound() == 3); //---- es.insert("2", new HashMap<String, Object>()); assertTrue(client.query(new SolrQuery("*:*")).getResults().getNumFound() == 3); //---- es.insert("3", ""); assertTrue(client.query(new SolrQuery("*:*")).getResults().getNumFound() == 3); //---- es.insert("4", (String)null); assertTrue(client.query(new SolrQuery("*:*")).getResults().getNumFound() == 3); //---- es.insert("4", (Map)null); assertTrue(client.query(new SolrQuery("*:*")).getResults().getNumFound() == 3); //---- get ---- IndexedDocument document = es.getDocument("keyX"); assertTrue(document.hasData()); assertEquals("value9", document.getData().get("field1")); assertEquals("value2", document.getData().get("field2")); document = es.getDocument("xxxx"); assertNull(document); document = es.getDocument(""); assertNull(document); document = es.getDocument(null); assertNull(document); } @Test public void complexDataManipulationTest() throws IndexerException { String data1 = "{\"field1\":\"value1\", \"field2\":[\"F2_val1\", \"F2_val2\"]," + "\"field3\":{\"F3_F1\":\"F3_F1_val\", \"F3_F2\":[\"F3_F2_val1\", \"F3_F2_val2\"]}," + "\"field4\":[{\"F4_V_F1\":\"F4_V_F1_val\"}, {\"F4_V_F2\":\"F4_V_F2_val\"}]}"; List<Object> forField2 = new ArrayList<>(); forField2.add("F2_val1"); forField2.add("F2_val2"); List<Object> forFieldF3_F2 = new ArrayList<>(); forFieldF3_F2.add("F3_F2_val1"); forFieldF3_F2.add("F3_F2_val2"); Map<String, Object> forField3 = new HashMap<>(); forField3.put("F3_F1", "F3_F1_val"); forField3.put("F3_F2", forFieldF3_F2); Map<String, Object> forField4_0 = new HashMap<>(); forField4_0.put("F4_V_F1", "F4_V_F1_val"); Map<String, Object> forField4_1 = new HashMap<>(); forField4_1.put("F4_V_F2", "F4_V_F2_val"); List<Object> forField4 = new ArrayList<>(); forField4.add(forField4_0); forField4.add(forField4_1); Map<String, Object> data2 = new HashMap<>(); data2.put("field1", "value1"); data2.put("field2", forField2); data2.put("field3", forField3); data2.put("field4", forField4); Solr es = new Solr(client, "test_core"); es.insert("key1", data1); IndexedDocument document1 = es.getDocument("key1"); assertTrue(document1.hasData()); es.insert("key2", data2); IndexedDocument document2 = es.getDocument("key2"); assertTrue(document2.hasData()); assertEquals(data2, document1.getData()); assertEquals(data2, document2.getData()); } } */