【问题标题】:Apache Solr filtering not working but possible to retrieve by idApache Solr 过滤不起作用,但可以通过 id 检索
【发布时间】: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)允许在不发出提交的情况下检索内容,而在发出新的提交和重新打开搜索器之前将无法搜索数据。

标签: java solr solrcloud


【解决方案1】:

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

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

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

【讨论】:

  • 嗨,感谢您的回答,但我实际上已将 commitWithin 设置为 true。我已经更新了在调用管理端点以获取我的集合配置时获得的更多配置。谢谢
  • commitWithin 不是设置 - 该设置只是说 当您发出 commitWithin 时应该是软提交。将数据提交到 /update 端点时,您必须在 URL 中包含 commitWithin=&lt;number of milliseconds&gt; 子句。
  • 是的,你是对的,看来这是特定的配置问题。非常感谢:)
【解决方案2】:

听起来您可能在升级时切换到了默认托管架构。在您之前的安装中查找 schema.xml 以及您之前安装的 solrconfig.xml 中的一个部分。更多信息https://lucene.apache.org/solr/guide/6_6/schema-factory-definition-in-solrconfig.html#SchemaFactoryDefinitioninSolrConfig-SolrUsesManagedSchemabyDefault

【讨论】:

  • /configsets 目录中我只有solrconfig.xml 并比较了它们,但除了版本之外,它们是相同的。这个schema.xml 会在哪里?
猜你喜欢
  • 2023-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-27
  • 2021-01-29
  • 2015-03-12
相关资源
最近更新 更多