【发布时间】:2019-02-22 20:46:12
【问题描述】:
背景: 我们有一个迁移到 docker 的 3 节点 solr 云。它按预期工作,但是,对于插入的新数据,它只能通过 id 检索。一旦我们尝试使用过滤器,它就不会显示。请注意,仍然可以过滤旧数据而不会出现任何问题。
数据库是通过类似spring-boot crud的应用程序使用的。
更多背景:
应用程序和 solr 是由另一个人迁移的,我最近继承了代码库,所以我对实现的细节不太熟悉,仍在挖掘和调试。 节点按原样迁移(数据被复制到 docker mount 中)。
我目前所拥有的:
我检查了所有 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,以便更好地了解具体细节。
假设和 WIP:
迁移它的人告诉我,只复制了数据,没有复制配置。我已经获得了旧的配置文件 (
/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"
}
},
...
【问题讨论】:
-
初步猜测 - 由于您缺少配置,新实例将值添加为字符串字段而不是它们的正确类型。由于您是按日期类型过滤的,因此可能无法与字符串字段类型一起正常工作。一个可能的问题是,您的索引中现在有相同字段的不同类型的数据,因此您可能必须准备好在使配置正常工作后重建索引。
-
@MatsLindh,谢谢。我应该在哪里专门寻找数据类型配置?
-
如果您一直在云模式下运行(看起来好像有三个节点),则配置已存储在 Zookeeper 中。可以使用 zkCli.sh 和 downconfig 下载,然后在新集群上使用 upconfig 命令上传。
-
我已经更新了关于当前状态的问题,我认为我可以排除配置问题,因为我在 zookeeper 中看到了我的配置。然而我更困惑,因为数据似乎是在一段时间后创建的
-
您真的在提交您的数据吗?即您是否在添加数据后发出提交?实时获取端点(即 /get)允许在不发出提交的情况下检索内容,而在发出新的提交和重新打开搜索器之前将无法搜索数据。