From f68f2d2bf6def4be076a91e8d5c1642d06fecb2d Mon Sep 17 00:00:00 2001 From: Eike Cochu <eike@cochu.com> Date: Fri, 29 Jan 2016 15:08:34 +0100 Subject: [PATCH] added search resource to rest project moved esclient to utils, added elasticsearch to utils pom --- ma-impl.sublime-workspace | 45 +--------- vipra-cmd/pom.xml | 7 -- .../de/vipra/cmd/option/ClearCommand.java | 2 +- .../de/vipra/cmd/option/ImportCommand.java | 2 +- .../java/de/vipra/cmd/option/TestCommand.java | 2 +- .../vipra/rest/resource/SearchResource.java | 86 +++++++++++++++++++ vipra-util/pom.xml | 7 ++ .../main/java/de/vipra/util}/ESClient.java | 14 +-- 8 files changed, 107 insertions(+), 58 deletions(-) create mode 100644 vipra-rest/src/main/java/de/vipra/rest/resource/SearchResource.java rename {vipra-cmd/src/main/java/de/vipra/cmd/es => vipra-util/src/main/java/de/vipra/util}/ESClient.java (54%) diff --git a/ma-impl.sublime-workspace b/ma-impl.sublime-workspace index 86496c05..ab22af65 100644 --- a/ma-impl.sublime-workspace +++ b/ma-impl.sublime-workspace @@ -279,14 +279,6 @@ }, "buffers": [ - { - "file": "vipra-ui/app/templates/index.hbs", - "settings": - { - "buffer_size": 1290, - "line_ending": "Unix" - } - } ], "build_system": "", "build_system_choices": @@ -476,6 +468,8 @@ ], "file_history": [ + "/home/eike/repos/master/ma-impl/vipra-ui/app/templates/index.hbs", + "/home/eike/Downloads/files.txt", "/home/eike/repos/master/ma-impl/vipra-ui/app/templates/application.hbs", "/home/eike/repos/master/ma-impl/vipra-ui/app/components/pagination-bar.js", "/home/eike/.cache/.fr-kZOCSD/META-INF/MANIFEST.MF", @@ -492,7 +486,6 @@ "/home/eike/repos/master/ma-impl/vipra-ui/app/controllers/words/index.js", "/home/eike/repos/master/ma-impl/vipra-ui/app/controllers/words.js", "/home/eike/repos/master/ma-impl/vipra-ui/app/adapters/application.js", - "/home/eike/repos/master/ma-impl/vipra-ui/app/templates/index.hbs", "/home/eike/repos/master/ma-impl/vipra-ui/app/styles/app.scss", "/home/eike/repos/master/ma-impl/vipra-ui/app/helpers/is-empty.js", "/home/eike/repos/master/ma-impl/vipra-ui/app/routes/index.js", @@ -602,8 +595,7 @@ "/home/eike/Repositories/fu/ss15/ma/impl/vipra-ui/app/templates/articles/show.hbs", "/home/eike/Repositories/fu/ss15/ma/impl/vipra-ui/app/components/filter-text.js", "/home/eike/Repositories/fu/ss15/ma/impl/vm/webapps/test/index.html", - "/home/eike/Repositories/fu/ss15/ma/impl/vipra-ui/app/controllers/articles/list.js", - "/home/eike/Repositories/fu/ss15/ma/impl/vipra-ui/app/router.js" + "/home/eike/Repositories/fu/ss15/ma/impl/vipra-ui/app/controllers/articles/list.js" ], "find": { @@ -927,39 +919,8 @@ "groups": [ { - "selected": 0, "sheets": [ - { - "buffer": 0, - "file": "vipra-ui/app/templates/index.hbs", - "semi_transient": false, - "settings": - { - "buffer_size": 1290, - "regions": - { - }, - "selection": - [ - [ - 1271, - 1271 - ] - ], - "settings": - { - "syntax": "Packages/Handlebars/grammars/Handlebars.tmLanguage", - "tab_size": 2, - "translate_tabs_to_spaces": true - }, - "translation.x": 0.0, - "translation.y": 0.0, - "zoom_level": 1.0 - }, - "stack_index": 0, - "type": "text" - } ] } ], diff --git a/vipra-cmd/pom.xml b/vipra-cmd/pom.xml index 4fdc5feb..64fc4cdf 100644 --- a/vipra-cmd/pom.xml +++ b/vipra-cmd/pom.xml @@ -31,13 +31,6 @@ <version>1.1.1</version> </dependency> - <!-- ElasticSearch --> - <dependency> - <groupId>org.elasticsearch</groupId> - <artifactId>elasticsearch</artifactId> - <version>2.1.0</version> - </dependency> - <!-- Stanford CoreNLP --> <dependency> <groupId>edu.stanford.nlp</groupId> diff --git a/vipra-cmd/src/main/java/de/vipra/cmd/option/ClearCommand.java b/vipra-cmd/src/main/java/de/vipra/cmd/option/ClearCommand.java index 6625adda..1ee15d55 100644 --- a/vipra-cmd/src/main/java/de/vipra/cmd/option/ClearCommand.java +++ b/vipra-cmd/src/main/java/de/vipra/cmd/option/ClearCommand.java @@ -9,10 +9,10 @@ import org.apache.logging.log4j.Logger; import org.bson.types.ObjectId; import org.elasticsearch.client.Client; -import de.vipra.cmd.es.ESClient; import de.vipra.cmd.model.ProcessedArticle; import de.vipra.util.Config; import de.vipra.util.ConsoleUtils; +import de.vipra.util.ESClient; import de.vipra.util.model.Import; import de.vipra.util.model.TopicFull; import de.vipra.util.model.Word; diff --git a/vipra-cmd/src/main/java/de/vipra/cmd/option/ImportCommand.java b/vipra-cmd/src/main/java/de/vipra/cmd/option/ImportCommand.java index 07594ef8..f6e960bf 100644 --- a/vipra-cmd/src/main/java/de/vipra/cmd/option/ImportCommand.java +++ b/vipra-cmd/src/main/java/de/vipra/cmd/option/ImportCommand.java @@ -18,7 +18,6 @@ import org.json.simple.JSONArray; import org.json.simple.JSONObject; import org.json.simple.parser.JSONParser; -import de.vipra.cmd.es.ESClient; import de.vipra.cmd.file.Filebase; import de.vipra.cmd.file.FilebaseIndex; import de.vipra.cmd.lda.LDAAnalyzer; @@ -28,6 +27,7 @@ import de.vipra.cmd.text.Processor; import de.vipra.util.Config; import de.vipra.util.Constants; import de.vipra.util.ConvertStream; +import de.vipra.util.ESClient; import de.vipra.util.ElasticSerializer; import de.vipra.util.MongoUtils; import de.vipra.util.StringUtils; diff --git a/vipra-cmd/src/main/java/de/vipra/cmd/option/TestCommand.java b/vipra-cmd/src/main/java/de/vipra/cmd/option/TestCommand.java index 9441138e..164c8a5d 100644 --- a/vipra-cmd/src/main/java/de/vipra/cmd/option/TestCommand.java +++ b/vipra-cmd/src/main/java/de/vipra/cmd/option/TestCommand.java @@ -6,8 +6,8 @@ import org.bson.types.ObjectId; import org.elasticsearch.client.transport.NoNodeAvailableException; import org.elasticsearch.client.transport.TransportClient; -import de.vipra.cmd.es.ESClient; import de.vipra.util.Config; +import de.vipra.util.ESClient; import de.vipra.util.model.Article; import de.vipra.util.service.DatabaseService; diff --git a/vipra-rest/src/main/java/de/vipra/rest/resource/SearchResource.java b/vipra-rest/src/main/java/de/vipra/rest/resource/SearchResource.java new file mode 100644 index 00000000..3f7c24a6 --- /dev/null +++ b/vipra-rest/src/main/java/de/vipra/rest/resource/SearchResource.java @@ -0,0 +1,86 @@ +package de.vipra.rest.resource; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import javax.servlet.ServletContext; +import javax.ws.rs.GET; +import javax.ws.rs.Path; +import javax.ws.rs.Produces; +import javax.ws.rs.QueryParam; +import javax.ws.rs.core.Context; +import javax.ws.rs.core.Response; +import javax.ws.rs.core.UriInfo; + +import org.elasticsearch.action.search.SearchResponse; +import org.elasticsearch.action.search.SearchType; +import org.elasticsearch.client.transport.TransportClient; +import org.elasticsearch.index.query.QueryBuilders; +import org.elasticsearch.search.SearchHit; +import org.elasticsearch.search.SearchHits; + +import de.vipra.rest.APIMediaType; +import de.vipra.rest.model.APIError; +import de.vipra.rest.model.Wrapper; +import de.vipra.util.Config; +import de.vipra.util.ESClient; +import de.vipra.util.MongoUtils; +import de.vipra.util.StringUtils; +import de.vipra.util.ex.ConfigException; +import de.vipra.util.model.ArticleFull; + +@Path("search") +public class SearchResource { + + @Context + UriInfo uri; + + final TransportClient client; + + public SearchResource(@Context ServletContext servletContext) throws IOException, ConfigException { + Config config = Config.getConfig(); + client = ESClient.getClient(config); + } + + @GET + @Produces(APIMediaType.APPLICATION_JSONAPI) + public Response search(@QueryParam("query") String query, @QueryParam("skip") Integer skip, + @QueryParam("limit") Integer limit, @QueryParam("excerpt") Integer excerpt) { + Wrapper<List<ArticleFull>> res = new Wrapper<>(); + + if (skip == null || skip < 0) + skip = 0; + + if (limit == null || limit < 0) + limit = 20; + + SearchResponse response = null; + try { + response = client.prepareSearch("articles").setSearchType(SearchType.QUERY_AND_FETCH) + .setQuery(QueryBuilders.multiMatchQuery(query, "_all")).setFrom(skip).setSize(limit).execute() + .actionGet(); + } catch (Exception e) { + res.addError(new APIError(Response.Status.BAD_REQUEST, "Error", e.getMessage())); + return res.badRequest(); + } + + SearchHits hits = response.getHits(); + List<ArticleFull> articles = new ArrayList<>(10); + for (SearchHit hit : hits) { + Map<String, Object> source = hit.getSource(); + ArticleFull article = new ArticleFull(); + article.setId(MongoUtils.objectId(hit.getId())); + article.setTitle(source.get("title").toString()); + if (excerpt != null && excerpt > 0) + article.setText(StringUtils.ellipsize(source.get("text").toString(), excerpt)); + articles.add(article); + } + + res.addMeta("total", articles.size()); + + return res.ok(articles); + } + +} diff --git a/vipra-util/pom.xml b/vipra-util/pom.xml index d7682c64..5084145a 100644 --- a/vipra-util/pom.xml +++ b/vipra-util/pom.xml @@ -50,5 +50,12 @@ <artifactId>jackson-annotations</artifactId> <version>2.7.0</version> </dependency> + + <!-- ElasticSearch --> + <dependency> + <groupId>org.elasticsearch</groupId> + <artifactId>elasticsearch</artifactId> + <version>2.1.0</version> + </dependency> </dependencies> </project> \ No newline at end of file diff --git a/vipra-cmd/src/main/java/de/vipra/cmd/es/ESClient.java b/vipra-util/src/main/java/de/vipra/util/ESClient.java similarity index 54% rename from vipra-cmd/src/main/java/de/vipra/cmd/es/ESClient.java rename to vipra-util/src/main/java/de/vipra/util/ESClient.java index a48a17c9..efae45af 100644 --- a/vipra-cmd/src/main/java/de/vipra/cmd/es/ESClient.java +++ b/vipra-util/src/main/java/de/vipra/util/ESClient.java @@ -1,4 +1,4 @@ -package de.vipra.cmd.es; +package de.vipra.util; import java.net.InetAddress; import java.net.UnknownHostException; @@ -6,14 +6,16 @@ import java.net.UnknownHostException; import org.elasticsearch.client.transport.TransportClient; import org.elasticsearch.common.transport.InetSocketTransportAddress; -import de.vipra.util.Config; -import de.vipra.util.Constants; - public abstract class ESClient { + private static TransportClient client; + public static TransportClient getClient(Config config) throws UnknownHostException { - return TransportClient.builder().build().addTransportAddress( - new InetSocketTransportAddress(InetAddress.getByName(Constants.ES_HOST), Constants.ES_PORT)); + if (client == null) { + client = TransportClient.builder().build().addTransportAddress( + new InetSocketTransportAddress(InetAddress.getByName(Constants.ES_HOST), Constants.ES_PORT)); + } + return client; } } -- GitLab