solr 1.4 的分布式请求过程 和 拼写检查过程

 

solr 1.4 的分布式请求过程

rb.shards 这里存放了要分布的机器

for( SearchComponent c : components ) {//通知搜索组件准备
c.prepare(rb);
}

while (非结束状态){
// 调用各组件的分布式处理过程
for( SearchComponent c : components ) {
// the next stage is the minimum of what all components report
nextStage = Math.min(nextStage, c.distributedProcess(rb));
}
//上个过程会产生分布式查询,注意只是准备查询数据
//submit all current request tasks at once
for(outgoing:outgoings){//一个outgoing代表一个请求
for(shard:shards){//一个shard代表一个子机
ModifiableSolrParams params = new ModifiableSolrParams(sreq.params);
comm.submit(sreq, shard, params);
}
}
//然后等待返回。如果这个过程中有组件放置额外的请求,就立即退出循环,在外层循环中,利用上面的代码把它发送出去。
//注意,这个函数会返回所有的到子机的请求。通过ShardRequest对象。它代表一类请求的完整结束。
ShardResponse srsp = comm.takeCompletedOrError();
rb.finished.add(srsp.getShardRequest());
for(SearchComponent c : components) {
c.handleResponses(rb, srsp.getShardRequest());
}

//这里的finish stage 表示结束阶段,仅表示一波请求的结束,并不是分布式查询的结束。
for(SearchComponent c : components) {
c.finishStage(rb);
}

//总结:
//1 distributedProcess 确定分布查询
//2 comm.submit 分布式请求查询
//3 对返回数据做处理
//4 阶段结束的处理

//分布式查询组件QueryComponent基本上会走2轮上述过程。
//1,查询子机得到docid
//2,获取doc
}

solr 的拼写检查过程

拼写检查是一个组件SpellCheckComponent
在1.4版本不支持分布式

切词部分,分2种情况
---------------------------
用户的查询 = SPELLCHECK_Q
切词器 getQueryAnalyzer
切词 getTokens
----------------
用户的查询 = rb.getQueryString 或者 CommonParams.Q
queryConverter -- 这里会用到切词
基本是先用正则表达式分段,再用给定切词器切词
Analyzer analyzer = fieldType == null ? new WhitespaceAnalyzer()
: fieldType.getQueryAnalyzer();
--------------------------
把切出来的词(token),每个
通过下面的过程
IndexReader reader = rb.req.getSearcher().getReader();
SolrSpellChecker.getSuggestions(){
org.apache.lucene.search.spell.SpellChecker spellChecker
//这里会调用lucene的切词组件SpellChecker
String[] suggestions = spellChecker.suggestSimilar(tokenText, (int) Math.max(count, AbstractLuceneSpellChecker.DEFAULT_SUGGESTION_COUNT),
field != null ? reader : null, //workaround LUCENE-1295
field,
onlyMorePopular){
//field,the field of the user index: 如果字段不是null,则建议词被要求出现在该字段(这个会用到 reader).
}
term = term.createTerm(tokenText);/term = term.createTerm(suggestions[i]);
result.add(token, reader.docFreq(term));
}
得到建议

把建议根据情况组合一个最好的。

关于lucene的拼写检查过程,请参考
http://lolorosa.blogbus.com/logs/45646288.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值