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

Mic*_*tum 3 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"/>
Run Code Online (Sandbox Code Playgroud)

我需要的是一个将它们连接在一起并将其用作的字段<uniqueKey>.似乎没有内置,没有创建一个多值id字段和使用<copyField>,但似乎uniqueKey需要一个单值字段.

我需要这个的唯一原因是允许客户盲目地<add>拨打电话,并让Solr弄清楚它是否是添加或更新.所以,我没有太在意怎样的ID样子.

我想我必须编写自己的Analyzer或Tokenizer?我刚刚开始学习Solr,所以我不能100%确定我真正需要什么,并且会欣赏我需要实现的任何提示.

jav*_*nna 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);
}
Run Code Online (Sandbox Code Playgroud)

然后你应该将你UpdateProcessor的自定义添加updateRequestProcessorChain为链中的第一个处理器(solrconfig.xml):

<updateRequestProcessorChain name="mychain" >
    <processor class="my.package.MyUpdateRequestProcessorFactory" />
    <processor class="solr.RunUpdateProcessorFactory" />
    <processor class="solr.LogUpdateProcessorFactory" />
</updateRequestProcessorChain>
Run Code Online (Sandbox Code Playgroud)

希望它有效,我还没试过.我已经做过类似的事情但没有使用uniqueKey或必填字段,这是你能找到的唯一问题.但我想如果你把updateProcessor放在链的开头,它应该可以工作.