gpt4 book ai didi

java - 多文档查询的 Solr 性能

转载 作者:行者123 更新时间:2023-11-29 10:03:31 25 4
gpt4 key购买 nike

我想让 Solr 始终检索通过搜索找到的所有文档(我知道 Solr 不是为此而构建的,但无论如何)我目前正在使用以下代码执行此操作:

    ...
List<Article> ret = new ArrayList<Article>();
QueryResponse response = solr.query(query);
int offset = 0;
int totalResults = (int) response.getResults().getNumFound();
List<Article> ret = new ArrayList<Article>((int) totalResults);
query.setRows(FETCH_SIZE);
while(offset < totalResults) {
//requires an int? wtf?
query.setStart((int) offset);
int left = totalResults - offset;
if(left < FETCH_SIZE) {
query.setRows(left);
}
response = solr.query(query);
List<Article> current = response.getBeans(Article.class);
offset += current.size();
ret.addAll(current);
}
...

这行得通,但如果查询获得超过 1000 次点击,速度会很慢(我已经在此处阅读过相关内容。这是由 Solr 引起的,因为我每次都设置开始,这 - 由于某种原因 - 需要一些时间) .有什么更好(更快)的方法来做到这一点?

最佳答案

要改进建议的答案,您可以使用流式响应。这是特别添加的 for the case that one fetches all results .正如您在 Solr 的 Jira 中看到的那样,那个人想做和您一样的事情。这已在 Solr 4 中实现。

This is also described in Solrj's javadoc .

Solr 将在开始发送响应之前打包响应并创建完整的 XML/JSON 文档。然后您的客户需要打开所有这些并将其作为列表提供给您。通过使用流式处理和并行处理(您可以在使用此类排队方法时执行这些操作),性能应该会进一步提高。

是的,您将失去自动 bean 映射,但由于性能是这里的一个因素,我认为这是可以接受的。

这是一个示例单元测试:

public class StreamingTest {

@Test
public void streaming() throws SolrServerException, IOException, InterruptedException {
HttpSolrServer server = new HttpSolrServer("http://your-server");
SolrQuery tmpQuery = new SolrQuery("your query");
tmpQuery.setRows(Integer.MAX_VALUE);
final BlockingQueue<SolrDocument> tmpQueue = new LinkedBlockingQueue<SolrDocument>();
server.queryAndStreamResponse(tmpQuery, new MyCallbackHander(tmpQueue));
SolrDocument tmpDoc;
do {
tmpDoc = tmpQueue.take();
} while (!(tmpDoc instanceof PoisonDoc));
}

private class PoisonDoc extends SolrDocument {
// marker to finish queuing
}

private class MyCallbackHander extends StreamingResponseCallback {
private BlockingQueue<SolrDocument> queue;
private long currentPosition;
private long numFound;

public MyCallbackHander(BlockingQueue<SolrDocument> aQueue) {
queue = aQueue;
}

@Override
public void streamDocListInfo(long aNumFound, long aStart, Float aMaxScore) {
// called before start of streaming
// probably use for some statistics
currentPosition = aStart;
numFound = aNumFound;
if (numFound == 0) {
queue.add(new PoisonDoc());
}
}

@Override
public void streamSolrDocument(SolrDocument aDoc) {
currentPosition++;
System.out.println("adding doc " + currentPosition + " of " + numFound);
queue.add(aDoc);
if (currentPosition == numFound) {
queue.add(new PoisonDoc());
}
}
}
}

关于java - 多文档查询的 Solr 性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15758636/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com