简短的问题:我正在寻找一种方法 (java) 来拦截对 Solr 的查询并注入一些由我的业务逻辑提供的额外过滤参数。我应该使用什么结构?
背景:首先,承认一点:我是 Solr 的菜鸟。对我来说,设置一个服务器,定义一个模式,编写一个功能索引管理器,然后实际看到服务器返回正确的结果 - 完全符合预期!- 对自己来说已经是很大的成就了。耶我!
但是,我目前正在从事一个需要多一点的企业项目。粗略地说,solr 实例是通过同一个 requestHandler 被数千个用户查询的,即根据用户的权限级别自动过滤返回的文档。例如,如果用户 A 和超级用户 B 尝试了完全相同的搜索参数(即使是完全相同的 url),则用户 B 将获取用户 A 的所有文件,然后再获取更多。为了实现这一点,文档已经用必要的权限级别信息编入索引。
好吧,考虑到这一点并利用 Solr 为新手开发人员提供的大量文档,我尝试提出一个简单的自定义 requestHandler 来覆盖 handleRequest 函数,以便在 SolrQueryRequest 中注入必要的额外参数。一切都很好——除了我在 QueryResponse 中根本没有看到任何区别,服务器粗鲁地忽略了我的小操作。如果这是最好的方法,在没有太多提示天气的情况下在网上搜索了几天后,最终决定来打扰 StackOverflow 上的好人。
所以,简而言之,我的问题是:
这是正确的方法吗?还有其他选择吗?我已经可以掌握 Solr 的一些概念,但不可否认,其中有很多不足,而且完全有可能遗漏了一些东西。
如果是这样,在修改查询参数后,我应该做些什么来强制更新 QueryResponse?据我所知,这些只是封装了 http 请求,在进行修改后,我无法嗅探到任何查询服务器的内容。
提前致谢,非常抱歉这篇长文!
经过大量阅读 API 和特别多的反复试验后,我设法获得了一个功能解决方案。然而,我仍然无法理解 Solr 的大部分内部结构,因此仍然希望得到一些启发。随意打吧,我还是很清楚我的菜鸟。
解决方案的相关部分是这个函数,它被覆盖的 handleRequestBody 调用:
private void SearchDocumentsTypeII(SolrDocumentList results,
SolrIndexSearcher searcher, String q,
UserPermissions up, int ndocs, SolrQueryRequest req,
Map<String, SchemaField> fields, Set<Integer> alreadyFound)
throws IOException, ParseException {
BooleanQuery bq …Run Code Online (Sandbox Code Playgroud) 刚刚编写了一些有希望的关于模式的基本solr问题.
我的情况:以前有一个多核的solr实例,每个核心包含不同的文档结构.虽然一个核心中的文档中的信息与其他不同核心中的文档相关,但是特定的法律约束迫使我们将这些数据保留在独立的实例中.因此,每次发出对solr实例的请求时,都会查询几个核心并将客户端应用程序"合并"并构建几个单独核心的响应.为了举例说明:假设我们是一个音乐商店,听起来很愚蠢,我们有CD的核心,DVD的核心,磁带的核心等,每个都有自己不同的架构; 然后,当员工检查库存时,所有这些核心都会返回他们对员工计算机中应用程序的响应以进行读取,处理不同的结构,并将结果显示为一个统一列表.
好吧,法律限制已被取消,我们现在正在将这些核心合并在一起,到目前为止,我们依靠dynamicFields来进行架构灵活性.然而,这带来了一大堆新的挑战和一些疑问:
1 - 什么是更好的:拥有数量减少的文档,每个文档都包含大量字段(我们在谈论数百个,偶尔会有数千个,所有索引)或者将信息分散在几个小型文档中?从我在理论上阅读的内容来看,第一种方法是可取的,但我不认为任何一种情况都会考虑这一领域.
2 - 是否可以执行任何类型的关系搜索?我的意思是拥有以下文件:
<doc>
<ID>ALB@1234</ID>
<artist_t>Metallica</artist>
<album_t>Saint Anger</album>
</doc>
<doc>
<ID>PROD@12</ID>
<AlbID>ALB@1234</AlbID>
<format_t>CD</format_t>
<price_m>8.99</price_m>
</doc>
<doc>
<ID>PROD@13</ID>
<AlbID>ALB@1234</AlbID>
<format_t>MP3</format_t>
<price_m>3.99</price_m>
</doc>
Run Code Online (Sandbox Code Playgroud)
然后在搜索Metallica时检索了所有三个文件?请记住,将最后两个文档的信息存储在第一个文件中作为多值文件的方法实际上并不是一种选择,因为据我所知,没有办法检索匹配范围搜索的正确格式.价钱.
3 - 或者,是否可以将某种子文档结构定义为文档的一部分,如在多级文档中?同样,我不是指poly或multiValued字段,因为据我所知它们不适合更复杂和结构化的信息.正在考虑以下方面的事情:
<doc>
<ID>ALB@1234</ID>
<artist_t>Metallica</artist>
<album_t>Saint Anger</album>
<formats>
<format_x><ID>PROD@13</ID><AlbID>ALB@1234</AlbID><format_t>MP3</format_t><price_m>3.99</price_m></format_x>
<format_x><ID>PROD@12</ID><AlbID>ALB@1234</AlbID><format_t>CD</format_t><price_m>8.99</price_m></format_x>
</formats>
</doc>
Run Code Online (Sandbox Code Playgroud)
4 - 考虑因素:当然,这种情况可以通过对2)中描述的模式进行建模并对服务器执行多个查询来解决,但这并不是最理想的解决方案.
期待任何评论或建议.抨击是不太受欢迎,但仍然可以接受,只是轻松我.;)我很抱歉,如果这些问题听起来很愚蠢,但真的需要一些帮助.