/* * Copyright (c) 2011 LinkedIn, Inc * * 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. */ package com.flaptor.indextank; import static com.flaptor.util.TestInfo.TestType.SYSTEM; import java.io.File; import java.io.IOException; import java.util.Random; import com.flaptor.indextank.index.Document; import com.flaptor.indextank.index.IndexEngine; import com.flaptor.indextank.query.ParseException; import com.flaptor.indextank.query.Query; import com.flaptor.indextank.search.DocumentSearcher; import com.flaptor.indextank.search.SearchResult; import com.flaptor.indextank.search.SearchResults; import com.flaptor.util.FileUtil; import com.flaptor.util.TestInfo; import com.google.common.collect.ImmutableMap; import java.util.Arrays; public class ResultsOrderingTest extends IndexTankTestCase { private File tempDir; private IndexEngine indexEngine; @Override protected void setUp() throws Exception { super.setUp(); this.tempDir = FileUtil.createTempDir("indextank","testcase"); this.indexEngine = new IndexEngine(this.tempDir, 11234, 100, false, 5, IndexEngine.SuggestValues.DOCUMENTS, IndexEngine.StorageValues.NO, 0, null, false, "dummyCode", "TEST-environment"); } @Override protected void tearDown() throws Exception { super.tearDown(); } private void index(int id, long t) { String text = "text word" + id; for (int i = 0; i < new Random().nextInt(25); i++) { text += " text"; } Document doc = new Document(ImmutableMap.of("text", text, "timestamp", String.valueOf(t))); this.indexEngine.getIndexer().add(String.valueOf(id), doc, (int)t, ImmutableMap.<Integer, Double>of()); } private void checkResults(String name, DocumentSearcher searcher, Query query, int scoringFunction, String[] expectedIds) throws InterruptedException { //System.out.println("TESTING query: ["+query.toString()+"]"); SearchResults srs = searcher.search(query, 0, 100, scoringFunction); int i = 0; boolean equals = true; String actualStr = ""; for (SearchResult r : srs.getResults()) { equals = equals && (i < expectedIds.length) && (r.getDocId().equals(expectedIds[i])); actualStr += r.getDocId()+" "; i++; } assertTrue(name+": Results out of order: expected "+Arrays.toString(expectedIds)+", actual ["+actualStr.trim().replaceAll(" ",", ")+"]", equals); } @TestInfo(testType=SYSTEM) public void testAgeOrder() throws IOException, ParseException, InterruptedException { long t = System.currentTimeMillis() / 1000; for (int i = 0; i < 100; i++) { index(i, t+i); } Query q = new Query(this.indexEngine.getParser().parseQuery("text"),null,null); SearchResults rs = this.indexEngine.getSearcher().search(q, 0, 100, 0); Iterable<SearchResult> results = rs.getResults(); int n = 99; for (SearchResult r : results) { assertEquals("Age: Results out of order", String.valueOf(n), r.getDocId()); n--; } } @TestInfo(testType=SYSTEM) public void testRelevanceOrder() throws Exception { DocumentSearcher searcher = this.indexEngine.getSearcher(); BoostingIndexer indexer = this.indexEngine.getIndexer(); indexer.addScoreFunction(1, "relevance"); Document doc = new Document(ImmutableMap.of("relevance_test", "Twinkle twinkle you better work")); indexer.add("1", doc, 0, ImmutableMap.<Integer, Double>of()); doc = new Document(ImmutableMap.of("relevance_test", "Twinkle you better work or else I'll hack you")); indexer.add("2", doc, 1, ImmutableMap.<Integer, Double>of()); doc = new Document(ImmutableMap.of("relevance_test", "Twinkle you better work")); indexer.add("3", doc, 2, ImmutableMap.<Integer, Double>of()); Query q = new Query(this.indexEngine.getParser().parseQuery("relevance_test:twinkle"),null,null); checkResults("Relevance", searcher, q, 1, new String[] {"1","3","2"}); } @TestInfo(testType=SYSTEM) public void testCaretQueries() throws InterruptedException, ParseException, Exception { DocumentSearcher searcher = this.indexEngine.getSearcher(); BoostingIndexer indexer = this.indexEngine.getIndexer(); indexer.addScoreFunction(1, "relevance"); Document doc; Query query; doc = new Document(ImmutableMap.of("text", "aaa")); indexer.add("1", doc, 0, ImmutableMap.<Integer, Double>of()); doc = new Document(ImmutableMap.of("text", "aaa bbb")); indexer.add("2", doc, 0, ImmutableMap.<Integer, Double>of()); doc = new Document(ImmutableMap.of("text", "aaa aaa bbb")); indexer.add("3", doc, 0, ImmutableMap.<Integer, Double>of()); doc = new Document(ImmutableMap.of("text", "aaa bbb ccc eee")); indexer.add("4", doc, 0, ImmutableMap.<Integer, Double>of()); doc = new Document(ImmutableMap.of("text", "ccc ddd")); indexer.add("5", doc, 0, ImmutableMap.<Integer, Double>of()); query = new Query(indexEngine.getParser().parseQuery("aaa"),null,null); checkResults("Caret", searcher, query, 1, new String[] {"1","3","2","4"}); query = new Query(indexEngine.getParser().parseQuery("aaa AND bbb"),null,null); checkResults("Caret", searcher, query, 1, new String[] {"2","3","4"}); query = new Query(indexEngine.getParser().parseQuery("aaa OR bbb"),null,null); checkResults("Caret", searcher, query, 1, new String[] {"2","3","1","4"}); query = new Query(indexEngine.getParser().parseQuery("aaa^2 OR bbb"),null,null); checkResults("Caret", searcher, query, 1, new String[] {"3","2","1","4"}); query = new Query(indexEngine.getParser().parseQuery("aaa OR bbb^2"),null,null); checkResults("Caret", searcher, query, 1, new String[] {"2","3","4","1"}); query = new Query(indexEngine.getParser().parseQuery("ccc OR ddd"),null,null); checkResults("Caret", searcher, query, 1, new String[] {"5","4"}); query = new Query(indexEngine.getParser().parseQuery("ccc OR ddd OR eee^2"),null,null); checkResults("Caret", searcher, query, 1, new String[] {"4","5"}); } }