2012-09-28 6 views
3

Google의 액세스 권한에 해당하는 solr 검색 결과를 필터링해야합니다 (drupal 7 + 비트 마스크를 기반으로하는 사용자 정의 액세스 제어 메커니즘).Apache Solr : 검색 결과를 필터링하는 비트 연산

정수 필드의 비트 연산을 기반으로하는 검색 결과 필터링을위한 Solr QParserPlugin 플러그인이 있습니다 : https://issues.apache.org/jira/browse/SOLR-1913.

I는 드루팔 모듈 search_api_solr 및 solrconfig 의해 제공된 schema.xml로 (데비안 시스템)에 tomcat6 SOLR 3.6.1 (+ /var/lib/tomcat6/solr/lib/bitwise_filter_plugin.jar에 플러그인)를 사용하고 모듈에서 발췌 한 .xml은 SOLR-1913 문제에서 설명한대로 확장됩니다.

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 쿼리 ...

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

... 오류 로그에 다음과 같은 메시지와 함께 실패 플러그인은 solr에 의해 호출됩니다.

감사합니다. 감사합니다. 감사합니다.

+0

jar를 다운로드하여 링크 된 페이지가 제안하는대로 solrconfig.xml에 포함 시켰습니까? 당신은 Drupal 모듈 개발자가 제공 한 버전을 사용하고 있다고 말합니다. – kekkis

+0

예, solrconfig.xml을 편집하여 jar를 올바른 위치에 배치했습니다. 플러그인이 제대로 포함되어 있습니다. 그렇지 않으면 백 트레이스에 나타나지 않고 solr이 bitwise 연산자를 알지 못한다고 불평 할 것입니다. ...이 질문을 좀 더 명확하게하기 위해 편집했습니다. 감사합니다. – LarS

+0

@kekkis : 쿼리 구문이 정확하다고 생각합니까? [DisMax Parameters] (http://lucidworks.lucidimagination.com/display/solr/The+DisMax+Query+Parser)와 관련하여 뭔가 빠졌습니다. – LarS

답변

4

Solr을 자신의 방식대로 만드는 대신 Solr의 방식으로 시도해 볼 수 있습니다. Solr은 이미 부울 논리를 구현합니다.

비트 필드를 이름이 지정된 부울 필드 집합으로 나눕니다. 영감이 부족한 경우 bit_0, bit_1 등이 될 수도 있습니다. 동적 필드를 사용하여 입력 내용을 저장하고 나중에 확장 할 수 있습니다.

각 문서에 대해 bit_0 : true 등으로 색인합니다.

필터 쿼리의 해당 필드를 사용하여 선택합니다 : bit_0 : true AND bit_24 : true.

이것은 각 필드의 비트 비교보다 훨씬 빠르게 실행됩니다. bitwise 비교 아마 각 테이블에 대한 전체 테이블 스캔이 필요합니다. Solr에는 테이블이 없으므로 전체 필드 값을 검색합니다.

+0

의견을 보내 주셔서 감사합니다. 이것이 우리가 구현을 마친 방식이기도합니다. 이미 각 비트마다 필드가 있습니다. mysql 쿼리의 경우 비트 비교를 사용하므로 solr에서도 사용하는 것이 좋을 것이라고 생각했습니다. 아무도이 문제에 대해 도움을 줄 수는 없지만 위에 설명 된대로 진행했습니다. 마지막으로 그것은 좋은 해결 방법과 어쩌면 당신이 설명한 것처럼 더 performant 것으로 보인다. ... 반대쪽에서 비트 연산자를 작동시키는 방법에 대한 질문에 대답하지 않습니다. – LarS