summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--build.properties2
-rw-r--r--build.xml2
-rw-r--r--defaults/solr/solrconfig.xml52
-rw-r--r--ivy.xml59
-rw-r--r--source/net/yacy/cora/federate/solr/connector/SolrServerConnector.java3
-rw-r--r--source/net/yacy/cora/federate/solr/embedded/EmbeddedSolrServer.java395
-rw-r--r--source/net/yacy/cora/federate/solr/instance/EmbeddedInstance.java21
-rw-r--r--source/net/yacy/http/servlets/SolrSelectServlet.java2
-rw-r--r--source/net/yacy/http/servlets/SolrServlet.java1
-rw-r--r--source/net/yacy/kelondro/data/meta/URIMetadataNode.java15
-rw-r--r--source/net/yacy/search/index/Fulltext.java15
11 files changed, 483 insertions, 84 deletions
diff --git a/build.properties b/build.properties
index 940075c51..3cfbfa0b4 100644
--- a/build.properties
+++ b/build.properties
@@ -3,7 +3,7 @@ javacSource=11
javacTarget=11
# Release Configuration
-releaseVersion=1.930
+releaseVersion=1.940
releaseFileParentDir=yacy
privateKeyFile=private.key
diff --git a/build.xml b/build.xml
index ca24aa5ee..6eb8382af 100644
--- a/build.xml
+++ b/build.xml
@@ -400,8 +400,8 @@
<!-- make clean -->
<target name="clean" description="make clean">
<delete dir="${release_main}" failonerror="false"/>
- <delete file="${lib}/yacycore.jar" failonerror="false"/>
<delete failonerror="false">
+ <fileset dir="${lib}" includes="**/*.jar" exclude="org.restlet.jar" /> <!-- we cannot find the org.restlet.jar in maven -->
<fileset dir="${src}" includes="**/*.class" />
<fileset dir="${build}" includes="**/*.class" />
<fileset dir="test/" includes="**/*.class" />
diff --git a/defaults/solr/solrconfig.xml b/defaults/solr/solrconfig.xml
index b9d818a49..1dac2a5df 100644
--- a/defaults/solr/solrconfig.xml
+++ b/defaults/solr/solrconfig.xml
@@ -411,48 +411,32 @@
<maxBooleanClauses>1024</maxBooleanClauses>
- <!-- Solr Internal Query Caches
-
- There are two implementations of cache available for Solr,
- LRUCache, based on a synchronized LinkedHashMap, and
- FastLRUCache, based on a ConcurrentHashMap.
-
- FastLRUCache has faster gets and slower puts in single
- threaded operation and thus is generally faster than LRUCache
- when the hit ratio of the cache is high (> 75%), and may be
- faster under other scenarios on multi-cpu systems.
- -->
-
<!-- Filter Cache
Cache used by SolrIndexSearcher for filters (DocSets),
unordered sets of *all* documents that match a query. When a
new searcher is opened, its caches may be prepopulated or
"autowarmed" using data from caches in the old searcher.
- autowarmCount is the number of items to prepopulate. For
- LRUCache, the autowarmed items will be the most recently
- accessed items.
-
+ autowarmCount is the number of items to prepopulate.
Parameters:
- class - the SolrCache implementation LRUCache or
- (LRUCache or FastLRUCache)
+ class - the SolrCache implementation (CaffeineCache)
size - the maximum number of entries in the cache
initialSize - the initial capacity (number of entries) of
the cache. (see java.util.HashMap)
autowarmCount - the number of entries to prepopulate from
and old cache.
-->
- <filterCache class="solr.FastLRUCache"
- size="100"
- initialSize="100"
- autowarmCount="0"/>
+ <filterCache class="solr.CaffeineCache"
+ size="512"
+ initialSize="512"
+ autowarmCount="128"/>
<!-- Query Result Cache
Caches results of searches - ordered lists of document ids
(DocList) based on a query, a sort, and the range of documents requested.
-->
- <queryResultCache class="solr.LRUCache"
+ <queryResultCache class="solr.CaffeineCache"
size="512"
initialSize="512"
autowarmCount="0"/>
@@ -463,18 +447,11 @@
document). Since Lucene internal document ids are transient,
this cache will not be autowarmed.
-->
- <documentCache class="solr.LRUCache"
+ <documentCache class="solr.CaffeineCache"
size="512"
initialSize="512"
autowarmCount="0"/>
- <!-- custom cache currently used by block join
- <cache name="perSegFilter"
- class="solr.search.LRUCache"
- size="10"
- initialSize="0"
- autowarmCount="10"
- regenerator="solr.NoOpRegenerator" /> -->
<!-- Field Value Cache
@@ -482,7 +459,7 @@
by document id. The fieldValueCache is created by default
even if not configured here.
-->
- <fieldValueCache class="solr.FastLRUCache"
+ <fieldValueCache class="solr.CaffeineCache"
size="32"
initialSize="0"
autowarmCount="0"
@@ -497,15 +474,6 @@
be specified as an implementation of solr.CacheRegenerator
if autowarming is desired.
-->
- <!--
- <cache name="myUserCache"
- class="solr.LRUCache"
- size="4096"
- initialSize="1024"
- autowarmCount="1024"
- regenerator="com.mycompany.MyRegenerator"
- />
- -->
<!-- Lazy Field Loading
@@ -1315,7 +1283,7 @@
in Solr's conf/xslt directory. Changes to xslt files are checked for
every xsltCacheLifetimeSeconds.
-->
- <queryResponseWriter name="xslt" class="solr.XSLTResponseWriter">
+ <queryResponseWriter name="xslt" class="solr.scripting.xslt.XSLTResponseWriter">
<int name="xsltCacheLifetimeSeconds">5</int>
</queryResponseWriter>
diff --git a/ivy.xml b/ivy.xml
index bfa4b96ce..db372e7e5 100644
--- a/ivy.xml
+++ b/ivy.xml
@@ -4,6 +4,7 @@
<!-- https://wrongnotes.blogspot.com/2014/02/simplest-explanation-of-ivy.html -->
<conf name="compile" visibility="public"/>
<conf name="test" visibility="public"/>
+
</configurations>
<dependencies defaultconf="compile->default">
<dependency org="commons-fileupload" name="commons-fileupload" rev="1.4" conf="compile->master" />
@@ -12,11 +13,11 @@
</dependency>
<dependency org="com.cybozu.labs" name="langdetect" rev="1.1-20120112" conf="compile->master"/>
<dependency org="com.drewnoakes" name="metadata-extractor" rev="2.18.0" />
- <dependency org="com.fasterxml.jackson.core" name="jackson-databind" rev="2.13.5"/>
+ <dependency org="com.fasterxml.jackson.core" name="jackson-databind" rev="2.17.0"/>
<dependency org="com.github.ben-manes.caffeine" name="caffeine" rev="3.1.8"/>
- <dependency org="com.google.guava" name="guava" rev="32.1.3-jre" conf="compile->master"/>
+ <dependency org="com.google.guava" name="guava" rev="33.2.0-jre" conf="compile->master"/>
<dependency org="com.google.guava" name="failureaccess" rev="1.0.2" />
- <dependency org="com.ibm.icu" name="icu4j" rev="73.2"/>
+ <dependency org="com.ibm.icu" name="icu4j" rev="75.1"/>
<dependency org="com.jcraft" name="jsch" rev="0.1.55" />
<dependency org="com.twelvemonkeys.imageio" name="imageio-core" rev="3.9.4"/>
<dependency org="com.twelvemonkeys.imageio" name="imageio-bmp" rev="3.9.4" />
@@ -28,14 +29,14 @@
<dependency org="io.dropwizard.metrics" name="metrics-jmx" rev="4.1.5" conf="compile->master"/>
<dependency org="io.opentracing" name="opentracing-noop" rev="0.33.0"/>
<dependency org="io.opentracing" name="opentracing-util" rev="0.33.0"/>
- <dependency org="javax.servlet" name="javax.servlet-api" rev="3.1.0"/>
+ <dependency org="javax.servlet" name="javax.servlet-api" rev="4.0.1"/>
<dependency org="javainetlocator" name="inetaddresslocator" rev="2.18" />
<dependency org="jcifs" name="jcifs" rev="1.3.17" conf="compile->master" />
<dependency org="net.arnx" name="jsonic" rev="1.3.10"/>
<dependency org="net.jthink" name="jaudiotagger" rev="2.2.5"/>
<dependency org="net.sourceforge.jchardet" name="jchardet" rev="1.0"/>
<dependency org="org.apache.commons" name="commons-collections4" rev="4.4" />
- <dependency org="org.apache.commons" name="commons-compress" rev="1.24.0" />
+ <dependency org="org.apache.commons" name="commons-compress" rev="1.26.0" />
<dependency org="org.apache.calcite.avatica" name="avatica-core" rev="1.13.0" conf="compile->master"/>
<dependency org="org.apache.calcite" name="calcite-core" rev="1.18.0" conf="compile->master"/>
<dependency org="org.apache.calcite" name="calcite-linq4j" rev="1.18.0" conf="compile->master"/>
@@ -44,27 +45,30 @@
<dependency org="org.apache.httpcomponents" name="httpclient" rev="4.5.12"/>
<dependency org="org.apache.httpcomponents" name="httpmime" rev="4.5.12"/>
<dependency org="org.apache.james" name="apache-mime4j" rev="0.6"/>
- <dependency org="org.apache.lucene" name="lucene-analyzers-phonetic" rev="8.11.2" />
- <dependency org="org.apache.lucene" name="lucene-backward-codecs" rev="8.11.2" />
- <dependency org="org.apache.lucene" name="lucene-classification" rev="8.11.2" />
- <dependency org="org.apache.lucene" name="lucene-codecs" rev="8.11.2" />
- <dependency org="org.apache.lucene" name="lucene-grouping" rev="8.11.2" />
- <dependency org="org.apache.lucene" name="lucene-highlighter" rev="8.11.2" />
- <dependency org="org.apache.lucene" name="lucene-join" rev="8.11.2" />
- <dependency org="org.apache.lucene" name="lucene-memory" rev="8.11.2" />
- <dependency org="org.apache.lucene" name="lucene-misc" rev="8.11.2" />
- <dependency org="org.apache.lucene" name="lucene-queries" rev="8.11.2" />
- <dependency org="org.apache.lucene" name="lucene-queryparser" rev="8.11.2" conf="compile->master"/>
- <dependency org="org.apache.lucene" name="lucene-spatial-extras" rev="8.11.2" conf="compile->master"/>
- <dependency org="org.apache.lucene" name="lucene-suggest" rev="8.11.2"/>
- <dependency org="org.apache.pdfbox" name="pdfbox" rev="3.0.0" />
- <dependency org="org.apache.poi" name="poi" rev="3.17" />
- <dependency org="org.apache.poi" name="poi-scratchpad" rev="3.17" />
- <dependency org="org.apache.solr" name="solr-core" rev="8.11.2" conf="compile->master"/>
- <dependency org="org.apache.solr" name="solr-solrj" rev="8.11.2" conf="compile->master" />
+ <dependency org="org.apache.lucene" name="lucene-analysis-common" rev="9.0.0"/>
+ <dependency org="org.apache.lucene" name="lucene-backward-codecs" rev="9.0.0" />
+ <dependency org="org.apache.lucene" name="lucene-classification" rev="9.0.0" />
+ <dependency org="org.apache.lucene" name="lucene-codecs" rev="9.0.0" />
+ <dependency org="org.apache.lucene" name="lucene-grouping" rev="9.0.0" />
+ <dependency org="org.apache.lucene" name="lucene-highlighter" rev="9.0.0" />
+ <dependency org="org.apache.lucene" name="lucene-join" rev="9.0.0" />
+ <dependency org="org.apache.lucene" name="lucene-memory" rev="9.0.0" />
+ <dependency org="org.apache.lucene" name="lucene-misc" rev="9.0.0" />
+ <dependency org="org.apache.lucene" name="lucene-queries" rev="9.0.0" />
+ <dependency org="org.apache.lucene" name="lucene-queryparser" rev="9.0.0" conf="compile->master"/>
+ <dependency org="org.apache.lucene" name="lucene-spatial-extras" rev="9.0.0" conf="compile->master"/>
+ <dependency org="org.apache.lucene" name="lucene-suggest" rev="9.0.0"/>
+
+ <dependency org="org.apache.pdfbox" name="pdfbox" rev="3.0.2" />
+ <dependency org="org.apache.poi" name="poi" rev="3.17" />
+ <dependency org="org.apache.poi" name="poi-scratchpad" rev="3.17" />
+
+ <dependency org="org.apache.solr" name="solr-core" rev="9.0.0" conf="compile->master"/>
+ <dependency org="org.apache.solr" name="solr-scripting" rev="9.0.0" conf="compile->master"/>
+ <dependency org="org.apache.solr" name="solr-solrj" rev="9.0.0" conf="compile->master" />
<dependency org="org.apache.zookeeper" name="zookeeper" rev="3.6.2" conf="compile->master" />
<dependency org="org.bitlet" name="weupnp" rev="0.1.4" />
- <dependency org="org.bouncycastle" name="bcmail-jdk18on" rev="1.76" />
+ <dependency org="org.bouncycastle" name="bcmail-jdk18on" rev="1.78.1" />
<dependency org="org.codehaus.woodstox" name="woodstox-core-asl" rev="4.4.1">
<exclude module="stax-api" />
</dependency>
@@ -89,9 +93,9 @@
<dependency org="org.locationtech.spatial4j" name="spatial4j" rev="0.8"/>
<!--NOT FOUND dependency org="org.restlet.jee" name="org.restlet" rev="2.2.1" / -->
<dependency org="org.rrd4j" name="rrd4j" rev="3.2"/>
- <dependency org="org.slf4j" name="jcl-over-slf4j" rev="1.7.32"/>
- <dependency org="org.slf4j" name="log4j-over-slf4j" rev="1.7.32"/>
- <dependency org="org.slf4j" name="slf4j-jdk14" rev="1.7.32"/>
+ <dependency org="org.slf4j" name="jcl-over-slf4j" rev="1.7.36"/>
+ <dependency org="org.slf4j" name="log4j-over-slf4j" rev="1.7.36"/>
+ <dependency org="org.slf4j" name="slf4j-jdk14" rev="1.7.36"/>
<!-- This does not match langdetect.jar from pre-ivy -->
<dependency org="org.tukaani" name="xz" rev="1.8"/>
<dependency org="oro" name="oro" rev="2.0.8"/>
@@ -101,5 +105,6 @@
<dependency org="org.hamcrest" name="hamcrest-core" rev="2.2" conf="test->default"/>
<dependency org="org.hamcrest" name="hamcrest-library" rev="2.2" conf="test->default"/>
<dependency org="com.github.luben" name="zstd-jni" rev="1.5.5-6"></dependency>
+ <dependency org="ai.djl" name ="api" rev="0.27.0"></dependency>
</dependencies>
</ivy-module>
diff --git a/source/net/yacy/cora/federate/solr/connector/SolrServerConnector.java b/source/net/yacy/cora/federate/solr/connector/SolrServerConnector.java
index 59f1cb1a0..4a1b7c4fb 100644
--- a/source/net/yacy/cora/federate/solr/connector/SolrServerConnector.java
+++ b/source/net/yacy/cora/federate/solr/connector/SolrServerConnector.java
@@ -28,7 +28,7 @@ import java.util.List;
import org.apache.solr.client.solrj.SolrClient;
import org.apache.solr.client.solrj.SolrServerException;
-import org.apache.solr.client.solrj.embedded.EmbeddedSolrServer;
+//import org.apache.solr.client.solrj.embedded.EmbeddedSolrServer;
import org.apache.solr.client.solrj.impl.XMLResponseParser;
import org.apache.solr.client.solrj.request.ContentStreamUpdateRequest;
import org.apache.solr.client.solrj.request.LukeRequest;
@@ -43,6 +43,7 @@ import org.apache.solr.common.params.CommonParams;
import org.apache.solr.common.params.ModifiableSolrParams;
import org.apache.solr.common.util.NamedList;
+import net.yacy.cora.federate.solr.embedded.EmbeddedSolrServer;
import net.yacy.cora.federate.solr.instance.ServerShard;
import net.yacy.cora.util.ConcurrentLog;
import net.yacy.search.schema.CollectionSchema;
diff --git a/source/net/yacy/cora/federate/solr/embedded/EmbeddedSolrServer.java b/source/net/yacy/cora/federate/solr/embedded/EmbeddedSolrServer.java
new file mode 100644
index 000000000..1606775aa
--- /dev/null
+++ b/source/net/yacy/cora/federate/solr/embedded/EmbeddedSolrServer.java
@@ -0,0 +1,395 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.
+ */
+
+// this class was taken from solr 8 package org.apache.solr.client.solrj.embedded;
+package net.yacy.cora.federate.solr.embedded;
+
+import static org.apache.solr.common.params.CommonParams.PATH;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.ByteBuffer;
+import java.nio.file.Path;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Properties;
+import java.util.Set;
+import java.util.function.Supplier;
+import org.apache.lucene.search.TotalHits.Relation;
+import org.apache.solr.client.solrj.SolrClient;
+import org.apache.solr.client.solrj.SolrRequest;
+import org.apache.solr.client.solrj.SolrServerException;
+import org.apache.solr.client.solrj.StreamingResponseCallback;
+import org.apache.solr.client.solrj.impl.BinaryRequestWriter;
+import org.apache.solr.client.solrj.request.ContentStreamUpdateRequest;
+import org.apache.solr.client.solrj.request.RequestWriter;
+import org.apache.solr.common.SolrDocument;
+import org.apache.solr.common.SolrDocumentList;
+import org.apache.solr.common.SolrException;
+import org.apache.solr.common.params.CommonParams;
+import org.apache.solr.common.params.ModifiableSolrParams;
+import org.apache.solr.common.params.SolrParams;
+import org.apache.solr.common.util.ContentStream;
+import org.apache.solr.common.util.ContentStreamBase;
+import org.apache.solr.common.util.JavaBinCodec;
+import org.apache.solr.common.util.NamedList;
+import org.apache.solr.core.CoreContainer;
+import org.apache.solr.core.NodeConfig;
+import org.apache.solr.core.SolrCore;
+import org.apache.solr.request.SolrQueryRequest;
+import org.apache.solr.request.SolrRequestHandler;
+import org.apache.solr.request.SolrRequestInfo;
+import org.apache.solr.response.BinaryResponseWriter;
+import org.apache.solr.response.ResultContext;
+import org.apache.solr.response.SolrQueryResponse;
+import org.apache.solr.servlet.SolrRequestParsers;
+
+/**
+ * SolrClient that connects directly to a CoreContainer.
+ *
+ * @since solr 1.3
+ */
+@SuppressWarnings("deprecation")
+public class EmbeddedSolrServer extends SolrClient {
+
+ private static final long serialVersionUID = -6657217211811383651L;
+
+ protected final CoreContainer coreContainer;
+ protected final String coreName;
+ private final SolrRequestParsers _parser;
+ private final RequestWriterSupplier supplier;
+ private boolean containerIsLocal = false;
+
+ //ClusterPropertiesListener cpl = new ClusterPropertiesListener();
+
+ public enum RequestWriterSupplier {
+ JavaBin(() -> new BinaryRequestWriter()),
+ XML(() -> new RequestWriter());
+
+ private final Supplier<RequestWriter> supplier;
+
+ RequestWriterSupplier(final Supplier<RequestWriter> supplier) {
+ this.supplier = supplier;
+ }
+
+ public RequestWriter newRequestWriter() {
+ return supplier.get();
+ }
+ }
+
+ /**
+ * Create an EmbeddedSolrServer using a given solr home directory
+ *
+ * @param solrHome the solr home directory
+ * @param defaultCoreName the core to route requests to by default (optional)
+ */
+ public EmbeddedSolrServer(Path solrHome, String defaultCoreName) {
+ this(load(new CoreContainer(solrHome, new Properties())), defaultCoreName);
+ containerIsLocal = true;
+ }
+
+ /**
+ * Create an EmbeddedSolrServer using a NodeConfig
+ *
+ * @param nodeConfig the configuration
+ * @param defaultCoreName the core to route requests to by default (optional)
+ */
+ public EmbeddedSolrServer(NodeConfig nodeConfig, String defaultCoreName) {
+ this(load(new CoreContainer(nodeConfig)), defaultCoreName);
+ containerIsLocal = true;
+ }
+
+ private static CoreContainer load(CoreContainer cc) {
+ cc.load();
+ return cc;
+ }
+
+ /** Create an EmbeddedSolrServer wrapping a particular SolrCore */
+ public EmbeddedSolrServer(SolrCore core) {
+ this(core.getCoreContainer(), core.getName());
+ }
+
+ /**
+ * Create an EmbeddedSolrServer wrapping a CoreContainer.
+ *
+ * @param coreContainer the core container
+ * @param coreName the core to route requests to by default (optional)
+ */
+ public EmbeddedSolrServer(CoreContainer coreContainer, String coreName) {
+ this(coreContainer, coreName, RequestWriterSupplier.JavaBin);
+ }
+
+ /**
+ * Create an EmbeddedSolrServer wrapping a CoreContainer.
+ *
+ * @param coreContainer the core container
+ * @param coreName the core to route requests to by default
+ * @param supplier the supplier used to create a {@link RequestWriter}
+ */
+ public EmbeddedSolrServer(
+ CoreContainer coreContainer, String coreName, RequestWriterSupplier supplier) {
+ if (coreContainer == null) {
+ throw new NullPointerException("CoreContainer instance required");
+ }
+ this.coreContainer = coreContainer;
+ this.coreName = coreName;
+ _parser = new SolrRequestParsers(null);
+ this.supplier = supplier;
+ }
+
+ // TODO-- this implementation sends the response to XML and then parses it.
+ // It *should* be able to convert the response directly into a named list.
+
+ @Override
+ public NamedList<Object> request(SolrRequest<?> request, String coreName)
+ throws SolrServerException, IOException {
+
+ String path = request.getPath();
+ if (path == null || !path.startsWith("/")) {
+ path = "/select";
+ }
+
+ SolrRequestHandler handler = coreContainer.getRequestHandler(path);
+ if (handler != null) {
+ try {
+ SolrQueryRequest req =
+ _parser.buildRequestFrom(null, request.getParams(), getContentStreams(request));
+ req.getContext().put("httpMethod", request.getMethod().name());
+ req.getContext().put(PATH, path);
+ SolrQueryResponse resp = new SolrQueryResponse();
+ handler.handleRequest(req, resp);
+ checkForExceptions(resp);
+ return BinaryResponseWriter.getParsedResponse(req, resp);
+ } catch (IOException | SolrException iox) {
+ throw iox;
+ } catch (Exception ex) {
+ throw new SolrServerException(ex);
+ }
+ }
+
+ if (coreName == null) {
+ coreName = this.coreName;
+ if (coreName == null) {
+ throw new SolrException(
+ SolrException.ErrorCode.BAD_REQUEST,
+ "No core specified on request and no default core has been set.");
+ }
+ }
+
+ // Check for cores action
+ SolrQueryRequest req = null;
+ try (SolrCore core = coreContainer.getCore(coreName)) {
+
+ if (core == null) {
+ throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, "No such core: " + coreName);
+ }
+
+ SolrParams params = request.getParams();
+ if (params == null) {
+ params = new ModifiableSolrParams();
+ }
+
+ // Extract the handler from the path or params
+ handler = core.getRequestHandler(path);
+ if (handler == null) {
+ if ("/select".equals(path) || "/select/".equalsIgnoreCase(path)) {
+ String qt = params.get(CommonParams.QT);
+ handler = core.getRequestHandler(qt);
+ if (handler == null) {
+ throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, "unknown handler: " + qt);
+ }
+ }
+ }
+
+ if (handler == null) {
+ throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, "unknown handler: " + path);
+ }
+ req = _parser.buildRequestFrom(core, params, getContentStreams(request)/*, request.getUserPrincipal()*/);
+
+ req.getContext().put(PATH, path);
+ req.getContext().put("httpMethod", request.getMethod().name());
+ SolrQueryResponse rsp = new SolrQueryResponse();
+ SolrRequestInfo.setRequestInfo(new SolrRequestInfo(req, rsp));
+
+ core.execute(handler, req, rsp);
+ checkForExceptions(rsp);
+
+ // Check if this should stream results
+ if (request.getStreamingResponseCallback() != null) {
+ try {
+ final StreamingResponseCallback callback = request.getStreamingResponseCallback();
+ BinaryResponseWriter.Resolver resolver =
+ new BinaryResponseWriter.Resolver(req, rsp.getReturnFields()) {
+ @Override
+ public void writeResults(ResultContext ctx, JavaBinCodec codec) throws IOException {
+ // write an empty list...
+ SolrDocumentList docs = new SolrDocumentList();
+ docs.setNumFound(ctx.getDocList().matches());
+ docs.setNumFoundExact(ctx.getDocList().hitCountRelation() == Relation.EQUAL_TO);
+ docs.setStart(ctx.getDocList().offset());
+ docs.setMaxScore(ctx.getDocList().maxScore());
+ codec.writeSolrDocumentList(docs);
+
+ // This will transform
+ writeResultsBody(ctx, codec);
+ }
+ };
+
+ try (var out =
+ new ByteArrayOutputStream() {
+ ByteArrayInputStream toInputStream() {
+ return new ByteArrayInputStream(buf, 0, count);
+ }
+ }) {
+ createJavaBinCodec(callback, resolver)
+ .setWritableDocFields(resolver)
+ .marshal(rsp.getValues(), out);
+
+ try (ByteArrayInputStream in = out.toInputStream()) {
+ @SuppressWarnings({"unchecked", "resource"})
+ NamedList<Object> resolved = (NamedList<Object>) new JavaBinCodec(resolver).unmarshal(in);
+ return resolved;
+ }
+ }
+ } catch (Exception ex) {
+ throw new RuntimeException(ex);
+ }
+ }
+
+ // Now write it out
+ NamedList<Object> normalized = BinaryResponseWriter.getParsedResponse(req, rsp);
+ return normalized;
+ } catch (IOException | SolrException iox) {
+ throw iox;
+ } catch (Exception ex) {
+ throw new SolrServerException(ex);
+ } finally {
+ if (req != null) {
+ req.close();
+ SolrRequestInfo.clearRequestInfo();
+ }
+ }
+ }
+
+ public static class BAOS extends ByteArrayOutputStream {
+ public ByteBuffer getByteBuffer() {
+ return ByteBuffer.wrap(super.buf, 0, super.count);
+ }
+
+ /*
+ * A hack to get access to the protected internal buffer and avoid an additional copy
+ */
+ public byte[] getbuf() {
+ return super.buf;
+ }
+ }
+
+private Set<ContentStream> getContentStreams(SolrRequest<?> request) throws IOException {
+ if (request.getMethod() == SolrRequest.METHOD.GET) return null;
+ if (request instanceof ContentStreamUpdateRequest) {
+ final ContentStreamUpdateRequest csur = (ContentStreamUpdateRequest) request;
+ final Collection<ContentStream> cs = csur.getContentStreams();
+ if (cs != null) return new HashSet<>(cs);
+ }
+
+ final RequestWriter.ContentWriter contentWriter = request.getContentWriter(null);
+
+ String cType;
+ final BAOS baos = new BAOS();
+ if (contentWriter != null) {
+ contentWriter.write(baos);
+ cType = contentWriter.getContentType();
+ } else {
+ final RequestWriter rw = supplier.newRequestWriter();
+ cType = rw.getUpdateContentType();
+ rw.write(request, baos);
+ }
+
+ final byte[] buf = baos.toByteArray();
+ if (buf.length > 0) {
+ return Collections.singleton(
+ new ContentStreamBase() {
+
+ @Override
+ public InputStream getStream() throws IOException {
+ return new ByteArrayInputStream(buf);
+ }
+
+ @Override
+ public String getContentType() {
+ return cType;
+ }
+ });
+ }
+
+ return null;
+ }
+
+ private JavaBinCodec createJavaBinCodec(
+ final StreamingResponseCallback callback, final BinaryResponseWriter.Resolver resolver) {
+ return new JavaBinCodec(resolver) {
+
+ @Override
+ public void writeSolrDocument(SolrDocument doc) {
+ callback.streamSolrDocument(doc);
+ // super.writeSolrDocument( doc, fields );
+ }
+
+ @Override
+ public void writeSolrDocumentList(SolrDocumentList docs) throws IOException {
+ if (docs.size() > 0) {
+ SolrDocumentList tmp = new SolrDocumentList();
+ tmp.setMaxScore(docs.getMaxScore());
+ tmp.setNumFound(docs.getNumFound());
+ tmp.setStart(docs.getStart());
+ docs = tmp;
+ }
+ callback.streamDocListInfo(docs.getNumFound(), docs.getStart(), docs.getMaxScore());
+ super.writeSolrDocumentList(docs);
+ }
+ };
+ }
+
+ private static void checkForExceptions(SolrQueryResponse rsp) throws Exception {
+ if (rsp.getException() != null) {
+ if (rsp.getException() instanceof SolrException) {
+ throw rsp.getException();
+ }
+ throw new SolrServerException(rsp.getException());
+ }
+ }
+
+ /** Closes any resources created by this instance */
+ @Override
+ public void close() throws IOException {
+ if (containerIsLocal) {
+ coreContainer.shutdown();
+ }
+ }
+
+ /**
+ * Getter method for the CoreContainer
+ *
+ * @return the core container
+ */
+ public CoreContainer getCoreContainer() {
+ return coreContainer;
+ }
+} \ No newline at end of file
diff --git a/source/net/yacy/cora/federate/solr/instance/EmbeddedInstance.java b/source/net/yacy/cora/federate/solr/instance/EmbeddedInstance.java
index e9b6cd9c3..4ffa81cef 100644
--- a/source/net/yacy/cora/federate/solr/instance/EmbeddedInstance.java
+++ b/source/net/yacy/cora/federate/solr/instance/EmbeddedInstance.java
@@ -23,18 +23,23 @@ package net.yacy.cora.federate.solr.instance;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
+import java.nio.file.Path;
import java.util.Collection;
import java.util.Map;
+import java.util.Properties;
import java.util.concurrent.ConcurrentHashMap;
import org.apache.solr.client.solrj.SolrClient;
-import org.apache.solr.client.solrj.embedded.EmbeddedSolrServer;
+//import org.apache.solr.client.solrj.embedded.EmbeddedSolrServer;
import org.apache.solr.core.CoreContainer;
+import org.apache.solr.core.NodeConfig;
import org.apache.solr.core.SolrCore;
+import org.apache.solr.core.SolrXmlConfig;
import com.google.common.io.Files;
import net.yacy.cora.document.encoding.ASCII;
+import net.yacy.cora.federate.solr.embedded.EmbeddedSolrServer;
import net.yacy.cora.util.ConcurrentLog;
import net.yacy.kelondro.util.MemoryControl;
@@ -80,7 +85,19 @@ public class EmbeddedInstance implements SolrInstance {
// initialize the coreContainer
final File configFile = new File(solr_config, "solr.xml"); // the configuration file for all cores
- this.coreContainer = CoreContainer.createAndLoad(containerPath.toPath(), configFile.toPath()); // this may take indefinitely long if solr files are broken
+ Path solrHome = containerPath.toPath();
+ Path configFilePath = configFile.toPath();
+ //this.coreContainer = CoreContainer.createAndLoad(containerPath.toPath(), configFile.toPath());
+ // this may take indefinitely long if solr files are broken
+ NodeConfig nc = SolrXmlConfig.fromFile(solrHome, configFilePath, new Properties());
+ this.coreContainer = new CoreContainer(nc);
+ try {
+ this.coreContainer.load();
+ } catch (Exception e) {
+ this.coreContainer.shutdown();
+ throw e;
+ }
+
if (this.coreContainer == null) throw new IOException("cannot create core container dir = " + containerPath + ", configFile = " + configFile);
// get the default core from the coreContainer
diff --git a/source/net/yacy/http/servlets/SolrSelectServlet.java b/source/net/yacy/http/servlets/SolrSelectServlet.java
index 325757868..ea5590707 100644
--- a/source/net/yacy/http/servlets/SolrSelectServlet.java
+++ b/source/net/yacy/http/servlets/SolrSelectServlet.java
@@ -79,7 +79,7 @@ import org.apache.solr.response.QueryResponseWriter;
import org.apache.solr.response.RawResponseWriter;
import org.apache.solr.response.ResultContext;
import org.apache.solr.response.SolrQueryResponse;
-import org.apache.solr.response.XSLTResponseWriter;
+import org.apache.solr.scripting.xslt.XSLTResponseWriter;
import org.apache.solr.search.DocList;
import org.apache.solr.servlet.SolrRequestParsers;
import org.apache.solr.servlet.cache.HttpCacheHeaderUtil;
diff --git a/source/net/yacy/http/servlets/SolrServlet.java b/source/net/yacy/http/servlets/SolrServlet.java
index 7795a50e9..7b2c621a3 100644
--- a/source/net/yacy/http/servlets/SolrServlet.java
+++ b/source/net/yacy/http/servlets/SolrServlet.java
@@ -141,6 +141,7 @@ public class SolrServlet extends HttpServlet {
if (solrRsp.getException() != null) {
@SuppressWarnings("rawtypes")
NamedList info = new SimpleOrderedMap();
+ @SuppressWarnings("unchecked")
int code = ResponseUtils.getErrorInfo(solrRsp.getException(), info, null);
solrRsp.add("error", info);
response.setStatus(code);
diff --git a/source/net/yacy/kelondro/data/meta/URIMetadataNode.java b/source/net/yacy/kelondro/data/meta/URIMetadataNode.java
index 2d93ec8b7..7c2bf2d07 100644
--- a/source/net/yacy/kelondro/data/meta/URIMetadataNode.java
+++ b/source/net/yacy/kelondro/data/meta/URIMetadataNode.java
@@ -874,10 +874,17 @@ public class URIMetadataNode extends SolrDocument /* implements Comparable<URIMe
private Date[] getDates(CollectionSchema field) {
assert field.isMultiValued();
assert field.getType() == SolrType.date;
- @SuppressWarnings("unchecked")
- List<Date> x = (List<Date>) this.getFieldValue(field.getSolrFieldName());
- if (x == null) return new Date[0];
- return x.toArray(new Date[x.size()]);
+ Object content = this.getFieldValue(field.getSolrFieldName());
+ if (content == null) return new Date[0];
+ if (content instanceof Date) {
+ return new Date[] {(Date) content};
+ }
+ if (content instanceof List) {
+ @SuppressWarnings("unchecked")
+ List<Date> x = (List<Date>) content;
+ return x.toArray(new Date[x.size()]);
+ }
+ return new Date[0];
}
private String getString(CollectionSchema field) {
diff --git a/source/net/yacy/search/index/Fulltext.java b/source/net/yacy/search/index/Fulltext.java
index cd9680b27..d1d2724d6 100644
--- a/source/net/yacy/search/index/Fulltext.java
+++ b/source/net/yacy/search/index/Fulltext.java
@@ -46,7 +46,6 @@ import java.util.regex.Pattern;
import java.util.zip.Deflater;
import java.util.zip.GZIPOutputStream;
-import org.apache.lucene.util.Version;
import org.apache.solr.common.SolrDocument;
import org.apache.solr.common.SolrDocumentList;
import org.apache.solr.common.SolrException;
@@ -90,10 +89,17 @@ import net.yacy.search.schema.WebgraphSchema;
public final class Fulltext {
- private static final String SOLR_PATH = "solr_8_11_2"; // the number should be identical to the number in the property luceneMatchVersion in solrconfig.xml
+ private static final String SOLR_PATH = "solr_9_0"; // the number should be identical to the number in the property luceneMatchVersion in solrconfig.xml
private static final String SOLR_OLD_PATH[] = new String[]{
"solr_36", "solr_40", "solr_44", "solr_45", "solr_46", "solr_47",
- "solr_4_9", "solr_4_10", "solr_5_2", "solr_5_5", "solr_6_6", "solr_8_8_1"};
+ "solr_4_9", // yacy_v1.80 (solr 4.9.0)
+ "solr_4_10", // yacy_v1.81 (solr 4.10.3), yacy_v1.82 (solr 4.10.3)
+ "solr_5_2", // yacy_v1.90 (solr 5.5.1, sic!)
+ "solr_5_5", // yacy_v1.91 (solr 5.5.2), yacy_v1.92 (solr 5.5.2)
+ "solr_6_6", // yacy_v1.922 (solr 6.6, init fail), yacy_v1.924_20210209_10069 (solr 7.7.3), yacy_v1.926 (solr 8.9.0)
+ "solr_8_8_1", //
+ "solr_8_11_2"
+ };
// class objects
private final File segmentPath;
@@ -156,8 +162,7 @@ public final class Fulltext {
final EmbeddedInstance localCollectionInstance = new EmbeddedInstance(new File(new File(Switchboard.getSwitchboard().appPath, "defaults"), "solr"), solrLocation, CollectionSchema.CORE_NAME, new String[]{CollectionSchema.CORE_NAME, WebgraphSchema.CORE_NAME});
final SolrConfig config = localCollectionInstance.getDefaultCore().getSolrConfig();
- final Version luceneVersion = config.luceneMatchVersion;
- final String lvn = luceneVersion.major + "_" + luceneVersion.minor + "_" + luceneVersion.bugfix;
+ final String lvn = config.luceneMatchVersion.major + "_" + config.luceneMatchVersion.minor + "_" + config.luceneMatchVersion.bugfix;
assert SOLR_PATH.endsWith(lvn) : "luceneVersion = " + lvn + ", solrPath = " + SOLR_PATH + ", check defaults/solr/solrconfig.xml";
ConcurrentLog.info("Fulltext", "using lucene version " + lvn);