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