Solr:一直在寻找一个名为" collection1"

时间:2016-08-21 08:13:31

标签: java solr spring-data solrj spring-data-solr

我已经使用配置创建了一个solr核心,当我尝试启动solr嵌入式服务器时,我收到以下错误。

Caused by: java.io.IOException: Can't find resource 'solrconfig.xml' in 
 classpath or '/home/tharindu/Desktop/solr_tmp/custom/newsportal/collection1/conf'
    at org.apache.solr.core.SolrResourceLoader.openResource(SolrResourceLoader.java:362)
    at org.apache.solr.core.SolrResourceLoader.openConfig(SolrResourceLoader.java:308)
    at org.apache.solr.core.Config.<init>(Config.java:117)
    at org.apache.solr.core.Config.<init>(Config.java:87)
    at org.apache.solr.core.SolrConfig.<init>(SolrConfig.java:167)
    at org.apache.solr.core.SolrConfig.readFromResourceLoader(SolrConfig.java:145)
    ... 9 more

它似乎正在尝试默认找到名为collection1的solr核心。

自定义文件夹包含

-- solr.xml
-- newsportal
   -- conf
      -- schema.xml
      -- solrconfig.xml
   -- core.properties

我使用的是Spring solr模板。 EmbeddedServer配置如下。

    @Bean
    public EmbeddedSolrServerFactoryBean solrServerFactoryBean() {
        EmbeddedSolrServerFactoryBean factory = new EmbeddedSolrServerFactoryBean();
        factory.setSolrHome("/home/tharindu/Desktop/solr_tmp/custom/newsportal");
        return factory;
    }

    @Bean
    public SolrTemplate solrTemplate() throws Exception {
        return new SolrTemplate(solrServerFactoryBean().getObject(), "newsportal");
    }

当我按如下方式更改EmbeddedServer bean时(仅更改核心路径)

@Bean
public EmbeddedSolrServerFactoryBean solrServerFactoryBean() {
    EmbeddedSolrServerFactoryBean factory = new EmbeddedSolrServerFactoryBean();
    factory.setSolrHome("/home/tharindu/Desktop/solr_tmp/custom");
    return factory;
}

我收到以下错误。

Caused by: org.apache.solr.common.SolrException: No such core: 
    at org.apache.solr.client.solrj.embedded.EmbeddedSolrServer.request(EmbeddedSolrServer.java:112)
    at org.apache.solr.client.solrj.request.QueryRequest.process(QueryRequest.java:91)
    at org.apache.solr.client.solrj.SolrServer.query(SolrServer.java:301)
    at org.springframework.data.solr.core.SolrTemplate$11.doInSolr(SolrTemplate.java:417)
    at org.springframework.data.solr.core.SolrTemplate$11.doInSolr(SolrTemplate.java:414)
    at org.springframework.data.solr.core.SolrTemplate.execute(SolrTemplate.java:141)
    ... 59 more

但是当我将核心文件夹重命名为 collection1 并将core.properties中的核心名称更改为name=collection1时,一切正常。

以下是我的schema.xmlsolrconfig.xml

<?xml version="1.0" encoding="UTF-8" ?>
<schema name="newsportal" version="1.5">
    <types>
        <fieldType name="string" class="solr.StrField" sortMissingLast="true" />
        <fieldType name="text_general" class="solr.TextField" omitNorms="true">
            <analyzer>
                <tokenizer class="solr.WhitespaceTokenizerFactory"/>
                <filter class="solr.LowerCaseFilterFactory" />
                <filter class="solr.StopFilterFactory" words="stopwords_en.txt" />
            </analyzer>
        </fieldType>
    </types>
    <fields>
        <field name="id" type="string" indexed="true" stored="true" required="true"/>

        <field name="title" type="text_general" indexed="true" stored="true" required="true" termVectors="true"/>
        <field name="description" type="text_general" indexed="true" stored="true" required="true" termVectors="true"/>

        <field name="keywords" type="text_general" indexed="true" stored="true" multiValued="true" />

        <defaultSearchField>keywords</defaultSearchField>

        <copyField source="title" dest="keywords"/>
        <copyField source="description" dest="keywords"/>

    </fields>

    <uniqueKey>id</uniqueKey>
</schema>

solrconfig.xml

<?xml version="1.0" encoding="UTF-8" ?>
<config>
    <luceneMatchVersion>LUCENE_48</luceneMatchVersion>
    <dataDir>${solr.data.dir:}</dataDir>
    <directoryFactory name="DirectoryFactory" class="${solr.directoryFactory:solr.NRTCachingDirectoryFactory}" />
    <codecFactory class="solr.SchemaCodecFactory" />
    <schemaFactory class="ClassicIndexSchemaFactory" />
    <indexConfig>
        <lockType>${solr.lock.type:native}</lockType>
    </indexConfig>
    <updateHandler class="solr.DirectUpdateHandler2"/>
    <query>
        <maxBooleanClauses>1024</maxBooleanClauses>
        <filterCache class="solr.FastLRUCache" size="512" initialSize="512" autowarmCount="0" />
        <queryResultCache class="solr.LRUCache" size="512" initialSize="512" autowarmCount="0" />
        <documentCache class="solr.LRUCache" size="512" initialSize="512" autowarmCount="0" />
        <enableLazyFieldLoading>true</enableLazyFieldLoading>
        <queryResultWindowSize>20</queryResultWindowSize>
        <queryResultMaxDocsCached>200</queryResultMaxDocsCached>
        <useColdSearcher>false</useColdSearcher>
        <maxWarmingSearchers>2</maxWarmingSearchers>
    </query>
    <requestDispatcher handleSelect="false">
        <requestParsers enableRemoteStreaming="true" multipartUploadLimitInKB="2048000" formdataUploadLimitInKB="2048" />
        <httpCaching never304="true" />
    </requestDispatcher>
    <requestHandler name="/select" class="solr.SearchHandler" default="true">
        <lst name="defaults">
            <str name="sort">title asc</str>
            <str name="echoParams">explicit</str>
            <int name="rows">10</int>
            <str name="q">*:*</str>
            <bool name="facet">false</bool>
        </lst>
    </requestHandler>
    <requestHandler name="/update" class="solr.UpdateRequestHandler"/>
    <requestHandler name="/analysis/field" startup="lazy" class="solr.FieldAnalysisRequestHandler" />
    <requestHandler name="/analysis/document" class="solr.DocumentAnalysisRequestHandler" startup="lazy" />
    <requestHandler name="/admin/" class="solr.admin.AdminHandlers" />
    <requestHandler name="/admin/ping" class="solr.PingRequestHandler">
        <lst name="invariants">
            <str name="q">*:*</str>
        </lst>
        <lst name="defaults">
            <str name="echoParams">all</str>
        </lst>
    </requestHandler>
    <admin>
        <defaultQuery>*:*</defaultQuery>
    </admin>
</config>

core.properties档案

name=newsportal

修改

solr.xml档案

<solr>

  <solrcloud>
    <str name="host">${host:}</str>
    <int name="hostPort">${jetty.port:8983}</int>
    <str name="hostContext">${hostContext:solr}</str>
    <int name="zkClientTimeout">${zkClientTimeout:30000}</int>
    <bool name="genericCoreNodeNames">${genericCoreNodeNames:true}</bool>
  </solrcloud>

  <shardHandlerFactory name="shardHandlerFactory"
    class="HttpShardHandlerFactory">
    <int name="socketTimeout">${socketTimeout:0}</int>
    <int name="connTimeout">${connTimeout:0}</int>
  </shardHandlerFactory>

</solr>

Solr版本:4.10.4

Spring solr数据版:1.5.5.BUILD-SNAPSHOT

感谢您解决此问题的任何帮助。

2 个答案:

答案 0 :(得分:1)

不幸的是,没有干净的方法如何做到这一点因为collection1EmbeddedSolrServerFactory类中被加密(对应Jira ticket)。

但我尝试了这个hacky,它对我有用:

@Bean
public EmbeddedSolrServerFactoryBean solrClient() {
    EmbeddedSolrServerFactoryBean embeddedSolrServerFactoryBean = new EmbeddedSolrServerFactoryBean() {

        @Override
        public EmbeddedSolrServer getObject() {
            return (EmbeddedSolrServer) getSolrClient("<YOUR_CORE_NAME>");
        }
    };

    embeddedSolrServerFactoryBean.setSolrHome("<YOUR_SOLR_HOME");

    return embeddedSolrServerFactoryBean;
}

答案 1 :(得分:0)

查看此网址https://wiki.apache.org/solr/Solr.xml%20(supported%20through%204.x)

  

要启用动态SolrCore管理支持,请放置文件   在solr.home目录中命名为solr.xml。这是一个示例solr.xml   文件:

<solr persistent="true" sharedLib="lib">
 <cores adminPath="/admin/cores">
  <core name="core0" instanceDir="core0" />
  <core name="core1" instanceDir="core1" />
 </cores>
</solr>

因此,使用适当的条目

更改文件solr.xml
 <core name="core0" instanceDir="core0" />

希望这有帮助