From 975bc95ddf25216ea90f1565ef44e7073ed8dc3e Mon Sep 17 00:00:00 2001 From: Michael Peter Christen Date: Fri, 14 Sep 2012 12:09:20 +0200 Subject: [PATCH] added default facet fields for json response format (stub) --- htroot/gsa/searchresult.java | 2 +- htroot/solr/select.java | 11 ++++++--- source/de/anomic/server/serverObjects.java | 8 ++++++- .../solr/EnhancedXMLResponseWriter.java | 11 +++++---- .../federated/solr/JsonResponseWriter.java | 23 +++++++++++++++---- .../solr/OpensearchResponseWriter.java | 11 +++++---- 6 files changed, 48 insertions(+), 18 deletions(-) diff --git a/htroot/gsa/searchresult.java b/htroot/gsa/searchresult.java index 23f5feded6..67474770f0 100644 --- a/htroot/gsa/searchresult.java +++ b/htroot/gsa/searchresult.java @@ -149,7 +149,7 @@ public static serverObjects respond(final RequestHeader header, final serverObje if (connector == null) return null; // do the solr request - SolrQueryRequest req = connector.request(post.toSolrParams()); + SolrQueryRequest req = connector.request(post.toSolrParams(null)); SolrQueryResponse response = null; Exception e = null; try {response = connector.query(req);} catch (SolrException ee) {e = ee;} diff --git a/htroot/solr/select.java b/htroot/solr/select.java index f413fbd388..0a22aa44bc 100644 --- a/htroot/solr/select.java +++ b/htroot/solr/select.java @@ -38,11 +38,13 @@ import net.yacy.kelondro.logging.Log; import net.yacy.search.Switchboard; import net.yacy.search.SwitchboardConstants; +import net.yacy.search.index.YaCySchema; import net.yacy.search.query.AccessTracker; import net.yacy.search.query.SnippetProcess; import org.apache.solr.common.SolrException; import org.apache.solr.common.params.CommonParams; +import org.apache.solr.common.params.SolrParams; import org.apache.solr.common.util.FastWriter; import org.apache.solr.common.util.NamedList; import org.apache.solr.core.SolrCore; @@ -154,7 +156,9 @@ public static serverObjects respond(final RequestHeader header, final serverObje "") : env.getConfig(SwitchboardConstants.GREETING, ""); ((OpensearchResponseWriter) responseWriter).setTitle(promoteSearchPageGreeting); } - if (responseWriter instanceof OpensearchResponseWriter) { + + // if this is a call to YaCys special search formats, enhance the query with field assignments + if (responseWriter instanceof JsonResponseWriter || responseWriter instanceof OpensearchResponseWriter) { // add options for snippet generation post.put("hl", "true"); post.put("hl.fl", "text_t,h1,h2"); @@ -167,8 +171,9 @@ public static serverObjects respond(final RequestHeader header, final serverObje EmbeddedSolrConnector connector = (EmbeddedSolrConnector) sb.index.fulltext().getLocalSolr(); if (connector == null) return null; - // do the solr request - SolrQueryRequest req = connector.request(post.toSolrParams()); + // do the solr request, generate facets if we use a special YaCy format + SolrParams params = post.toSolrParams(responseWriter instanceof JsonResponseWriter ? new YaCySchema[]{YaCySchema.host_s, YaCySchema.url_file_ext_s, YaCySchema.url_protocol_s} : null); + SolrQueryRequest req = connector.request(params); SolrQueryResponse response = null; Exception e = null; try {response = connector.query(req);} catch (SolrException ee) {e = ee;} diff --git a/source/de/anomic/server/serverObjects.java b/source/de/anomic/server/serverObjects.java index 3033e11558..bb49715b17 100644 --- a/source/de/anomic/server/serverObjects.java +++ b/source/de/anomic/server/serverObjects.java @@ -470,7 +470,7 @@ public String toString() { return param.toString(); } - public SolrParams toSolrParams() { + public SolrParams toSolrParams(YaCySchema[] facets) { // check if all required post fields are there if (!this.containsKey(CommonParams.DF)) this.put(CommonParams.DF, YaCySchema.text_t.name()); // set default field to all fields if (!this.containsKey(CommonParams.START)) this.put(CommonParams.START, "0"); // set default start item @@ -480,6 +480,12 @@ public SolrParams toSolrParams() { for (Map.Entry e: this.entrySet()) { m.put(e.getKey(), new String[]{e.getValue()}); } + if (facets != null && facets.length > 0) { + m.put("facet", new String[]{"true"}); + String[] fs = new String[facets.length]; + for (int i = 0; i < facets.length; i++) fs[i] = facets[i].name(); + m.put("facet.field", fs); + } final SolrParams solrParams = new MultiMapSolrParams(m); return solrParams; } diff --git a/source/net/yacy/cora/services/federated/solr/EnhancedXMLResponseWriter.java b/source/net/yacy/cora/services/federated/solr/EnhancedXMLResponseWriter.java index 62a53d971d..f69091f6c3 100644 --- a/source/net/yacy/cora/services/federated/solr/EnhancedXMLResponseWriter.java +++ b/source/net/yacy/cora/services/federated/solr/EnhancedXMLResponseWriter.java @@ -67,15 +67,16 @@ public void init(@SuppressWarnings("rawtypes") NamedList n) { @Override public void write(final Writer writer, final SolrQueryRequest request, final SolrQueryResponse rsp) throws IOException { writer.write(XML_START); - - assert rsp.getValues().get("responseHeader") != null; - assert rsp.getValues().get("response") != null; + NamedList values = rsp.getValues(); + + assert values.get("responseHeader") != null; + assert values.get("response") != null; @SuppressWarnings("unchecked") SimpleOrderedMap responseHeader = (SimpleOrderedMap) rsp.getResponseHeader(); - DocSlice response = (DocSlice) rsp.getValues().get("response"); + DocSlice response = (DocSlice) values.get("response"); @SuppressWarnings("unchecked") - SimpleOrderedMap highlighting = (SimpleOrderedMap) rsp.getValues().get("highlighting"); + SimpleOrderedMap highlighting = (SimpleOrderedMap) values.get("highlighting"); writeProps(writer, "responseHeader", responseHeader); // this.writeVal("responseHeader", responseHeader); writeDocs(writer, request, response); // this.writeVal("response", response); writeProps(writer, "highlighting", highlighting); diff --git a/source/net/yacy/cora/services/federated/solr/JsonResponseWriter.java b/source/net/yacy/cora/services/federated/solr/JsonResponseWriter.java index d85953d1f8..e25e157852 100644 --- a/source/net/yacy/cora/services/federated/solr/JsonResponseWriter.java +++ b/source/net/yacy/cora/services/federated/solr/JsonResponseWriter.java @@ -82,14 +82,21 @@ public void init(@SuppressWarnings("rawtypes") NamedList n) { @Override public void write(final Writer writer, final SolrQueryRequest request, final SolrQueryResponse rsp) throws IOException { - assert rsp.getValues().get("responseHeader") != null; - assert rsp.getValues().get("response") != null; + + NamedList values = rsp.getValues(); + + assert values.get("responseHeader") != null; + assert values.get("response") != null; @SuppressWarnings("unchecked") SimpleOrderedMap responseHeader = (SimpleOrderedMap) rsp.getResponseHeader(); - DocSlice response = (DocSlice) rsp.getValues().get("response"); + DocSlice response = (DocSlice) values.get("response"); + @SuppressWarnings("unchecked") + SimpleOrderedMap facetCounts = (SimpleOrderedMap) values.get("facet_counts"); @SuppressWarnings("unchecked") - SimpleOrderedMap highlighting = (SimpleOrderedMap) rsp.getValues().get("highlighting"); + SimpleOrderedMap facetFields = facetCounts == null || facetCounts.size() == 0 ? null : (SimpleOrderedMap) facetCounts.get("facet_fields"); + @SuppressWarnings("unchecked") + SimpleOrderedMap highlighting = (SimpleOrderedMap) values.get("highlighting"); Map> snippets = OpensearchResponseWriter.highlighting(highlighting); // parse response header @@ -202,6 +209,14 @@ public void write(final Writer writer, final SolrQueryRequest request, final Sol } writer.write("]\n".toCharArray()); writer.write(",\n\"navigation\":[\n"); + + @SuppressWarnings("unchecked") + NamedList hosts = facetFields == null ? null : (NamedList) facetFields.get(YaCySchema.host_s.name()); + @SuppressWarnings("unchecked") + NamedList exts = facetFields == null ? null : (NamedList) facetFields.get(YaCySchema.url_file_ext_s.name()); + @SuppressWarnings("unchecked") + NamedList prots = facetFields == null ? null : (NamedList) facetFields.get(YaCySchema.url_protocol_s.name()); + writer.write("{\"facetname\":\"filetypes\",\"displayname\":\"Filetypes\",\"type\":\"String\",\"min\":\"0\",\"max\":\"0\",\"mean\":\"0\",\"elements\":[]},\n".toCharArray()); writer.write("{\"facetname\":\"protocols\",\"displayname\":\"Protocol\",\"type\":\"String\",\"min\":\"0\",\"max\":\"0\",\"mean\":\"0\",\"elements\":[]},\n".toCharArray()); writer.write("{\"facetname\":\"domains\",\"displayname\":\"Domains\",\"type\":\"String\",\"min\":\"0\",\"max\":\"0\",\"mean\":\"0\",\"elements\":[]},\n".toCharArray()); diff --git a/source/net/yacy/cora/services/federated/solr/OpensearchResponseWriter.java b/source/net/yacy/cora/services/federated/solr/OpensearchResponseWriter.java index 8658f01d3c..30e2b2f51c 100644 --- a/source/net/yacy/cora/services/federated/solr/OpensearchResponseWriter.java +++ b/source/net/yacy/cora/services/federated/solr/OpensearchResponseWriter.java @@ -94,14 +94,17 @@ public void init(@SuppressWarnings("rawtypes") NamedList n) { @Override public void write(final Writer writer, final SolrQueryRequest request, final SolrQueryResponse rsp) throws IOException { - assert rsp.getValues().get("responseHeader") != null; - assert rsp.getValues().get("response") != null; + + NamedList values = rsp.getValues(); + + assert values.get("responseHeader") != null; + assert values.get("response") != null; @SuppressWarnings("unchecked") SimpleOrderedMap responseHeader = (SimpleOrderedMap) rsp.getResponseHeader(); - DocSlice response = (DocSlice) rsp.getValues().get("response"); + DocSlice response = (DocSlice) values.get("response"); @SuppressWarnings("unchecked") - SimpleOrderedMap highlighting = (SimpleOrderedMap) rsp.getValues().get("highlighting"); + SimpleOrderedMap highlighting = (SimpleOrderedMap) values.get("highlighting"); Map> snippets = highlighting(highlighting); // parse response header