如何在Apache Solr中创建复合键字段?

时间:2012-03-19 17:45:26

标签: java solr

我有一个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%确定我真正需要什么,并且会欣赏我需要实现的任何提示。

1 个答案:

答案 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放在链的开头,它应该可以工作。