字段中的多个面由分号分隔

时间:2013-01-16 12:29:25

标签: solr facet

我有一个包含这样数据的字段。这是一个示例行:

伦敦;大伦敦;伦敦城

我想最终得到以下方面

伦敦(第10名) 大伦敦(数5) 伦敦市(伯爵2)

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

Solr可以在一个字段中有多个方面吗?

干杯

ķ

2 个答案:

答案 0 :(得分:1)

您有两种选择。

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

另一种选择是认识到分面字段使用标记化值而不是存储值。通常,由于它而完全定义为字符串的分面字段。但是,如果你根本无法获得第一种工作方法(并且你应该努力),你可以配置一个特殊的字段类型,它只是在分号上拆分标记而不进行其他处理。您可以使用PatternTokenizerFactory

答案 1 :(得分:0)

根据Alexandre Rafalovitch的建议,我找到了一个相当不错的选择。我没有进入Java,而是创建了一些简单的javascript,并从StatelessScriptUpdateProcessorFactory中调用它。在我的情况下,我有几个字段需要以这种方式拆分,所以我的一些代码反映了这一点。

我还应该指出,这基本上是原型代码。您可能希望花一点时间来改进它,使配置更容易等等。我知道我会的!但是当我完成这个时,我可能会忘记更新这个问题,我认为一个hacky的答案总比没有答案好。 :-)(我会记得在我完成后再回来更新,但是......)

现在,在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>

我还将此添加到&#34;默认值&#34; /update/extract中的配置:

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

对于split-script.js,我刚刚复制了conf文件夹中的示例update-script.js并修改了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(';'));
      }
    }
  }
}

似乎对我有用,希望它也可以帮助别人!