我为Solr(版本6.3)创建了一个插件,它添加了一个权限层,用于使用数据库查询过滤检索到的文档(例如:ID为2的用户没有权限查看ID为1的文档) ;由于定义用户是否具有权限的逻辑需要在Solr中没有索引的字段,我需要检入数据库。
为了实现这一点,我创建了一个使用以下内容在solrconfig.xml中定义的Query Parser(名为DocumentsByUserParser
,扩展了类QParserPlugin
):
<queryParser name="filterDocument" class="mypackage.solr.plugin.DocumentsByUserParser" />
要调用此插件,我只需要将fq
参数与{!filterDocument userId='<user_id>'}
一起设置为其他查询参数。请注意,上面的代码适用于具有edismax类型的搜索组件。
我的问题是:我可以创建一个新的类似插件,如上所述,与建议组件一起使用?因为当我索引文档时,用户可能具有(或没有)查看该文档的权限,因此建议者不应该显示用户无权查看的建议。
我使用以下内容定义了我的建议组件以及请求处理程序:
<requestHandler name="/suggest" class="solr.SearchHandler" startup="lazy">
<lst name="defaults">
<str name="suggest">true</str>
<str name="suggest.count">10</str>
</lst>
<arr name="components">
<str>suggest</str>
</arr>
</requestHandler>
<searchComponent name="suggest" class="solr.SuggestComponent">
<lst name="suggester">
<str name="name">mySuggester</str>
<str name="lookupImpl">AnalyzingInfixLookupFactory</str>
<str name="indexPath">suggester_infix_dir</str>
<str name="highlight">true</str>
<str name="dictionaryImpl">DocumentDictionaryFactory</str>
<str name="field">AUTO_COMPLETE_FIELD</str>
<str name="suggestAnalyzerFieldType">text_general</str>
<str name="buildOnStartup">false</str>
<str name="buildOnCommit">false</str>
</lst>
</searchComponent>
P.S - https://lucene.apache.org/solr/guide/6_6/suggester.html中描述的上下文过滤器查询仅适用于单个索引字段,因此这不适用于我的用例。