2012-03-19 75 views
3

我有一个Apache Solr实现3.5设置中,像这样的SchemaXml:如何在Apache Solr中创建复合键字段?

<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

我不确定java api如何处理文档的添加或更新,但它应该是: - 如果找到了ID =更新doc,否则插入doc。所以,我猜这个ID确实很重要...... – ajreal 2012-03-19 17:51:39

+0

@ajreal是的,这是Solr在指定uniqueKey时所做的。问题是,我的唯一ID由两个不同的ID组成,我想将创建该组合ID的负担从应用程序开发人员转移到搜索服务器。 – 2012-03-19 17:54:41

+0

@MichaelStum你试过我的解决方案吗?我可以知道你的想法吗? – javanna 2012-04-02 07:31:04

回答

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

+0

终于开始尝试,虽然我只是略过了一遍,但这种方法似乎奏效了。再次感谢! – 2012-05-17 23:09:01