我有一个包含这样数据的字段。这是一个示例行:
伦敦;大伦敦;伦敦城
我想最终得到以下方面
伦敦(第10名) 大伦敦(数5) 伦敦市(伯爵2)
我只是坚持使用正确的查询。
Solr可以在一个字段中有多个方面吗?
干杯
ķ
答案 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(';'));
}
}
}
}
似乎对我有用,希望它也可以帮助别人!