/* * Constellation - An open source and standard compliant SDI * http://www.constellation-sdi.org * * Copyright 2014 Geomatys. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /* * Constellation - An open source and Keyword compliant SDI * http://www.constellation-sdi.org * * (C) 2005, Institut de Recherche pour le Développement * (C) 2007 - 2008, Geomatys * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. */ package org.constellation.metadata.index.analyzer; import org.apache.lucene.analysis.core.KeywordAnalyzer; import org.apache.lucene.search.Filter; import org.apache.lucene.search.Sort; import org.apache.lucene.search.SortField; import org.apache.sis.geometry.GeneralEnvelope; import org.constellation.metadata.index.generic.GenericIndexer; import org.geotoolkit.lucene.filter.LuceneOGCFilter; import org.geotoolkit.lucene.filter.SerialChainFilter; import org.geotoolkit.lucene.filter.SpatialQuery; import org.geotoolkit.lucene.index.LuceneIndexSearcher; import org.geotoolkit.referencing.CRS; import org.geotoolkit.util.FileUtilities; import org.junit.After; import org.junit.AfterClass; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; import org.opengis.referencing.crs.CoordinateReferenceSystem; import java.io.File; import java.util.ArrayList; import java.util.LinkedHashSet; import java.util.List; import java.util.Set; import java.util.logging.Level; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; //Junit dependencies /** * * @author Guilhem Legal (Geomatys) */ public class KeywordAnalyzerTest extends AbstractAnalyzerTest { private static File configDirectory = new File("KeywordAnalyzerTest"); @BeforeClass public static void setUpClass() throws Exception { FileUtilities.deleteDirectory(configDirectory); List<Object> object = fillTestData(); GenericIndexer indexer = new GenericIndexer(object, null, configDirectory, "", new KeywordAnalyzer(), Level.FINER, true); indexer.destroy(); indexSearcher = new LuceneIndexSearcher(configDirectory, "", new KeywordAnalyzer(), true); indexSearcher.setLogLevel(Level.FINER); } @AfterClass public static void tearDownClass() throws Exception { FileUtilities.deleteDirectory(configDirectory); indexSearcher.destroy(); } @Before public void setUp() throws Exception { } @After public void tearDown() throws Exception { } /** * Test simple lucene search. * * @throws java.lang.Exception */ @Test public void simpleSearchTest() throws Exception { Filter nullFilter = null; String resultReport = ""; /** * Test 1 simple search: title = 90008411.ctd */ SpatialQuery spatialQuery = new SpatialQuery("Title:\"90008411.ctd\"", nullFilter, SerialChainFilter.AND); Set<String> result = indexSearcher.doSearch(spatialQuery); for (String s: result) { resultReport = resultReport + s + '\n'; } logger.log(Level.FINER, "SimpleSearch 1:\n{0}", resultReport); // the result we want are this Set<String> expectedResult = new LinkedHashSet<>(); expectedResult.add("42292_5p_19900609195600"); assertEquals(expectedResult, result); /** * Test 2 simple search: indentifier != 40510_145_19930221211500 */ spatialQuery = new SpatialQuery("metafile:doc NOT identifier:\"40510_145_19930221211500\"", nullFilter, SerialChainFilter.AND); result = indexSearcher.doSearch(spatialQuery); resultReport = ""; for (String s: result) { resultReport = resultReport + s + '\n'; } logger.log(Level.FINER, "SimpleSearch 2:\n{0}", resultReport); expectedResult = new LinkedHashSet<>(); expectedResult.add("42292_5p_19900609195600"); expectedResult.add("42292_9s_19900610041000"); expectedResult.add("39727_22_19750113062500"); expectedResult.add("11325_158_19640418141800"); expectedResult.add("CTDF02"); expectedResult.add("MDWeb_FR_SY_couche_vecteur_258"); expectedResult.add("Spot5-Cyprus-THX-IMAGERY3_ortho1"); assertEquals(expectedResult, result); /** * Test 3 simple search: originator = Donnees CTD NEDIPROD VI 120 */ spatialQuery = new SpatialQuery("abstract:\"Donnees CTD NEDIPROD VI 120\"", nullFilter, SerialChainFilter.AND); result = indexSearcher.doSearch(spatialQuery); resultReport = ""; for (String s: result) { resultReport = resultReport + s + '\n'; } logger.log(Level.FINER, "simpleSearch 3:\n{0}", resultReport); expectedResult = new LinkedHashSet<>(); expectedResult.add("42292_5p_19900609195600"); assertEquals(expectedResult, result); /** * Test 4 simple search: ID = World Geodetic System 84 */ spatialQuery = new SpatialQuery("ID:\"World Geodetic System 84\"", nullFilter, SerialChainFilter.AND); result = indexSearcher.doSearch(spatialQuery); resultReport = ""; for (String s: result) { resultReport = resultReport + s + '\n'; } logger.log(Level.FINER, "simpleSearch 4:\n{0}", resultReport); expectedResult = new LinkedHashSet<>(); expectedResult.add("42292_9s_19900610041000"); expectedResult.add("39727_22_19750113062500"); expectedResult.add("40510_145_19930221211500"); assertEquals(expectedResult, result); /** * Test 5 simple search: ID = 0UINDITENE */ spatialQuery = new SpatialQuery("ID:\"0UINDITENE\"", nullFilter, SerialChainFilter.AND); result = indexSearcher.doSearch(spatialQuery); resultReport = ""; for (String s: result) { resultReport = resultReport + s + '\n'; } logger.log(Level.FINER, "simpleSearch 5:\n{0}", resultReport); expectedResult = new LinkedHashSet<>(); expectedResult.add("11325_158_19640418141800"); assertEquals(expectedResult, result); /** * Test 6 range search: Title <= FRA */ spatialQuery = new SpatialQuery("Title_sort:[0 TO FRA]", nullFilter, SerialChainFilter.AND); result = indexSearcher.doSearch(spatialQuery); resultReport = ""; for (String s: result) { resultReport = resultReport + s + '\n'; } logger.log(Level.FINER, "simpleSearch 6:\n{0}", resultReport); expectedResult = new LinkedHashSet<>(); expectedResult.add("42292_5p_19900609195600"); expectedResult.add("42292_9s_19900610041000"); expectedResult.add("39727_22_19750113062500"); expectedResult.add("11325_158_19640418141800"); expectedResult.add("40510_145_19930221211500"); assertEquals(expectedResult, result); /** * Test 7 range search: Title > FRA */ spatialQuery = new SpatialQuery("Title_sort:[FRA TO z]", nullFilter, SerialChainFilter.AND); result = indexSearcher.doSearch(spatialQuery); resultReport = ""; for (String s: result) { resultReport = resultReport + s + '\n'; } logger.log(Level.FINER, "simpleSearch 7:\n{0}", resultReport); expectedResult = new LinkedHashSet<>(); expectedResult.add("CTDF02"); expectedResult.add("MDWeb_FR_SY_couche_vecteur_258"); expectedResult.add("Spot5-Cyprus-THX-IMAGERY3_ortho1"); assertEquals(expectedResult, result); } /** * Test simple lucene search. * * @throws java.lang.Exception */ @Test public void wildCharSearchTest() throws Exception { Filter nullFilter = null; String resultReport = ""; /** * Test 1 simple search: title = title1 */ SpatialQuery spatialQuery = new SpatialQuery("Title:90008411*", nullFilter, SerialChainFilter.AND); Set<String> result = indexSearcher.doSearch(spatialQuery); for (String s: result) { resultReport = resultReport + s + '\n'; } logger.log(Level.FINER, "wildCharSearch 1:\n{0}", resultReport); Set<String> expectedResult = new LinkedHashSet<>(); expectedResult.add("42292_5p_19900609195600"); expectedResult.add("42292_9s_19900610041000"); assertEquals(expectedResult, result); /** * Test 2 wildChar search: abstract LIKE *NEDIPROD* */ spatialQuery = new SpatialQuery("abstract:*NEDIPROD*", nullFilter, SerialChainFilter.AND); result = indexSearcher.doSearch(spatialQuery); resultReport = ""; for (String s: result) { resultReport = resultReport + s + '\n'; } logger.log(Level.FINER, "wildCharSearch 2:\n{0}", resultReport); expectedResult = new LinkedHashSet<>(); expectedResult.add("42292_5p_19900609195600"); // it didn't find any result (why???) expectedResult = new LinkedHashSet<>(); assertEquals(expectedResult, result); /** * Test 3 wildChar search: title like *.ctd */ resultReport = ""; spatialQuery = new SpatialQuery("Title:*.ctd", nullFilter, SerialChainFilter.AND); result = indexSearcher.doSearch(spatialQuery); for (String s: result) { resultReport = resultReport + s + '\n'; } logger.log(Level.FINER, "wildCharSearch 3:\n{0}", resultReport); assertTrue(result.contains("39727_22_19750113062500")); assertTrue(result.contains("40510_145_19930221211500")); assertTrue(result.contains("42292_5p_19900609195600")); assertTrue(result.contains("42292_9s_19900610041000")); /** * Test 4 wildCharSearch: anstract LIKE *onnees CTD NEDIPROD VI 120 */ spatialQuery = new SpatialQuery("abstract:(*onnees CTD NEDIPROD VI 120)", nullFilter, SerialChainFilter.AND); result = indexSearcher.doSearch(spatialQuery); resultReport = ""; for (String s: result) { resultReport = resultReport + s + '\n'; } logger.log(Level.FINER, "wildCharSearch 4:\n{0}", resultReport); expectedResult = new LinkedHashSet<>(); expectedResult.add("42292_5p_19900609195600"); // ERROR it didn't find any result (why???) expectedResult = new LinkedHashSet<>(); assertEquals(expectedResult, result); /** * Test 5 wildCharSearch: Format LIKE *MEDATLAS ASCII* */ spatialQuery = new SpatialQuery("Format:(*MEDATLAS ASCII*)", nullFilter, SerialChainFilter.AND); result = indexSearcher.doSearch(spatialQuery); resultReport = ""; for (String s: result) { resultReport = resultReport + s + '\n'; } logger.log(Level.FINER, "wildCharSearch 5:\n{0}", resultReport); expectedResult = new LinkedHashSet<>(); expectedResult.add("42292_5p_19900609195600"); expectedResult.add("42292_9s_19900610041000"); expectedResult.add("39727_22_19750113062500"); expectedResult.add("40510_145_19930221211500"); // ERROR it didn't find any result (why???) expectedResult = new LinkedHashSet<>(); assertEquals(expectedResult, result); } /** * Test simple lucene search. * * @throws java.lang.Exception */ @Test public void wildCharUnderscoreSearchTest() throws Exception { Filter nullFilter = null; String resultReport = ""; /** * Test 1 simple search: title = title1 */ SpatialQuery spatialQuery = new SpatialQuery("identifier:*MDWeb_FR_SY*", nullFilter, SerialChainFilter.AND); Set<String> result = indexSearcher.doSearch(spatialQuery); for (String s: result) { resultReport = resultReport + s + '\n'; } logger.log(Level.FINER, " wildCharUnderscoreSearch 1:\n{0}", resultReport); Set<String> expectedResult = new LinkedHashSet<>(); //expectedResult.add("MDWeb_FR_SY_couche_vecteur_258"); error '_' is tokenized assertEquals(expectedResult, result); /** * Test 2 simple search: title = identifier:Spot5-Cyprus-THX-IMAGERY3_ortho* */ spatialQuery = new SpatialQuery("identifier:Spot5-Cyprus-THX-IMAGERY3_ortho*", nullFilter, SerialChainFilter.AND); result = indexSearcher.doSearch(spatialQuery); for (String s: result) { resultReport = resultReport + s + '\n'; } logger.log(Level.FINER, " wildCharUnderscoreSearch 1:\n{0}", resultReport); expectedResult = new LinkedHashSet<>(); //expectedResult.add("Spot5-Cyprus-THX-IMAGERY3_ortho1"); // error assertEquals(expectedResult, result); } /** * Test simple lucene date search. * * @throws java.lang.Exception */ @Test public void dateSearchTest() throws Exception { Filter nullFilter = null; String resultReport = ""; /** * Test 1 date search: date after 25/01/2009 */ SpatialQuery spatialQuery = new SpatialQuery("date:{20090125 30000101}", nullFilter, SerialChainFilter.AND); Set<String> result = indexSearcher.doSearch(spatialQuery); for (String s: result) { resultReport = resultReport + s + '\n'; } logger.log(Level.FINER, "DateSearch 1:\n{0}", resultReport); Set<String> expectedResult = new LinkedHashSet<>(); expectedResult.add("42292_9s_19900610041000"); expectedResult.add("39727_22_19750113062500"); expectedResult.add("11325_158_19640418141800"); expectedResult.add("CTDF02"); assertEquals(expectedResult, result); } /** * Test sorted lucene search. * * @throws java.lang.Exception */ @Test public void sortedSearchTest() throws Exception { Filter nullFilter = null; String resultReport = ""; /** * Test 1 sorted search: all orderBy identifier ASC */ SpatialQuery spatialQuery = new SpatialQuery("metafile:doc", nullFilter, SerialChainFilter.AND); SortField sf = new SortField("identifier_sort", SortField.Type.STRING, false); spatialQuery.setSort(new Sort(sf)); Set<String> result = indexSearcher.doSearch(spatialQuery); for (String s: result) { resultReport = resultReport + s + '\n'; } logger.log(Level.FINER, "SortedSearch 1:\n{0}", resultReport); Set<String> expectedResult = new LinkedHashSet<>(); expectedResult.add("11325_158_19640418141800"); expectedResult.add("39727_22_19750113062500"); expectedResult.add("40510_145_19930221211500"); expectedResult.add("42292_5p_19900609195600"); expectedResult.add("42292_9s_19900610041000"); expectedResult.add("CTDF02"); expectedResult.add("MDWeb_FR_SY_couche_vecteur_258"); expectedResult.add("Spot5-Cyprus-THX-IMAGERY3_ortho1"); assertEquals(expectedResult, result); /** * Test 2 sorted search: all orderBy identifier DSC */ resultReport = ""; spatialQuery = new SpatialQuery("metafile:doc", nullFilter, SerialChainFilter.AND); sf = new SortField("identifier_sort", SortField.Type.STRING, true); spatialQuery.setSort(new Sort(sf)); result = indexSearcher.doSearch(spatialQuery); for (String s: result) { resultReport = resultReport + s + '\n'; } logger.log(Level.FINER, "SortedSearch 2:\n{0}", resultReport); expectedResult = new LinkedHashSet<>(); expectedResult.add("Spot5-Cyprus-THX-IMAGERY3_ortho1"); expectedResult.add("MDWeb_FR_SY_couche_vecteur_258"); expectedResult.add("CTDF02"); expectedResult.add("42292_9s_19900610041000"); expectedResult.add("42292_5p_19900609195600"); expectedResult.add("40510_145_19930221211500"); expectedResult.add("39727_22_19750113062500"); expectedResult.add("11325_158_19640418141800"); assertEquals(expectedResult, result); /** * Test 3 sorted search: all orderBy Abstract ASC */ resultReport = ""; spatialQuery = new SpatialQuery("metafile:doc", nullFilter, SerialChainFilter.AND); sf = new SortField("Abstract_sort", SortField.Type.STRING, false); spatialQuery.setSort(new Sort(sf)); result = indexSearcher.doSearch(spatialQuery); for (String s: result) { resultReport = resultReport + s + '\n'; } logger.log(Level.FINER, "SortedSearch 3:\n{0}", resultReport); expectedResult = new LinkedHashSet<>(); expectedResult.add("MDWeb_FR_SY_couche_vecteur_258"); expectedResult.add("CTDF02"); expectedResult.add("11325_158_19640418141800"); expectedResult.add("39727_22_19750113062500"); expectedResult.add("40510_145_19930221211500"); expectedResult.add("42292_9s_19900610041000"); expectedResult.add("42292_5p_19900609195600"); expectedResult.add("Spot5-Cyprus-THX-IMAGERY3_ortho1"); assertEquals(expectedResult, result); /** * Test 4 sorted search: all orderBy Abstract DSC */ resultReport = ""; spatialQuery = new SpatialQuery("metafile:doc", nullFilter, SerialChainFilter.AND); sf = new SortField("Abstract_sort", SortField.Type.STRING, true); spatialQuery.setSort(new Sort(sf)); result = indexSearcher.doSearch(spatialQuery); for (String s: result) { resultReport = resultReport + s + '\n'; } logger.log(Level.FINER, "SortedSearch 4:\n{0}", resultReport); expectedResult = new LinkedHashSet<>(); expectedResult.add("Spot5-Cyprus-THX-IMAGERY3_ortho1"); expectedResult.add("42292_5p_19900609195600"); expectedResult.add("42292_9s_19900610041000"); expectedResult.add("40510_145_19930221211500"); expectedResult.add("39727_22_19750113062500"); expectedResult.add("11325_158_19640418141800"); expectedResult.add("CTDF02"); expectedResult.add("MDWeb_FR_SY_couche_vecteur_258"); assertEquals(expectedResult, result); } /** * * Test spatial lucene search. * * @throws java.lang.Exception */ @Test public void spatialSearchTest() throws Exception { String resultReport = ""; /** * Test 1 spatial search: BBOX filter */ double min1[] = {-20, -20}; double max1[] = { 20, 20}; GeneralEnvelope bbox = new GeneralEnvelope(min1, max1); CoordinateReferenceSystem crs = CRS.decode("EPSG:4326", true); bbox.setCoordinateReferenceSystem(crs); LuceneOGCFilter sf = LuceneOGCFilter.wrap(FF.bbox(LuceneOGCFilter.GEOMETRY_PROPERTY, -20, -20, 20, 20, "EPSG:4326")); SpatialQuery spatialQuery = new SpatialQuery("metafile:doc", sf, SerialChainFilter.AND); Set<String> result = indexSearcher.doSearch(spatialQuery); for (String s: result) { resultReport = resultReport + s + '\n'; } logger.log(Level.FINER, "spatialSearch 1:\n{0}", resultReport); Set<String> expectedResult = new LinkedHashSet<>(); expectedResult.add("39727_22_19750113062500"); expectedResult.add("11325_158_19640418141800"); expectedResult.add("CTDF02"); assertEquals(expectedResult, result); /** * Test 1 spatial search: NOT BBOX filter */ resultReport = ""; List<Filter> lf = new ArrayList<>(); //sf = new BBOXFilter(bbox, "urn:x-ogc:def:crs:EPSG:6.11:4326"); sf = LuceneOGCFilter.wrap(FF.bbox(LuceneOGCFilter.GEOMETRY_PROPERTY, -20, -20, 20, 20, "EPSG:4326")); lf.add(sf); int[] op = {SerialChainFilter.NOT}; SerialChainFilter f = new SerialChainFilter(lf, op); spatialQuery = new SpatialQuery("metafile:doc", f, SerialChainFilter.AND); result = indexSearcher.doSearch(spatialQuery); for (String s: result) { resultReport = resultReport + s + '\n'; } logger.log(Level.FINER, "spatialSearch 2:\n{0}", resultReport); expectedResult = new LinkedHashSet<>(); expectedResult.add("42292_5p_19900609195600"); expectedResult.add("42292_9s_19900610041000"); expectedResult.add("40510_145_19930221211500"); expectedResult.add("MDWeb_FR_SY_couche_vecteur_258"); expectedResult.add("Spot5-Cyprus-THX-IMAGERY3_ortho1"); assertEquals(expectedResult, result); } /** * * Test spatial lucene search. * * @throws java.lang.Exception */ @Test public void TermQueryTest() throws Exception { /** * Test 1 */ String identifier = "39727_22_19750113062500"; String result = indexSearcher.identifierQuery(identifier); logger.log(Level.FINER, "identifier query 1:\n{0}", result); String expectedResult = "39727_22_19750113062500"; assertEquals(expectedResult, result); /** * Test 2 */ identifier = "CTDF02"; result = indexSearcher.identifierQuery(identifier); logger.log(Level.FINER, "identifier query 2:\n{0}", result); expectedResult = "CTDF02"; assertEquals(expectedResult, result); } }