2012-03-19 69 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