读书人

Solr 创造索引的原理 源码分析

发布时间: 2012-08-02 11:35:25 作者: rapoo

Solr 创建索引的原理 源码分析

转载??????????????}
????????????}
????????????// check if these flags are set
????????????if (overwritePending != null && overwriteCommitted != null) {
??????????????if (overwritePending != overwriteCommitted) {
????????????????throw new SolrException(SolrException.ErrorCode.BAD_REQUEST,
????????????????????????"can't have different values for 'overwritePending' and 'overwriteCommitted'");
??????????????}
??????????????overwrite = overwritePending;
????????????}
???????????//通过下面三行代码,起作用的就是overwrite
????????????addCmd.overwriteCommitted = overwrite;
????????????addCmd.overwritePending = overwrite;
????????????addCmd.allowDups = !overwrite;

对<doc>标签的处理如下:
else if ("doc".equals(currTag)) {
????????????XmlUpdateRequestHandler.log.trace("adding doc...");
????????????addCmd.clear();
????????????addCmd.solrDoc = readDoc(parser);
}
readDoc方法主要是读取<doc>标签和<field>的读取<doc>代码如下:
?????//Solr 把Luence的Doc封装为SolrInputDocument
?????SolrInputDocument doc = new SolrInputDocument();
????String attrName = "";
????for (int i = 0; i < parser.getAttributeCount(); i++) {
??????attrName = parser.getAttributeLocalName(i);
??????if ("boost".equals(attrName)) {
????????doc.setDocumentBoost(Float.parseFloat(parser.getAttributeValue(i)));
??????} else {
????????XmlUpdateRequestHandler.log.warn("Unknown attribute doc/@" + attrName);
??????}
????}
???从上面的代码可以看出,<doc>标签可以有属性boost,(<doc boost="2">)即可以给该doc设置权重。以改变评分。
读取field的代码就不贴了,相信读者也会想到和上面的是一个模式,会读取 field的name,boost,属性,像<doc>一样,
我们也可以给特定的field设置权重。遇到</field>标签时,代码如下:
??????????????doc.addField(name, text.toString(), boost);
??????????????boost = 1.0f;
从上面两行代码可以看出,每一个field字段默认的boost为1.0.
Solr解析完<add>命令,创建一个SolrInputDocument??对象,那Solr是怎么把SolrInputDocument 对象转变为luence
的doc对象的呢,在创建时,Solr创建了一个process 这个process是RunUpdateProcessor的实例,上面readDoc方法完成后,返回SolrInputDocument??实例,然后调用RunUpdateProcessor的processAdd方法。把SolrInputDocument??对象转变为luence
doc对象。代码如下:
????public void processAdd(AddUpdateCommand cmd) throws IOException {
?????????//转变doc对象
?????????cmd.doc = DocumentBuilder.toDocument(cmd.getSolrInputDocument(), req.getSchema());
?????????//主要是把luence doc写到内存索引
?????????updateHandler.addDoc(cmd);
?????????super.processAdd(cmd);
??}

?

读书人网 >软件架构设计

热点推荐