2013-06-07 5 views
4

내가 만드는 오전 웹 응용 프로그램의 색인 및 검색 기능을 SOLR 및 solrj을 사용하고 있습니다. 다음과 같이 내 요청 처리기는 solrconfig.xml으로 구성됩니다 약자로SOLR/Solrj 매김

<requestHandler name="/select" class="solr.SearchHandler"> 
<lst name="defaults"> 
    <str name="echoParams">explicit</str> 
    <str name="start">0</str> 
    <int name="rows">10</int> 
    <str name="defType">edismax</str> 
    <str name="qf"> 
     title^10.0 subtitle^7.0 abstract^5.0 content^1.0 text^1.0 
    </str> 
    <str name="pf"> 
     title^10.0 subtitle^7.0 abstract^5.0 content^1.0 text^1.0 
    </str> 
    <str name="df">text</str> 

</lst> 
</requestHandler> 

, 인덱싱 및 검색이 잘 작동합니다. 그러나, 페이지 매김을 구현하고 싶습니다. 구성 파일에는 "시작"및 "행"데이터가 들어 있습니다. 그러나, 나는 실행 solrj에서 :

SolrQuery query = new SolrQuery(searchTerm); 
System.out.println(query.getRequestHandler()); 
System.out.println(query.getRows()); 
System.out.println(query.getStart()); 

세 가지 인쇄 문 각각의 쇼는 null. 나는 각각의 'gets'에 대응하는 'set'이 있음을 알고 있지만 solrconfig.xml의 응답 핸들러를 통해 이미 설정되었다고 생각했습니다. 누군가 나를 단서 줄 수 있습니까?

답변

6

서버에 쿼리를 실행하기 전에, 클라이언트는 바로, 당신은 서버 측에서 설정 한 것에 대해 모르겠다? 그래서 그들이 모두 null이라는 사실은 놀라운 것이 아닙니다. 페이지 번호와 페이지 당 항목 수 -

는 클라이언트 측에서 두 개의 매개 변수를 필요 매김을 구현합니다. 이 두 가지를 가지고하면 다음과 같이 클라이언트 측에 SolrQuery를 구성 할 수있다 : 그의 대답에 명시된 @arun으로

SolrQuery query = new SolrQuery(searchTerm); 
query.setStart((pageNum - 1) * numItemsPerPage); 
query.setRows(numItemsPerPage); 
// execute the query on the server and get results 
QueryResponse res = solrServer.query(solrQuery); 
+0

이는 의미가 있습니다. 답장을 보내 주셔서 감사합니다. –

+0

고마워,이게 내가 찾던거야. – Velu

+0

'pageNum'과'numItemsPerPage'를 어떻게 구현해야합니까? –

3

는 "클라이언트가 서버 측에서 설정 한 것에 대해 모르겠다". 그래서 그들이 비어 있다는 것을 놀라지 마십시오. 반면에 어떤 상황에서는 발생할 수있는 페이지 매김 문제에 대해 경고합니다.

페이지 매기기는 읽을 문서가 거의없고 단지 startrows 매개 변수로만 게임하면됩니다.

그래서 페이지 당 50 개 결과를 원하는 클라이언트, 페이지 # 1 = 0 & 행 = 50 시작 사용 을 요청합니다. 페이지 # 2 = 50 시작 & 행 = 50, 페이지 # 3 시작 = 100 개 등 & 행 = 50, ...이다. 그러나 순서 SOLR 50 개 문서 가 임의의 점 N에서 시작 반환 알고하는 것은 쿼리와 일치하는 첫 번째 N + 50 개 정렬 된 문서의 내부 대기열을 구축 할 필요가 는 그래서는 멀리 던질 수있는 제 N의 문서, 이것은 페이징 결과를 리턴하기 위해 필요한 메모리의 양이 개시 PARAM의 증가에 따라 선형 적으로 증가 수단 (50) 나머지를 반환한다.

많은 문서가있는 경우, 수십만 또는 수백만을 의미합니다. 이는 실현 가능한 방법이 아닙니다.
이것은 solr 서버를 무릎 꿇게 만들 수있는 종류의 것입니다. 인간 사용자에게 검색 결과를 표시하는 일반적인 응용 프로그램의

, 이 대부분의 사용자가 검색 결과의 페이지의 첫 번째 소수 과거 드릴 다운에 대해 을 상관하지 않기 때문에 문제의 대부분을하지 경향 -하지만 쿼리와 일치하는 모든 문서에 대한 데이터를 처리하려는 자동화 시스템의 경우 심각하게 금지 될 수 있습니다.

는 웹 사이트가 검색 결과를 페이징하는 경우, 실제 사용자가 더 그렇게 가야하지만, 스파이더 또는 스크레이퍼 모든 웹 사이트 페이지를 읽으려고하면 일어날 수있는 반면에 고려하지 않는 것을 의미한다 .이제 우리는 딥 페이징에 대해 이야기하고 있습니다.

나는이 놀라운 포스트 읽어 제안합니다 :

https://lucidworks.com/blog/2013/12/12/coming-soon-to-solr-efficient-cursor-based-iteration-of-large-result-sets/

을 그리고이 문서 페이지를 살펴 걸릴 : 여기

https://cwiki.apache.org/confluence/display/solr/Pagination+of+Results

그리고는 설명하려고 예입니다 커서를 사용하여 페이지 매김하는 방법.

SolrQuery solrQuery = new SolrQuery(); 
solrQuery.setRows(500); 
solrQuery.setQuery("*:*"); 
solrQuery.addSort("id", ORDER.asc); // Pay attention to this line 
String cursorMark = CursorMarkParams.CURSOR_MARK_START; 
boolean done = false; 
while (!done) { 
    solrQuery.set(CursorMarkParams.CURSOR_MARK_PARAM, cursorMark); 
    QueryResponse rsp = solrClient.query(solrQuery); 
    String nextCursorMark = rsp.getNextCursorMark(); 
    for (SolrDocument d : rsp.getResults()) { 
      ... 
    } 
    if (cursorMark.equals(nextCursorMark)) { 
     done = true; 
    } 
    cursorMark = nextCursorMark; 
}