【问题标题】:Apache Solr: bitwise operations to filter search resultsApache Solr:按位运算过滤搜索结果
【发布时间】:2012-09-28 08:34:05
【问题描述】:

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

有一个 Solr QParserPlugin 插件,用于基于整数字段的按位运算过滤搜索结果:https://issues.apache.org/jira/browse/SOLR-1913

我在 tomcat6(在 debian 系统上)上使用 Solr 3.6.1(+ /var/lib/tomcat6/solr/lib/bitwise_filter_plugin.jar 中的插件)和由 drupal 模块 search_api_solr 提供的 schema.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}*

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

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)

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

任何帮助将不胜感激,谢谢。

【问题讨论】:

  • 您是否按照链接页面的提示下载了 jar 并将其包含到您的 solrconfig.xml 中?您说您使用的是 Drupal 模块开发人员提供的版本,因此提出了问题。
  • 是的,我编辑了 solrconfig.xml 并将 jar 放在正确的位置。我猜该插件已正确包含,否则它不会出现在回溯中,并且 solr 会抱怨不知道按位运算符。 ...我编辑了我的问题以使其更清楚,谢谢。
  • @kekkis:你认为查询语法是正确的还是我遗漏了什么——关于DisMax Parameters
  • 好吧,您使用的是fq,而示例使用的是q。我会说尝试使用 q 看看它是如何工作的。
  • 这里也一样,它适用于dismax:http://solr:8080/solr/select?q={!dismax qf=is_bitmask},但不适用于按位:http://solr:8080/solr/select?q={!bitwise field=is_bitmask op=AND source=1234} ...同样的错误。

标签: java solr drupal-7


【解决方案1】:

与其让 Solr 以你的方式去做,你可能想尝试一下 Solr 的方式。 Solr 已经实现了布尔逻辑。

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

为每个文档将它们索引为 bit_0:true 等等。

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

这可能比在每个字段上进行按位比较运行得快得多。按位比较可能需要对每个查询进行全表扫描。好吧,全字段值扫描,因为 Solr 没有表。

【讨论】:

  • 感谢您的意见。这也是我们最终实现的方式。我们已经有每个位的字段。对于 mysql 查询,我们使用按位比较,所以我们认为在 solr 上也可以使用它。虽然没有人能够在这个问题上提供帮助,但我们采用了您上面描述的方式。最后,它似乎是一个很好的解决方法,并且可能如您所描述的那样性能更高。 ...另一方面,它没有回答有关如何使按位运算符工作的问题。
猜你喜欢
  • 1970-01-01
  • 2016-11-13
  • 2011-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多