在 Solr 中创建自定义 FunctionQuery
Creating custom FunctionQuery in Solr
我想创建一个自定义的 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"},
]
}}
我能找到的唯一有用的 link 是 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>
我现在有几个问题:
- 要实现这一点,我是否必须使用 Nutch 重新索引文档?
- 如何检查它是否正常工作?一个简单的 solr 查询会像
http://localhost:8983/solr/nutch/select?indent=on&q=*:*&wt=json
一样工作吗?
您可以使用更新请求处理器。有很多方法可以做到这一点。
查看 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 中执行您的计数逻辑。
我想创建一个自定义的 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"},
]
}}
我能找到的唯一有用的 link 是 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>
我现在有几个问题:
- 要实现这一点,我是否必须使用 Nutch 重新索引文档?
- 如何检查它是否正常工作?一个简单的 solr 查询会像
http://localhost:8983/solr/nutch/select?indent=on&q=*:*&wt=json
一样工作吗?
您可以使用更新请求处理器。有很多方法可以做到这一点。
查看 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 中执行您的计数逻辑。