Apache Solr:按位操作来筛选搜索结果 [英] Apache Solr: bitwise operations to filter search results

查看:306
本文介绍了Apache Solr:按位操作来筛选搜索结果的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我需要在我们的cms(drupal 7 +基于位掩码的自定义访问控制机制)中过滤solr搜索结果对应的访问权限。



存在一个Solr QParserPlugin基于对整数字段的按位操作的搜索结果过滤插件: https://issues.apache。我使用Solr 3.6.1(+ / var / lib / tomcat6 / solr / ...中的插件) lib / bitwise_filter_plugin.jar)在tomcat6(在debian系统上)与模式由drupal模块search_api_solr提供的.xml 和模块问题队列中找到的solrconfig.xml(如SOLR-1913问题所述扩展)。



Solr查询...

  http:// solr:8080 / solr / select?qf = t_title& fl = *, score& fq = {!bitwise field = is_bitmask op = AND source = 1234} * 

...失败,并在错误日志中显示以下消息:

  2012年9月27日上午8:57:41 org.apache.solr.core.SolrCore执行
INFO:[] webapp = / solr path = / select params = {qf = t_title& fl = *,score& fq = {!bitwise + field%3Dis_bitmask + op%3DAND + source%3D1234}} status = 500 QTime = 15
2012年9月27日8: 57:41 org.apache.solr.common.SolrException log
SEVERE:java.lang.NullPointerException
在org.apache.lucene.search.FilteredQuery.hashCode(FilteredQuery.java:268)
在java.util.AbstractList.hashCode(AbstractList.java:542)
在org.apache.solr.search.QueryResultKey。< init>(QueryResultKey.java:49)
在org。 apache.solr.search.SolrIndexSearcher.getDocListC(SolrIndexSearcher.java:1084)
在org.apache.solr.search.SolrIndexSearcher.search(SolrIndexSearcher.java:375)
在org.apache.solr。 handler.component.QueryComponent.process(QueryComponent.java:394)
在org.apache.solr.handler.component.Search Handler.handleRequestBody(SearchHandler.java:186)
在org.apache.solr.handler.RequestHandlerBase.handleRequest(RequestHandlerBase.java:129)
在org.apache.solr.core.SolrCore.execute( SolrCore.java:1376)
在org.apache.solr.servlet.SolrDispatchFilter.execute(SolrDispatchFilter.java:365)
在org.apache.solr.servlet.SolrDispatchFilter.doFilter(SolrDispatchFilter.java: 260)
在org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
在org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
在org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
在org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
在org .apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
在org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
在org.apache.catalina .cor e.StandardEngineValve.invoke(StandardEngineValve.java:109)
在org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
在org.apache.coyote.http11.Http11Processor。进程(Http11Processor.java:859)
在org.apache.coyote.http11.Http11Protocol $ Http11ConnectionHandler.process(Http11Protocol.java:602)
在org.apache.tomcat.util.net.JIoEndpoint $ Worker.run(JIoEndpoint.java:489)
在java.lang.Thread.run(Thread.java:636)

我可以在错误消息中看到的唯一的事情是插件由solr调用。



任何帮助都不会感谢,谢谢。

解决方案

而不是让Solr做到这一点,你可能想尝试Solr的方式。 Solr已经实现了布尔逻辑。



将你的位域拆分成一组命名的布尔域。如果你缺少灵感,他们甚至可以是bit_0,bit_1等。您可以使用动态字段来保存输入并允许稍后的扩展。



将它们作为每个文档的bit_0指定为true等。



使用过滤器查询中的这些字段进行选择:bit_0:true AND bit_24:true。



这可能运行得更快,更快比每个领域的比较比较。按位比较可能需要对每个查询进行全表扫描。那么,完整的字段值扫描,因为Solr没有表。


I need to filter solr search results corresponding the access rights in our cms (drupal 7 + custom access control mechanism based on bitmasks).

There exists a Solr QParserPlugin plugin for search results filtering based on bitwise operations on integer fields: https://issues.apache.org/jira/browse/SOLR-1913.

I am using Solr 3.6.1 (+ the plugin in /var/lib/tomcat6/solr/lib/bitwise_filter_plugin.jar) on tomcat6 (on debian system) with the schema.xml provided by the drupal module search_api_solr and the solrconfig.xml found in the modules issue queue (extended as indicated in the SOLR-1913 issue).

The Solr query ...

http://solr:8080/solr/select?qf=t_title&fl=*,score&fq={!bitwise field=is_bitmask op=AND source=1234}*

... fails with the following message in the error log:

Sep 27, 2012 8:57:41 AM org.apache.solr.core.SolrCore execute
INFO: [] webapp=/solr path=/select params={qf=t_title&fl=*,score&fq={!bitwise+field%3Dis_bitmask+op%3DAND+source%3D1234}} status=500 QTime=15 
Sep 27, 2012 8:57:41 AM org.apache.solr.common.SolrException log
SEVERE: java.lang.NullPointerException
  at org.apache.lucene.search.FilteredQuery.hashCode(FilteredQuery.java:268)
  at java.util.AbstractList.hashCode(AbstractList.java:542)
  at org.apache.solr.search.QueryResultKey.<init>(QueryResultKey.java:49)
  at org.apache.solr.search.SolrIndexSearcher.getDocListC(SolrIndexSearcher.java:1084)
  at org.apache.solr.search.SolrIndexSearcher.search(SolrIndexSearcher.java:375)
  at org.apache.solr.handler.component.QueryComponent.process(QueryComponent.java:394)
  at org.apache.solr.handler.component.SearchHandler.handleRequestBody(SearchHandler.java:186)
  at org.apache.solr.handler.RequestHandlerBase.handleRequest(RequestHandlerBase.java:129)
  at org.apache.solr.core.SolrCore.execute(SolrCore.java:1376)
  at org.apache.solr.servlet.SolrDispatchFilter.execute(SolrDispatchFilter.java:365)
  at org.apache.solr.servlet.SolrDispatchFilter.doFilter(SolrDispatchFilter.java:260)
  at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
  at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
  at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
  at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
  at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
  at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
  at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
  at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
  at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859)
  at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:602)
  at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
  at java.lang.Thread.run(Thread.java:636)

The only thing I can see in the error message is that the plugin is invoked by solr.

Any help would be appreciated, Thanks.

解决方案

Instead of making Solr do it your way, you might want to try it Solr's way. Solr already implements boolean logic.

Split your bitfield into a set of named boolean fields. They can even be bit_0, bit_1, etc. if you are short on inspiration. You can use a dynamic field to save typing and allow later expansion.

Index them as bit_0:true and so on for each doc.

Use those fields in the filter query to do selection: bit_0:true AND bit_24:true.

This is likely to run much, much faster than a bitwise comparison on each field. The bitwise comparise probably needs a full table scan on each query. Well, full field value scan, since Solr does not have tables.

这篇关于Apache Solr:按位操作来筛选搜索结果的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆