Repository: camel Updated Branches: refs/heads/master 4df209449 -> 95163ca14
CAMEL-8288 Attach Lucene Documents to the Results(Hits) if header contains RETURN_LUCENE_DOCS=true Project: http://git-wip-us.apache.org/repos/asf/camel/repo Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/466b77d4 Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/466b77d4 Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/466b77d4 Branch: refs/heads/master Commit: 466b77d4a5bc2a69a4cb50ecdd21c98c6aa677b9 Parents: 4df2094 Author: Kranti Parisa <[email protected]> Authored: Tue Jan 27 16:22:27 2015 -0800 Committer: Claus Ibsen <[email protected]> Committed: Fri Feb 6 07:31:04 2015 +0100 ---------------------------------------------------------------------- .../component/lucene/LuceneQueryProducer.java | 5 +- .../camel/component/lucene/LuceneSearcher.java | 7 ++- .../processor/lucene/LuceneQueryProcessor.java | 5 +- .../camel/processor/lucene/support/Hit.java | 10 +++ .../lucene/LuceneIndexAndQueryProducerTest.java | 65 +++++++++++++++++++- 5 files changed, 87 insertions(+), 5 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/camel/blob/466b77d4/components/camel-lucene/src/main/java/org/apache/camel/component/lucene/LuceneQueryProducer.java ---------------------------------------------------------------------- diff --git a/components/camel-lucene/src/main/java/org/apache/camel/component/lucene/LuceneQueryProducer.java b/components/camel-lucene/src/main/java/org/apache/camel/component/lucene/LuceneQueryProducer.java index 55bfd2d..9ca5e53 100644 --- a/components/camel-lucene/src/main/java/org/apache/camel/component/lucene/LuceneQueryProducer.java +++ b/components/camel-lucene/src/main/java/org/apache/camel/component/lucene/LuceneQueryProducer.java @@ -53,9 +53,12 @@ public class LuceneQueryProducer extends DefaultProducer { Hits hits; String phrase = exchange.getIn().getHeader("QUERY", String.class); + String returnLuceneDocs = exchange.getIn().getHeader("RETURN_LUCENE_DOCS", String.class); + boolean isReturnLuceneDocs = (returnLuceneDocs != null && returnLuceneDocs.equalsIgnoreCase("true")) ? true : false; + if (phrase != null) { searcher.open(indexDirectory, analyzer); - hits = searcher.search(phrase, maxNumberOfHits, config.getLuceneVersion()); + hits = searcher.search(phrase, maxNumberOfHits, config.getLuceneVersion(), isReturnLuceneDocs); } else { throw new IllegalArgumentException("SearchPhrase for LucenePhraseQuerySearcher not set. Set the Header value: QUERY"); } http://git-wip-us.apache.org/repos/asf/camel/blob/466b77d4/components/camel-lucene/src/main/java/org/apache/camel/component/lucene/LuceneSearcher.java ---------------------------------------------------------------------- diff --git a/components/camel-lucene/src/main/java/org/apache/camel/component/lucene/LuceneSearcher.java b/components/camel-lucene/src/main/java/org/apache/camel/component/lucene/LuceneSearcher.java index 0d249be..7a0794a 100644 --- a/components/camel-lucene/src/main/java/org/apache/camel/component/lucene/LuceneSearcher.java +++ b/components/camel-lucene/src/main/java/org/apache/camel/component/lucene/LuceneSearcher.java @@ -59,10 +59,10 @@ public class LuceneSearcher { } public Hits search(String searchPhrase, int maxNumberOfHits) throws Exception { - return search(searchPhrase, maxNumberOfHits, Version.LUCENE_4_10_2); + return search(searchPhrase, maxNumberOfHits, Version.LUCENE_4_10_2, false); } - public Hits search(String searchPhrase, int maxNumberOfHits, Version luceneVersion) throws Exception { + public Hits search(String searchPhrase, int maxNumberOfHits, Version luceneVersion, boolean returnLuceneDocs) throws Exception { Hits searchHits = new Hits(); int numberOfHits = doSearch(searchPhrase, maxNumberOfHits, luceneVersion); @@ -71,6 +71,9 @@ public class LuceneSearcher { for (ScoreDoc hit : hits) { Document selectedDocument = indexSearcher.doc(hit.doc); Hit aHit = new Hit(); + if(returnLuceneDocs) { + aHit.setDocument(selectedDocument); + } aHit.setHitLocation(hit.doc); aHit.setScore(hit.score); aHit.setData(selectedDocument.get("contents")); http://git-wip-us.apache.org/repos/asf/camel/blob/466b77d4/components/camel-lucene/src/main/java/org/apache/camel/processor/lucene/LuceneQueryProcessor.java ---------------------------------------------------------------------- diff --git a/components/camel-lucene/src/main/java/org/apache/camel/processor/lucene/LuceneQueryProcessor.java b/components/camel-lucene/src/main/java/org/apache/camel/processor/lucene/LuceneQueryProcessor.java index 3fa1084..59dda56 100644 --- a/components/camel-lucene/src/main/java/org/apache/camel/processor/lucene/LuceneQueryProcessor.java +++ b/components/camel-lucene/src/main/java/org/apache/camel/processor/lucene/LuceneQueryProcessor.java @@ -46,10 +46,13 @@ public class LuceneQueryProcessor implements Processor { Hits hits; String phrase = exchange.getIn().getHeader("QUERY", String.class); + String returnLuceneDocs = exchange.getIn().getHeader("RETURN_LUCENE_DOCS", String.class); + boolean isReturnLuceneDocs = (returnLuceneDocs != null && returnLuceneDocs.equalsIgnoreCase("true")) ? true : false; + if (phrase != null) { searcher = new LuceneSearcher(); searcher.open(indexDirectory, analyzer); - hits = searcher.search(phrase, maxNumberOfHits, luceneVersion); + hits = searcher.search(phrase, maxNumberOfHits, luceneVersion, isReturnLuceneDocs); } else { throw new IllegalArgumentException("SearchPhrase for LuceneQueryProcessor not set. Set the Header value: QUERY"); } http://git-wip-us.apache.org/repos/asf/camel/blob/466b77d4/components/camel-lucene/src/main/java/org/apache/camel/processor/lucene/support/Hit.java ---------------------------------------------------------------------- diff --git a/components/camel-lucene/src/main/java/org/apache/camel/processor/lucene/support/Hit.java b/components/camel-lucene/src/main/java/org/apache/camel/processor/lucene/support/Hit.java index 3b7a277..78a94bd 100644 --- a/components/camel-lucene/src/main/java/org/apache/camel/processor/lucene/support/Hit.java +++ b/components/camel-lucene/src/main/java/org/apache/camel/processor/lucene/support/Hit.java @@ -16,6 +16,7 @@ */ package org.apache.camel.processor.lucene.support; +import org.apache.lucene.document.Document; import java.io.Serializable; public class Hit implements Serializable { @@ -24,6 +25,7 @@ public class Hit implements Serializable { private int hitLocation; private float score; private String data; + private Document document; public int getHitLocation() { return hitLocation; @@ -49,6 +51,14 @@ public class Hit implements Serializable { this.data = value; } + public Document getDocument() { + return document; + } + + public void setDocument(Document document) { + this.document = document; + } + @Override public String toString() { return "Hit[location=" + hitLocation + ", score=" + score + ", data=" + data + "]"; http://git-wip-us.apache.org/repos/asf/camel/blob/466b77d4/components/camel-lucene/src/test/java/org/apache/camel/component/lucene/LuceneIndexAndQueryProducerTest.java ---------------------------------------------------------------------- diff --git a/components/camel-lucene/src/test/java/org/apache/camel/component/lucene/LuceneIndexAndQueryProducerTest.java b/components/camel-lucene/src/test/java/org/apache/camel/component/lucene/LuceneIndexAndQueryProducerTest.java index 665c762..033f628 100644 --- a/components/camel-lucene/src/test/java/org/apache/camel/component/lucene/LuceneIndexAndQueryProducerTest.java +++ b/components/camel-lucene/src/test/java/org/apache/camel/component/lucene/LuceneIndexAndQueryProducerTest.java @@ -18,6 +18,8 @@ package org.apache.camel.component.lucene; import java.io.File; +import java.util.HashMap; +import java.util.Map; import org.apache.camel.Exchange; import org.apache.camel.Message; @@ -193,5 +195,66 @@ public class LuceneIndexAndQueryProducerTest extends CamelTestSupport { mockSearchEndpoint.assertIsSatisfied(); LOG.debug("------------Completed LuceneQueryProducer Wildcard Test---------------"); context.stop(); - } + } + + @Test + public void testReturnLuceneDocsQueryProducer() throws Exception { + MockEndpoint mockSearchEndpoint = getMockEndpoint("mock:searchResult"); + context.stop(); + context.addRoutes(new RouteBuilder() { + public void configure() { + + from("direct:start"). + setHeader("QUERY", constant("Grouc?? Marx")). + setHeader("RETURN_LUCENE_DOCS", constant("true")). + to("lucene:searchIndex:query?analyzer=#stdAnalyzer&indexDir=#std&maxHits=20"). + to("direct:next"); + + from("direct:next").process(new Processor() { + public void process(Exchange exchange) throws Exception { + Hits hits = exchange.getIn().getBody(Hits.class); + try { + printResults(hits); + } catch (Exception e){ + LOG.error(e.getMessage()); + exchange.getOut().setBody(null); + } + + } + + private void printResults(Hits hits) throws Exception { + LOG.debug("Number of hits: " + hits.getNumberOfHits()); + for (int i = 0; i < hits.getNumberOfHits(); i++) { + LOG.debug("Hit " + i + " Index Location:" + hits.getHit().get(i).getHitLocation()); + LOG.debug("Hit " + i + " Score:" + hits.getHit().get(i).getScore()); + LOG.debug("Hit " + i + " Data:" + hits.getHit().get(i).getData()); + if (hits.getHit().get(i).getDocument() == null) { + throw new Exception("Failed to return lucene documents"); + } + } + } + }).to("mock:searchResult").process(new Processor() { + @Override + public void process(Exchange exchange) throws Exception { + Hits hits = exchange.getIn().getBody(Hits.class); + if(hits == null) { + HashMap<String, String> map = new HashMap<String, String>(); + map.put("NO_LUCENE_DOCS_ERROR", "NO LUCENE DOCS FOUND"); + exchange.getContext().setProperties(map); + } + LOG.debug("Number of hits: " + hits.getNumberOfHits()); + } + }); + } + }); + context.start(); + LOG.debug("------------Beginning LuceneQueryProducer Wildcard with Return Lucene Docs Test---------------"); + + sendQuery(); + mockSearchEndpoint.assertIsSatisfied(); + Map<String, String> errorMap = mockSearchEndpoint.getCamelContext().getProperties(); + LOG.debug("------------Completed LuceneQueryProducer Wildcard with Return Lucene Docs Test---------------"); + context.stop(); + assertTrue(errorMap.get("NO_LUCENE_DOCS_ERROR") == null); + } }
