我有一个Apache Solr 3.5设置,它有一个像这样的SchemaXml:
<field name="appid" type="string" indexed="true" stored="true" required="true"/>
<field name="docid" type="string" indexed="true" stored="true" required="true"/>
我需要的是一个将它们连接在一起并将其用作<uniqueKey>
的字段。似乎没有任何内置功能,只需创建一个多值id
字段并使用<copyField>
,但似乎uniqueKey需要一个单值字段。
我需要这个的唯一原因是允许客户盲目地发起<add>
次呼叫,让Solr弄清楚它是否是添加或更新。因此,我不太关心如何 ID。
我想我必须编写自己的Analyzer或Tokenizer?我刚刚开始学习Solr,所以我不能100%确定我真正需要什么,并且会欣赏我需要实现的任何提示。
答案 0 :(得分:5)
我个人会给用户带来负担,因为他们很容易为每个文档添加一个字段。
否则,你必须编写几行代码。您可以编写自己的UpdateRequestProcessorFactory
,根据其他现有字段的值自动将新字段添加到每个输入文档。您可以使用分隔符并将其保持为单值。
在UpdateRequestProcessor
上,您应该覆盖processAdd
方法,如下所示:
@Override
public void processAdd(AddUpdateCommand cmd) throws IOException {
SolrInputDocument doc = cmd.getSolrInputDocument();
String appid = (String)doc.getFieldValue( "appid" );
String docid = (String)doc.getFieldValue( "docid" );
doc.addField("uniqueid", appid + "-" + docid);
// pass it up the chain
super.processAdd(cmd);
}
然后,您应该将UpdateProcessor
添加到自定义updateRequestProcessorChain
作为链中的第一个处理器(solrconfig.xml
):
<updateRequestProcessorChain name="mychain" >
<processor class="my.package.MyUpdateRequestProcessorFactory" />
<processor class="solr.RunUpdateProcessorFactory" />
<processor class="solr.LogUpdateProcessorFactory" />
</updateRequestProcessorChain>
希望它有效,我没试过。我已经做过类似的事情但没有使用uniqueKey或必填字段,这是你能找到的唯一问题。但我想如果你把updateProcessor放在链的开头,它应该可以工作。