2013-01-16 49 views
0

我有一个这样的数据字段。下面是一个例子行:以分号分隔的多个分面

伦敦,大伦敦,伦敦市

我想有以下方面落得

伦敦(数10) 大伦敦(算上5) 伦敦城市(计数2)

我只是坚持正确的查询使用。

Can Solr在单个字段中有多个方面?

干杯

ķ

+1

如果使用这些字段创建多值字符串字段,它应该是可能的 –

回答

1

你有两个选择。

最好的是使用多值字段。这意味着你需要分割你的内容进入分号。这将取决于您如何获取数据。例如,CSV允许您将该字段声明为多值并在分号上分割。 DataImportHandler有RegexTransformer,它也允许你吐出内容。或者你可以使用请求处理器,它可以适用于任何来源,但我认为没有一个开箱即可分解。你需要写一个。

另一种选择是认识到分面的字段使用标记值而不是存储值。通常,由于它而定义为字符串的分面字段。但是,如果你根本无法获得第一种工作方式(并且你应该尽力去做),那么你可以配置一种特殊的字段类型,将分号分割成分号并且不做其他处理。你会使用PatternTokenizerFactory

+0

“分面的字段使用标记值而不是存储值”这一事实正好说明了我看到的一些行为让我感到惊讶。这解释了很多。谢谢。 –

+0

我确定这是正确的答案。虽然我对solr非常陌生,所以看起来我有更多的研究要做。感谢您抽出时间指引我走向正确的方向。 –

0

我发现了一个基于Alexandre Rafalovitch的建议的不错选项。我没有进入Java,而是创建了一些简单的JavaScript,并从StatelessScriptUpdateProcessorFactory中调用它。在我的情况下,我有一些需要分割的字段,所以我的一些代码反映了这一点。

我还应该指出,这基本上是原型代码。你可能想花一点时间改进它,使配置更容易,等等。我知道我会!但到了那个时候,我可能会忘记更新这个问题,我认为一个黑客的回答总比没有回答好。 :-)(我会尽量记得回来和更新一次我做,但是......)现在

,solrconfig.xml中,我添加了一个updateRequestProcessingChain:

<updateRequestProcessorChain name="splitting"> 
    <processor class="solr.StatelessScriptUpdateProcessorFactory"> 
     <str name="script">split-script.js</str> 
     <lst name="params"> 
     <str name="splitFields">firstfield,secondfield</str> 
     </lst> 
    </processor> 
    <processor class="solr.RunUpdateProcessorFactory" /> 
    </updateRequestProcessorChain> 

我也/update/extract已将此添加到“默认值”配置:

<str name="update.chain">splitting</str> 

对于分割的script.js,我刚复制的样本更新的script.js已经在conf文件夹和修改processAdd功能:

function processAdd(cmd) { 

    doc = cmd.solrDoc; // org.apache.solr.common.SolrInputDocument 
    id = doc.getFieldValue("id"); 
    logger.info("splitter-script#processAdd: id=" + id); 

    fields_param = params.get('splitFields'); // "params" only exists if processor configured with <lst name="params"> 

    fields = fields_param.split(','); 
    for (var i = 0; i < fields.length; i++) 
    { 
    var fieldName = fields[i]; 
    var field = doc.getField(fieldName); 
    if (field) 
    { 
     var value = field.getValue(); 
     if (value) 
     { 
     // Remove the old field so the un-split value doesn't also show up in the list... 
     doc.removeField(fieldName); 
     doc.addField(fieldName, value.split(';')); 
     } 
    } 
    } 
} 

似乎正在为我工​​作,希望它可以帮助别人呢!