我为Solr(版本6.3)创建了一个插件,它添加了一个权限层,用于使用数据库查询过滤检索到的文档(例如:ID为2的用户无权查看ID为1的文档);由于定义用户是否具有权限的逻辑需要在Solr中未编入索引的字段,因此我需要检入数据库 .

为了实现这一点,我创建了一个使用以下内容在solrconfig.xml中定义的Query Parser(名为 DocumentsByUserParser ,扩展了类 QParserPlugin ):

<queryParser name="filterDocument" class="mypackage.solr.plugin.DocumentsByUserParser" />

要调用此插件,我只需要使用 {!filterDocument userId='<user_id>'} 和其他查询参数设置 fq 参数 . 请注意,上面的代码适用于具有edismax类型的搜索组件 .


我的问题是:我可以创建一个新的类似插件,如上所述,适用于 Suggest Component ?因为当我索引文档时,用户可能具有(或没有)查看该文档的权限,因此建议者不应该看到权限 .

我使用以下内容定义了我的Suggest Component以及Request Handler:

<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中描述的上下文过滤器查询仅适用于单个 indexed 字段,因此这不适用于我的用例 .