gpt4 book ai didi

java - Apache Solr 过滤不起作用,但可以通过 id 检索

转载 作者:行者123 更新时间:2023-11-30 01:54:56 25 4
gpt4 key购买 nike

背景:我们有一个 3 节点的 solr 云,已迁移到 docker。它按预期工作,但是对于插入的新数据,只能通过 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 文档,以便更好地了解具体细节。

假设和 WIP:

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

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

我们是否遗漏了一些明显的东西? super 令人困惑的是,可以通过 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"
}
},
...

最佳答案

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

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

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

关于java - Apache Solr 过滤不起作用,但可以通过 id 检索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54834893/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com