schema.xml中的T​​rieDateField与列族中的时间戳冲突

时间:2014-07-31 14:30:14

标签: solr datastax-enterprise

我们刚从DataStax Enteprise 3.2.2升级到4.5.1。 我们从3.2.2迁移 - > 3.2.5 - > 4.0.3 - > 4.5.1,每次按照文档中的步骤进行操作,并在每次升级后升级sstables。

服务器正在运行,核心正在接受查询。

现在,尝试摆脱次优设置,我尝试使用新的solrconfig.xml重新加载SolR核心,该失败并出现此错误消息:

  

当前validation_class并且发现SolrType与列匹配:created_at

经过一些研究,我们认为我们已经使用HTTP API创建了一个遗留(thrift)表,但不知何故也将数据映射类型设置为" 2" (仅适用于CQL3表)。如何在不重新创建一切的情况下解决这个问题?

从" 2"更改数据映射类型时到" 1",并通过API发布配置和架构,我得到了这个:

  

org.apache.solr.common.SolrException:org.apache.solr.common.SolrException:   Solr core peantus.oranges有dseTypeMappingVersion = 2,无法加载   使用dseTypeMappingVersion = 1的新Solr配置。

使用dseTypeMappingVersion = 2发布solrconfig.xml的堆栈跟踪如下:

  

ERROR [http-8983-5] 2014-07-31 15:56:39,091 SolrCoreResourceManager.java(第435行)无法创建核心:   peanuts.oranges org.apache.solr.common.SolrException:无法创建   核心:peanuts.oranges           在org.apache.solr.core.CoreContainer.recordAndThrow(CoreContainer.java:957)           在com.datastax.bdp.search.solr.core.CassandraCoreContainer.create(CassandraCoreContainer.java:265)           在com.datastax.bdp.search.solr.core.SolrCoreResourceManager.reloadCore(SolrCoreResourceManager.java:382)           在com.datastax.bdp.search.solr.handler.admin.CassandraCoreAdminHandler.handleReloadAction(CassandraCoreAdminHandler.java:143)           在org.apache.solr.handler.admin.CoreAdminHandler.handleRequestBody(CoreAdminHandler.java:178)           at org.apache.solr.handler.RequestHandlerBase.handleRequest(RequestHandlerBase.java:137)           在org.apache.solr.servlet.SolrDispatchFilter.handleAdminRequest(SolrDispatchFilter.java:669)           在org.apache.solr.servlet.SolrDispatchFilter.doFilter(SolrDispatchFilter.java:248)           在org.apache.solr.servlet.SolrDispatchFilter.doFilter(SolrDispatchFilter.java:197)           在com.datastax.bdp.search.solr.servlet.CassandraDispatchFilter.doFilter(CassandraDispatchFilter.java:99)           在org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)           在org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)           在com.datastax.bdp.cassandra.audit.SolrHttpAuditLogFilter.doFilter(SolrHttpAuditLogFilter.java:218)           在org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)           在org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)           在com.datastax.bdp.search.solr.auth.CassandraAuthorizationFilter.doFilter(CassandraAuthorizationFilter.java:100)   在   org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)           在org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)           在com.datastax.bdp.search.solr.auth.DseAuthenticationFilter.doFilter(DseAuthenticationFilter.java:102)           在org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)           在org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)           在org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)           at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)           在org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)           在org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)           在org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)           在org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)           在org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:861)           在org.apache.coyote.http11.Http11Protocol $ Http11ConnectionHandler.process(Http11Protocol.java:606)           在org.apache.tomcat.util.net.JIoEndpoint $ Worker.run(JIoEndpoint.java:489)           at java.lang.Thread.run(Unknown Source)引起:javax.xml.parsers.ParserConfigurationException:Current   validation_class并发现SolrType与列不匹配:   created_at。           在com.datastax.bdp.search.solr.core.ThriftCassandraSolrSchemaUpdater.addColumnMetaData(ThriftCassandraSolrSchemaUpdater.java:196)           在com.datastax.bdp.search.solr.core.ThriftCassandraSolrSchemaUpdater.update(ThriftCassandraSolrSchemaUpdater.java:72)           在com.datastax.bdp.search.solr.core.CassandraCoreContainer.create(CassandraCoreContainer.java:244)           ... 29更多

下表是使用DSE Search的HTTP API创建的。

cqlsh:peanuts> DESCRIBE TABLE oranges;

CREATE TABLE oranges (
  key text,
  "_docBoost" text,
  category_id int,
  category_name text,
  city text,
  country_code text,
  created_at timestamp,
  ...
  solr_query text,
  text text,
  user_id text,
  week_of_year int,
  year int,
  PRIMARY KEY ((key))
) WITH COMPACT STORAGE AND
  bloom_filter_fp_chance=0.010000 AND
  caching='KEYS_ONLY' AND
  comment='' AND
  dclocal_read_repair_chance=0.000000 AND
  gc_grace_seconds=864000 AND
  index_interval=128 AND
  read_repair_chance=0.100000 AND
  replicate_on_write='true' AND
  populate_io_cache_on_flush='false' AND
  default_time_to_live=0 AND
  speculative_retry='99.0PERCENTILE' AND
  memtable_flush_period_in_ms=0 AND
  compaction={'class': 'SizeTieredCompactionStrategy'} AND
  compression={'sstable_compression': 'SnappyCompressor'};

以下是schema.xml的相关摘录:

   <field name="id" type="string" indexed="true" stored="true" required="true" multiValued="false" />
   <field name="created_at" type="date" indexed="true" stored="true" docValues="true" />
   ...

   <field name="postal_code" type="string" stored="true" indexed="true"/>
   <field name="country_code" type="string" stored="true" indexed="true"/>
   <field name="city" type="string" stored="true" indexed="true"/>
   <field name="latitude"  type="float" indexed="true" stored="true"/>
   <field name="longitude"  type="float" indexed="true" stored="true"/>

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

 </fields>
  ....    
  <types>
    <fieldType name="string" class="solr.StrField" sortMissingLast="true" />
    <fieldType name="int" class="solr.TrieIntField" precisionStep="0" positionIncrementGap="0"/>
    <fieldType name="float" class="solr.TrieFloatField" precisionStep="0" positionIncrementGap="0"/>
    <fieldType name="date" class="solr.TrieDateField" precisionStep="0" positionIncrementGap="0"/>

我目前的假设是,我们需要将当前solrconfig更改为类型1的映射,因为这对应于实际的数据存储设置。但是,如果API不接受POST?

或者,我可以考虑迁移到纯CQL3表,但这需要从头开始完全重新生成数据,对吧?这可以避免吗?

1 个答案:

答案 0 :(得分:1)

问题是版本2的类型映射,它期望TimestampType,而Thrift使用DateType。

您需要通过在Solr配置中添加以下代码段来“强制”降级到类型1:

<dseTypeMappingVersion force="true">1</dseTypeMappingVersion>

然后上传并重新加载核心。