Apache Solr过滤不起作用,但可以通过ID检索

时间:2019-02-22 20:46:12

标签: java solr solrcloud

背景: 我们有一个迁移到docker的3节点Solr云。它可以按预期工作,但是对于插入的新数据,只能通过id进行检索。一旦我们尝试使用过滤器,它就不会显示。请注意,仍然可以过滤旧数据而不会出现任何问题。

该数据库是通过类似spring-boot crud的应用程序使用的。

更多背景:

该应用程序和solr已由其他人迁移,并且我最近继承了代码库,因此我对实现不太熟悉,并且仍在进行挖掘和调试。 节点按原样迁移(数据已复制到Docker挂载中。)

我到目前为止所拥有的:

我已经检查了所有solr节点的日志,并在对应用程序进行调用时看到以下情况:

过滤:

2019-02-22 14:17:07.525 INFO  (qtp15xxxxx-15) [c:content_api s:shard1 r:core_node1 x:content_api_shard1_replica0] o.a.s.c.S.Request
[content_api_shard1_replica0]  
webapp=/solr path=/select 
params=
{q=*:*&start=0&fq=id-lws-ttf:127103&fq=active-boo-ttf:(true)&fq=(publish-date-tda-ttf:[*+TO+2019-02-22T15:17:07Z]+OR+(*:*+NOT+publish-date-tda-ttf:[*+TO+*]))AND+(expiration-date-tda-ttf:[2019-02-22T15:17:07Z+TO+*]+OR+(*:*+NOT+expiration-date-tda-ttf:[*+TO+*]))&sort=create-date-tda-ttf+desc&rows=10&wt=javabin&version=2} 
hits=0 status=0 QTime=37

通过ID获取:

2019-02-22 14:16:56.441 INFO  (qtp15xxxxxx-16) [c:content_api s:shard1 r:core_node1 x:content_api_shard1_replica0] o.a.s.c.S.Request
[content_api_shard1_replica0]  
webapp=/solr path=/get params={ids=https://example.com/app/contents/127103/middle-east&wt=javabin&version=2} 
status=0 QTime=0

免责声明:

我绝对是与Solr合作的初学者,并且正在阅读ATM文档,以便更好地了解螺母和螺栓。

假设和在制品:

  • 迁移它的人告诉我,仅复制了数据,而不复制配置。我已经获取了旧的配置文件(/opt/solr/server/solr/configsets/),并试图与新的配置文件进行比较。但是假设是这些配置是默认设置。

  • 旧版本为6.4.2,新版本为6.6.5(不确定是否可能是问题所在)

我们这里显然缺少什么吗?令人困惑的是,可以通过id检索数据并且可以对旧数据进行过滤

更新

  • 经过一些研究,我不得不说我排除了配置问题,因为当我从管理UI检查配置时,我看到了正确的配置。
  • 此外,另一个奇怪的行为是可以在一段时间后(例如超过5天)查询数据。我看到了这一点,因为我从UI运行查询并按降序创建日期对其进行排序。从那里,我可以看到不只是几天前的测试

相关的提交配置部分:

 <autoCommit> 
   <maxTime>${solr.autoCommit.maxTime:15000}</maxTime> 
   <openSearcher>false</openSearcher> 
 </autoCommit>

 <autoSoftCommit> 
   <maxTime>${solr.autoSoftCommit.maxTime:-1}</maxTime> 
 </autoSoftCommit>

来自管理端点的更多配置输出:

config:{  
   znodeVersion:0,
   luceneMatchVersion:"org.apache.lucene.util.Version:6.0.1",
   updateHandler:{  
      indexWriter:{  
         closeWaitsForMerges:true
      },
      commitWithin:{  
         softCommit:true
      },
      autoCommit:{  
         maxDocs:-1,
         maxTime:15000,
         openSearcher:false
      },
      autoSoftCommit:{  
         maxDocs:-1,
         maxTime:-1
      }
   },
   query:{  
      useFilterForSortedQuery:false,
      queryResultWindowSize:20,
      queryResultMaxDocsCached:200,
      enableLazyFieldLoading:true,
      maxBooleanClauses:1024,
      filterCache:{  
         autowarmCount:"0",
         size:"512",
         initialSize:"512",
         class:"solr.FastLRUCache",
         name:"filterCache"
      },
      queryResultCache:{  
         autowarmCount:"0",
         size:"512",
         initialSize:"512",
         class:"solr.LRUCache",
         name:"queryResultCache"
      },
      documentCache:{  
         autowarmCount:"0",
         size:"512",
         initialSize:"512",
         class:"solr.LRUCache",
         name:"documentCache"
      },
:{  
         size:"10000",
         showItems:"-1",
         initialSize:"10",
         name:"fieldValueCache"
      }
   },
...

2 个答案:

答案 0 :(得分:1)

听起来像您在升级时已切换到默认托管模式的声音。在先前安装中的schema.xml以及先前安装的solrconfig.xml中的一部分中查找。有关更多信息,请访问https://lucene.apache.org/solr/guide/6_6/schema-factory-definition-in-solrconfig.html#SchemaFactoryDefinitioninSolrConfig-SolrUsesManagedSchemabyDefault

答案 1 :(得分:1)

根据您的示例,您仅在查询实时获取端点-即/get时才检索文档。即使尚未将文档提交到索引或已打开新的搜索器,此端点也会通过按ID查询返回文档。

由于常规搜索端点仍会使用旧的索引文件进行搜索,因此必须创建新的搜索器,才能对常规搜索端点看到对索引的任何更改。如果未创建新的搜索器,则仍将返回陈旧的内容。这符合您所看到的行为,即您没有打开任何新的搜索器,并且由于其他原因(可能是由于重新启动/另一个显式提交/合并/优化/等)而使搜索器被回收时,内容变得可见。 / p>

您的示例配置显示禁用了autoSoftCommit,而将常规autoCommit设置为不打开新的搜索器(因此,未显示新内容)。我通常建议禁用此功能,而要依靠在URL中使用commitWithin,因为它可以为不同类型的数据提供更大的可配置性,并且允许您请求至少有x秒钟的时间打开新的搜索器,因为数据已经已添加。 commitWithin的默认行为是在提交发生后将打开一个新的搜索器。