Solr中的可更新字段

时间:2013-06-10 16:02:50

标签: solr

我正在使用Solr搜索我的网页数据。我的solr-indexer将创建多个字段和相应的值。但是,我想更频繁地更新其中一些字段,例如该页面上的点击次数。这些字段不需要是可索引的,我不需要对这些字段值执行搜索。但是我确实想要获取它们并经常更新它们。 我是solr的新手,所以一个更具描述性的答案,或许一些正在运行的示例/代码可以帮助我更好。

3 个答案:

答案 0 :(得分:2)

如果您使用的是Solr 4+,是的,您可以将部分更新推送到Solr索引。

对于部分更新,需要存储schema.xml中的所有字段

这是您的字段部分应如下所示:

<fields>
  <field name="id" type="string" indexed="true" stored="true" required="true" />
  <field name="title" type="text_general" indexed="true" stored="true"/>
  <field name="description" type="text_general" indexed="true" stored="true" />
  <field name="body" type="text_general" indexed="true" stored="true"/>
  <field name="clicks" type="integer" indexed="true" stored="true" />
</fields>

现在,当您向其中一个字段发送部分更新时,例如:在您的情况下,“点击”;在后台,Solr将获取该文档的所有其他字段的值,例如标题,描述,正文,删除旧文档,并将新的更新文档推送到Solr索引。

localhost:8080/solr/update?commit=true' -H 'Content-type:application/json' -d '[{"id":"1","clicks":{"set":100}}]

以下是有关部分更新的详细文档:http://solr.pl/en/2012/07/09/solr-4-0-partial-documents-update/

答案 1 :(得分:0)

检查Wiki以获取有关更新的更多信息。并检查this link是否有原子更新。它仅适用于Solr 4及更高版本。

答案 2 :(得分:0)

示例SOLR-部分更新代码:

先决条件:需要存储字段。

您需要在直接更新处理程序

下配置更新日志路径
  <updateHandler class="solr.DirectUpdateHandler2">

    <!-- Enables a transaction log, used for real-time get, durability, and
         and solr cloud replica recovery.  The log can grow as big as
         uncommitted changes to the index, so use of a hard autoCommit
         is recommended (see below).
         "dir" - the target directory for transaction logs, defaults to the
                solr data directory.  --> 
    <updateLog>
      <str name="dir">${solr.ulog.dir:}</str>
    </updateLog>
  </updateHandler>

<强>代码:

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import org.apache.solr.client.solrj.SolrServer;
import org.apache.solr.client.solrj.SolrServerException;
import org.apache.solr.client.solrj.impl.ConcurrentUpdateSolrServer;
import org.apache.solr.client.solrj.impl.HttpSolrServer;
import org.apache.solr.common.SolrInputDocument;
public class PartialUpdate {
    public static void main(String args[]) throws SolrServerException,
            IOException {
        SolrServer server = new HttpSolrServer("http://localhost:8080/solr");
        SolrInputDocument doc = new SolrInputDocument();
        Map<String, String> partialUpdate = new HashMap<String, String>();
        // set - to set a field.
        // add - to add to a multi-valued field.
        // inc - to increment a field.
        partialUpdate.put("set", "peter"); // value that need to be set
        doc.addField("id", "122344545"); // unique id
        doc.addField("fname", partialUpdate); // value of field fname corresponding to id 122344545 will be set to 'peter'
        server.add(doc);
    }
}