또 다른 잠재적으로 난처한 질문입니다. 간과되었을 수있는 명백한 솔루션을 지적하십시오. 이전에 솔루션을 검색했지만 아무 것도 발견하지 못했지만 때로는 검색 할 잘못된 키워드를 선택하는 문제가 있습니다.
몇 달 전에 enterprise-y 시스템에 대한 내 자신의 RequestHandler를 코딩하여 solr 코어에 대한 모든 쿼리에 추가 필터로 몇 가지 필요한 보안 매개 변수를 주입했습니다. 인덱스에 대한 쿼리로 인해 생성 된 문서가 수집되어 사용자에게 반환 될 때까지 모든 작업이 순조롭게 진행됩니다.Solr Custom RequestHandler - 결과 최적화
기본적으로 필터가 생성되고 쿼리가 실행 된 후 우리는 문서 ID (및 점수) 집합을 얻습니다.하지만 결과 집합을 빌드하기 위해 ID를 반복해야합니다. 이는 표준 요청 처리기를 쿼리하는 것보다 10 배 더 느리고 결과 수가 증가함에 따라 악화 될 수밖에 없습니다. 더 나쁜 것은 스키마가 유연성을 위해 동적 필드에 크게 의존하기 때문에 이전에 문서 당 가능한 모든 조합을 테스트하는 것 이외에는 문서 당 검색 할 필드 목록을 이전에 검색하는 방법이 없다는 것입니다.
아래 코드는 SolrIndexSearcher를 쿼리하고 응답을 작성하기 위해 프로덕션 환경에서 실행되는 간단한 버전입니다. 속히
, 내 질문은 :
- 한 번에 모든 결과를 검색하는 대신 문서로 응답 문서를 구축하는 방법은 없나요?
- 가능한 모든 조합을 테스트하는 대신 각 결과에 필드 목록을 가져올 가능성이 있습니까?
- 이 코드에서 알고 있어야하는 특정 WTF는 무엇입니까? 기분이 자유 롭다!
//function that queries index and handles results
private void searchCore(SolrIndexSearcher searcher, Query query,
Filter filter, int num, SolrDocumentList results) {
//Executes the query
TopDocs col = searcher.search(query,filter, num);
//results
ScoreDoc[] docs = col.scoreDocs;
//iterate & build documents
for (ScoreDoc hit : docs) {
Document doc = reader.document(hit.doc);
SolrDocument sdoc = new SolrDocument();
for(Object f : doc.getFields()) {
Field fd = ((Field) f);
//strings
if (fd.isStored() && (fd.stringValue() != null))
sdoc.addField(fd.name(), fd.stringValue());
else if(fd.isStored()) {
//Dynamic Longs
if (fd.name().matches(".*_l")) {
ByteBuffer a = ByteBuffer.wrap(fd.getBinaryValue(),
fd.getBinaryOffset(), fd.getBinaryLength());
long testLong = a.getLong(0);
sdoc.addField(fd.name(), testLong);
}
//Dynamic Dates
else if(fd.name().matches(".*_dt")) {
ByteBuffer a = ByteBuffer.wrap(fd.getBinaryValue(),
fd.getBinaryOffset(), fd.getBinaryLength());
Date dt = new Date(a.getLong());
sdoc.addField(fd.name(), dt);
}
//...
}
}
results.add(sdoc);
}
}
설명을 위해 모든 단일 요청에 추가 필터를 추가하기위한 목적으로이 사용자 지정 RequestHandler를 만들었습니다. 그 맞습니까? – rfeak
@rfeak - 간단한 대답, 예. 관련성이 있습니까? 당신이 제안하는 어떤 다른 접근법? – 12N
예. 올바르게 (2 년이 지났음) 회상하면 각 쿼리에 추가되는 XML 파일에 기본 필터를 추가하는 방법이 있습니다. 그런 다음 기본 필터는 다른 것과 마찬가지로 FilterCache에 캐시됩니다. 다른 필터와의 통합은 매우 빠르며 문서를 가져 와서 필터를 적용 할 필요가 없습니다. 당신이 그 접근법을 고려했는지 확실하지 않습니다. – rfeak