我想创建一个自定义的Solr FunctionQuery,以便能够获得实际的字段长度(用术语表示)。结果可能如下所示:
{
"responseHeader":{
"status":0,
"QTime":8,
"params":{
"q":"python",
"indent":"on",
"fl":"title,score,[features efi.query=python store=myfeature_store]",
"wt":"json"}},
"response":{"numFound":793,"start":0,"maxScore":0.33828905,"docs":[
{
"title":"Newest 'python' Questions - Stack Overflow",
"score":0.33828905,
"[features]":"titleLength=5"},
]
}}
我唯一能找到的有用链接是this。但这并不能很好地解释这个话题。我是Solr的新手,所以分步操作会有所帮助。
编辑
我已经创建了一个名为count.js
的js脚本,如下所示:
function WordCount(str) {
return str.split(" ").length;
}
function processAdd(cmd) {
doc = cmd.solrDoc; // org.apache.solr.common.SolrInputDocument
var title = doc.getFieldValue("title");
var count = WordCount(title);
doc.setField("title_count", count);
logger.info("count-script#count: title_count=" + count);
}
function processDelete(cmd) {
// no-op
}
function processMergeIndexes(cmd) {
// no-op
}
function processCommit(cmd) {
// no-op
}
function processRollback(cmd) {
// no-op
}
function finish() {
// no-op
}
此外,我在solrconfig.xml
中添加了以下条目:
<initParams path="/update/**">
<lst name="defaults">
<str name="update.chain">script</str>
</lst>
</initParams>
<updateRequestProcessorChain name="script">
<processor class="solr.StatelessScriptUpdateProcessorFactory">
<str name="script">count.js</str>
</processor>
<processor class="solr.RunUpdateProcessorFactory" />
</updateRequestProcessorChain>
我现在有几个问题:
http://localhost:8983/solr/nutch/select?indent=on&q=*:*&wt=json
一样工作吗?答案 0 :(得分:1)
您可以使用更新请求处理器。有很多方法可以做到这一点。
签出CountFieldValuesUpdateProcessorFactory
基本上,您可以克隆字段并对其进行计数。但这仅在源字段为多值时才有效。也就是说,在将其提供给Solr之前,需要对它们进行标记化。您可以在SolrConfig.xml中配置它
<updateRequestProcessorChain name="word-counter">
<processor class="solr.CloneFieldUpdateProcessorFactory">
<str name="source">title</str>
<str name="dest">title_count</str>
</processor>
<processor class="solr.CountFieldValuesUpdateProcessorFactory">
<str name="fieldName">title_count</str>
</processor>
<processor class="solr.DefaultValueUpdateProcessorFactory">
<str name="fieldName">title_count</str>
<int name="value">0</int>
</processor>
<processor class="solr.LogUpdateProcessorFactory" />
<processor class="solr.RunUpdateProcessorFactory" />
</updateRequestProcessorChain>
但是请记住,这要求您将“ title”作为多值显示,这可能并不理想。您可以添加一个诸如“ title_multi”之类的附加字段,并屏蔽您的过程。
或者,您可以使用ScriptUpdateProcessor并使用Javascript执行计数逻辑。