0

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

伦敦;大伦敦;伦敦市

我想结束以下方面

伦敦(计数 10) 大伦敦(计数 5) 伦敦市(计数 2)

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

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

干杯

ķ

4

2 回答 2

1

你有两个选择。

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

另一种选择是意识到分面字段使用标记化的值而不是存储的值。通常,正是因为它,才将多面字段定义为字符串。但是,如果您根本无法使用第一种方法(并且您应该努力),您可以配置一个特殊的字段类型,它只将标记拆分为分号而不进行其他处理。您将为此使用PatternTokenizerFactory

于 2013-01-16T14:56:38.170 回答
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>

我还将它添加到“默认”配置中/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(';'));
      }
    }
  }
}

似乎为我工作,希望它也可以帮助别人!

于 2014-11-10T21:50:53.680 回答