List of usage examples for org.apache.lucene.queries.function FunctionQuery FunctionQuery
public FunctionQuery(ValueSource func)
From source file:com.difference.historybook.index.lucene.LuceneIndex.java
License:Apache License
@Override public SearchResultWrapper search(String collection, String query, int offset, int size, boolean includeDebug) throws IndexException { try {/*from w ww .ja v a 2 s. c om*/ //TODO: make age be a component in the ranking? BooleanQuery.Builder queryBuilder = new BooleanQuery.Builder(); queryBuilder.add(parser.parse(query), Occur.MUST); queryBuilder.add(new TermQuery(new Term(IndexDocumentAdapter.FIELD_COLLECTION, collection)), Occur.FILTER); Query baseQuery = queryBuilder.build(); FunctionQuery boostQuery = new FunctionQuery( new ReciprocalFloatFunction(new DurationValueSource(new Date().getTime() / 1000, new LongFieldSource(IndexDocumentAdapter.FIELD_TIMESTAMP)), RECIP, 1F, 1F)); Query q = new CustomScoreQuery(baseQuery, boostQuery); QueryScorer queryScorer = new QueryScorer(q, IndexDocumentAdapter.FIELD_SEARCH); Fragmenter fragmenter = new SimpleSpanFragmenter(queryScorer); Highlighter highlighter = new Highlighter(queryScorer); highlighter.setTextFragmenter(fragmenter); GroupingSearch gsearch = new GroupingSearch(IndexDocumentAdapter.FIELD_URL_GROUP).setGroupDocsLimit(1) .setAllGroups(true).setIncludeMaxScore(true); TopGroups<?> groups = gsearch.search(searcher, q, offset, size); ArrayList<SearchResult> results = new ArrayList<>(size); for (int i = offset; i < offset + size && i < groups.groups.length; i++) { ScoreDoc scoreDoc = groups.groups[i].scoreDocs[0]; Document luceneDoc = searcher.doc(scoreDoc.doc); IndexDocumentAdapter doc = new IndexDocumentAdapter(luceneDoc); TokenStream tokenStream = TokenSources.getTokenStream(IndexDocumentAdapter.FIELD_SEARCH, reader.getTermVectors(scoreDoc.doc), luceneDoc.get(IndexDocumentAdapter.FIELD_SEARCH), analyzer, highlighter.getMaxDocCharsToAnalyze() - 1); String[] snippets = highlighter.getBestFragments(tokenStream, luceneDoc.get(IndexDocumentAdapter.FIELD_SEARCH), 3); String snippet = Arrays.asList(snippets).stream().collect(Collectors.joining("\n")); snippet = Jsoup.clean(snippet, Whitelist.simpleText()); String debugInfo = null; if (includeDebug) { Explanation explanation = searcher.explain(q, scoreDoc.doc); debugInfo = explanation.toString(); } results.add(new SearchResult(doc.getKey(), doc.getCollection(), doc.getTitle(), doc.getUrl(), doc.getDomain(), doc.getTimestampText(), snippet, debugInfo, scoreDoc.score)); } SearchResultWrapper wrapper = new SearchResultWrapper().setQuery(query).setOffset(offset) .setMaxResultsRequested(size) .setResultCount(groups.totalGroupCount != null ? groups.totalGroupCount : 0) .setResults(results); if (includeDebug) { wrapper.setDebugInfo(q.toString()); } return wrapper; } catch (IOException | ParseException | InvalidTokenOffsetsException e) { LOG.error(e.getLocalizedMessage()); throw new IndexException(e); } }
From source file:com.mwired.grid.commons.commons.solr.custom.NewsDateInfluenceCustomeScoreQParsePlugin.java
@Override public QParser createParser(String query, SolrParams sp, SolrParams sp1, SolrQueryRequest sqr) { return new QParser(query, sp, sp1, sqr) { @Override/*from w w w.j a v a 2 s . com*/ public Query parse() throws SyntaxError { QParser parser = getParser(this.qstr, "lucene", this.req); Query inner = parser.parse(); SchemaField createDate = getReq().getSchema().getField(PostPropAndColMap.CREATE_DATE); SchemaField influence = getReq().getSchema().getField(PostPropAndColMap.INFLUENCE_SCORE); ValueSource influence_source = influence.getType().getValueSource(influence, parser); ValueSource createDate_source = createDate.getType().getValueSource(createDate, parser); return new NewsDateInfluenceCustomQuery(inner, new FunctionQuery(influence_source), new FunctionQuery(createDate_source)); } }; }
From source file:edu.rpi.tw.linkipedia.search.query.WeightedQuery.java
License:Open Source License
public Query parse(String label, String[] contexts) throws ParseException { label = label.toLowerCase().trim();/*from www . ja va2 s .c om*/ for (int i = 0; i < contexts.length; i++) { contexts[i] = contexts[i].toLowerCase().trim(); } Query typeQuery = getTypeQuery(label); label = label.replaceAll("\\(.*\\)", ""); if (debug) System.out.println("new label: " + label); BooleanQuery luceneQuery = new BooleanQuery(); ArrayList<String> dictLabels = dict_exp.getExpandQueryString(label); // ArrayList<String> temp = new ArrayList<String>( Arrays.asList(contexts)); // if(dictLabels != null){ // for(String dictLabel:dictLabels){ // temp.add(dictLabel); // } // } // contexts = temp.toArray(new String[temp.size()]); ArrayList<String> weightedContext = assignContextWeight(label, contexts, contexts.length); //System.out.println(label+" "+weightedContext.toString()); Query labelQuery = getLabelQuery(label); //Query labelQuery = getLabelSpanQuery(label); Query contentQuery = getContentQuery(label, weightedContext); Query relationQuery = getRelationQuery(label, weightedContext); // if(relationQuery!=null) // relationQuery.setBoost(100); if (typeQuery != null) { typeQuery.setBoost(typeBoost); luceneQuery.add(typeQuery, BooleanClause.Occur.SHOULD); } if (labelQuery != null) { // if(relationQuery == null && labelBoost == 1){ // labelQuery.setBoost(10); // } labelQuery.setBoost(labelBoost); luceneQuery.add(labelQuery, BooleanClause.Occur.MUST); } if (contentQuery != null) { contentQuery.setBoost(contentBoost); luceneQuery.add(contentQuery, BooleanClause.Occur.SHOULD); } if (relationQuery != null) { //relationQuery.setBoost(2); relationQuery.setBoost(relationBoost); luceneQuery.add(relationQuery, BooleanClause.Occur.SHOULD); } // System.out.println("parse: labelBoost: "+labelBoost); // System.out.println("parse: contentBoost: "+contentBoost); // System.out.println("parse: relationBoost: "+relationBoost); // System.out.println("parse: typeBoost: "+typeBoost); // System.out.println("parse: defaultBoost: "+defaultBoost); // Query dictQuery = getDictExpandQuery(label, weightedContext); // if(dictQuery != null){ // luceneQuery.add(dictQuery, BooleanClause.Occur.SHOULD); // } FunctionQuery boostQuery = new FunctionQuery(new FloatFieldSource("boost")); boostQuery.setBoost(defaultBoost); finalQuery = new CustomScoreQuery(luceneQuery, boostQuery); return finalQuery; }
From source file:edu.rpi.tw.linkipedia.search.query.WeightedQuery.java
License:Open Source License
public Query getFuzzyQuery(String label, String[] contexts) throws ParseException { label = label.toLowerCase().trim();/* w ww . j a va 2 s .c om*/ for (int i = 0; i < contexts.length; i++) { contexts[i] = contexts[i].toLowerCase().trim(); } Query typeQuery = getTypeQuery(label); label = label.replaceAll("\\(.*\\)", ""); //System.out.println("new label: "+label); BooleanQuery luceneQuery = new BooleanQuery(); ArrayList<String> weightedContext = assignContextWeight(label, contexts, contexts.length); //System.out.println(label+" "+weightedContext.toString()); Term labelTerm = new Term("label", label); FuzzyQuery fuzzyLabelQuery = new FuzzyQuery(labelTerm); //Query labelQuery = getLabelQuery(label); Query contentQuery = getContentQuery(label, weightedContext); Query relationQuery = getRelationQuery(label, weightedContext); // if(relationQuery!=null) // relationQuery.setBoost(100); if (typeQuery != null) { //typeQuery.setBoost(15); luceneQuery.add(typeQuery, BooleanClause.Occur.MUST); } if (fuzzyLabelQuery != null) { // if(relationQuery == null) // labelQuery.setBoost(10); luceneQuery.add(fuzzyLabelQuery, BooleanClause.Occur.MUST); } if (contentQuery != null) { luceneQuery.add(contentQuery, BooleanClause.Occur.SHOULD); } if (relationQuery != null) { //relationQuery.setBoost(2); luceneQuery.add(relationQuery, BooleanClause.Occur.SHOULD); } FunctionQuery boostQuery = new FunctionQuery(new FloatFieldSource("boost")); finalQuery = new CustomScoreQuery(luceneQuery, boostQuery); return finalQuery; }
From source file:edu.rpi.tw.linkipedia.search.query.WeightedQueryFilterBackup.java
License:Open Source License
public Query parse(String label, String[] contexts) throws ParseException { label = label.toLowerCase().trim();/*from w w w .j a va 2 s . c o m*/ for (int i = 0; i < contexts.length; i++) { contexts[i] = contexts[i].toLowerCase().trim(); } CachingWrapperFilter typeFilter = getTypeFilter(label); label = label.replaceAll("\\(.*\\)", ""); //System.out.println("new label: "+label); BooleanQuery luceneQuery = new BooleanQuery(); ArrayList<String> weightedContext = assignContextWeight(label, contexts, contexts.length); //System.out.println(label+" "+weightedContext.toString()); Query labelQuery = getLabelQuery(label); Query contentQuery = getContentQuery(label, weightedContext); Query relationQuery = getRelationQuery(label, weightedContext); // if(relationQuery!=null) // relationQuery.setBoost(100); if (labelQuery != null) { luceneQuery.add(labelQuery, BooleanClause.Occur.MUST); } FunctionQuery boostQuery = new FunctionQuery(new FloatFieldSource("boost")); if (relationQuery == null && labelQuery != null) { labelQuery.setBoost(10); boostQuery.setBoost(5); } if (contentQuery != null && relationQuery != null) { luceneQuery.add(contentQuery, BooleanClause.Occur.SHOULD); } if (relationQuery != null) { //relationQuery.setBoost(2); luceneQuery.add(relationQuery, BooleanClause.Occur.SHOULD); } Query query = new CustomScoreQuery(luceneQuery, boostQuery); if (typeFilter != null) { finalQuery = new FilteredQuery(query, typeFilter); return finalQuery; } return query; }
From source file:edu.rpi.tw.linkipedia.search.query.WeightedQueryFilterBackup.java
License:Open Source License
public Query getFuzzyQuery(String label, String[] contexts) throws ParseException { label = label.toLowerCase().trim();/*from w w w .j a va 2s.co m*/ for (int i = 0; i < contexts.length; i++) { contexts[i] = contexts[i].toLowerCase().trim(); } CachingWrapperFilter typeFilter = getTypeFilter(label); label = label.replaceAll("\\(.*\\)", ""); ArrayList<String> weightedContext = assignContextWeight(label, contexts, contexts.length); Term labelTerm = new Term("label", label); FuzzyQuery fuzzyLabelQuery = new FuzzyQuery(labelTerm); BooleanQuery luceneQuery = new BooleanQuery(); if (fuzzyLabelQuery != null) { luceneQuery.add(fuzzyLabelQuery, BooleanClause.Occur.MUST); } Query contentQuery = getContentQuery(label, weightedContext); Query relationQuery = getRelationQuery(label, weightedContext); FunctionQuery boostQuery = new FunctionQuery(new FloatFieldSource("boost")); if (relationQuery == null && fuzzyLabelQuery != null) { fuzzyLabelQuery.setBoost(5); boostQuery.setBoost(5); } if (contentQuery != null && relationQuery != null) { luceneQuery.add(contentQuery, BooleanClause.Occur.SHOULD); } if (relationQuery != null) { //relationQuery.setBoost(2); luceneQuery.add(relationQuery, BooleanClause.Occur.SHOULD); } Query query = new CustomScoreQuery(luceneQuery, boostQuery); if (typeFilter != null) { finalQuery = new FilteredQuery(query, typeFilter); return finalQuery; } return query; }
From source file:edu.rpi.tw.linkipedia.search.searching.SurfaceFormSearcher.java
License:Open Source License
public ArrayList<Annotation> mysearch(String query) { TopScoreDocCollector collector = TopScoreDocCollector.create(10, false); results = new ArrayList<Annotation>(); try {/*from ww w . j ava 2 s. c o m*/ BooleanQuery luceneQuery = new BooleanQuery(); Term term = new Term("label", query); //TermQuery termQuery = new TermQuery(term); PayloadTermQuery ptq = new PayloadTermQuery(term, payloadFunction); ptq.setBoost(10); Analyzer analyzer = DefaultAnalyzer.getAnalyzer(); QueryParser parser = new QueryParser(Version.LUCENE_47, "analyzedLabel", analyzer); Query parsedQuery = parser.parse(query); //luceneQuery.add(termQuery, BooleanClause.Occur.SHOULD); luceneQuery.add(ptq, BooleanClause.Occur.SHOULD); luceneQuery.add(parsedQuery, BooleanClause.Occur.SHOULD); FunctionQuery boostQuery = new FunctionQuery(new FloatFieldSource("boost")); //boostQuery.setBoost(100); Query finalQuery = new CustomScoreQuery(luceneQuery, boostQuery); System.out.println(finalQuery); searcher.search(finalQuery, collector); } catch (Exception e) { e.printStackTrace(); } ScoreDoc[] hits = collector.topDocs().scoreDocs; int numTotalHits = collector.getTotalHits(); int start = 0; int end = Math.min(numTotalHits, 10); for (int i = start; i < end; i++) { String thisResult = ""; Document doc = null; try { doc = searcher.doc(hits[i].doc); } catch (Exception e) { e.printStackTrace(); } String url = doc.get("url"); thisResult += url;//+" "+hits[i].score; String[] triples = doc.getValues("triple"); // for(String label:labels){ // thisResult += label+"\n"; // } Annotation annotation = new Annotation(query, url, hits[i].score); annotation.setTriples(new ArrayList<String>(Arrays.asList(triples))); results.add(annotation); } return results; }
From source file:org.apache.solr.schema.AbstractSpatialFieldType.java
License:Apache License
private Query getQueryFromSpatialArgs(QParser parser, SchemaField field, SpatialArgs spatialArgs) { T strategy = getStrategy(field.getName()); SolrParams localParams = parser.getLocalParams(); String score = (localParams == null ? null : localParams.get(SCORE_PARAM)); if (score == null || "none".equals(score) || "".equals(score)) { //FYI Solr FieldType doesn't have a getFilter(). We'll always grab // getQuery() but it's possible a strategy has a more efficient getFilter // that could be wrapped -- no way to know. //See SOLR-2883 needScore return strategy.makeQuery(spatialArgs); //ConstantScoreQuery }/*www . j a v a 2 s.co m*/ //We get the valueSource for the score then the filter and combine them. ValueSource valueSource; if ("distance".equals(score)) { double multiplier = 1.0;//TODO support units=kilometers valueSource = strategy.makeDistanceValueSource(spatialArgs.getShape().getCenter(), multiplier); } else if ("recipDistance".equals(score)) { valueSource = strategy.makeRecipDistanceValueSource(spatialArgs.getShape()); } else { throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, "'score' local-param must be one of 'none', 'distance', or 'recipDistance'"); } FunctionQuery functionQuery = new FunctionQuery(valueSource); if (localParams != null && !localParams.getBool(FILTER_PARAM, true)) return functionQuery; Filter filter = strategy.makeFilter(spatialArgs); return new FilteredQuery(functionQuery, filter); }
From source file:org.apache.solr.search.function.TestOrdValues.java
License:Apache License
private void doTestRank(String field, boolean inOrder) throws Exception { IndexReader r = DirectoryReader.open(dir); IndexSearcher s = newSearcher(r);/*from w ww . j av a 2 s . c om*/ ValueSource vs; if (inOrder) { vs = new OrdFieldSource(field); } else { vs = new ReverseOrdFieldSource(field); } Query q = new FunctionQuery(vs); log("test: " + q); QueryUtils.check(random(), q, s); ScoreDoc[] h = s.search(q, 1000).scoreDocs; assertEquals("All docs should be matched!", N_DOCS, h.length); String prevID = inOrder ? "IE" // greater than all ids of docs in this test ("ID0001", etc.) : "IC"; // smaller than all ids of docs in this test ("ID0001", etc.) for (int i = 0; i < h.length; i++) { String resID = s.doc(h[i].doc).get(ID_FIELD); log(i + ". score=" + h[i].score + " - " + resID); log(s.explain(q, h[i].doc)); if (inOrder) { assertTrue("res id " + resID + " should be < prev res id " + prevID, resID.compareTo(prevID) < 0); } else { assertTrue("res id " + resID + " should be > prev res id " + prevID, resID.compareTo(prevID) > 0); } prevID = resID; } r.close(); }
From source file:org.apache.solr.search.function.TestOrdValues.java
License:Apache License
private void doTestExactScore(String field, boolean inOrder) throws Exception { IndexReader r = DirectoryReader.open(dir); IndexSearcher s = newSearcher(r);/*w ww . jav a2 s .c o m*/ ValueSource vs; if (inOrder) { vs = new OrdFieldSource(field); } else { vs = new ReverseOrdFieldSource(field); } Query q = new FunctionQuery(vs); TopDocs td = s.search(q, 1000); assertEquals("All docs should be matched!", N_DOCS, td.totalHits); ScoreDoc sd[] = td.scoreDocs; for (int i = 0; i < sd.length; i++) { float score = sd[i].score; String id = s.getIndexReader().document(sd[i].doc).get(ID_FIELD); log("-------- " + i + ". Explain doc " + id); log(s.explain(q, sd[i].doc)); float expectedScore = N_DOCS - i - 1; assertEquals("score of result " + i + " shuould be " + expectedScore + " != " + score, expectedScore, score, TEST_SCORE_TOLERANCE_DELTA); String expectedId = inOrder ? id2String(N_DOCS - i) // in-order ==> larger values first : id2String(i + 1); // reverse ==> smaller values first assertTrue("id of result " + i + " shuould be " + expectedId + " != " + score, expectedId.equals(id)); } r.close(); }