我有一个包含这样数据的字段。这是一个示例行:
伦敦;大伦敦;伦敦市
我想结束以下方面
伦敦(计数 10) 大伦敦(计数 5) 伦敦市(计数 2)
我只是坚持使用正确的查询。
Solr 可以在单个字段中具有多个方面吗?
干杯
ķ
你有两个选择。
最好的一种是使用多值字段。这意味着您需要拆分以分号进入的内容。这将取决于您如何获取数据。例如,CSV 允许您将字段声明为多值并以分号分隔。DataImportHandler 具有 RegexTransformer,它还允许您吐出内容。或者您可以使用可以应用于任何来源的请求处理器,但我认为没有开箱即用的拆分。你需要写一个。
另一种选择是意识到分面字段使用标记化的值而不是存储的值。通常,正是因为它,才将多面字段定义为字符串。但是,如果您根本无法使用第一种方法(并且您应该努力),您可以配置一个特殊的字段类型,它只将标记拆分为分号而不进行其他处理。您将为此使用PatternTokenizerFactory。
根据 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(';'));
}
}
}
}
似乎为我工作,希望它也可以帮助别人!