在 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>

我现在有几个问题:

  1. 要实现这一点,我是否必须使用 Nutch 重新索引文档?
  2. 如何检查它是否正常工作?一个简单的 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 中执行您的计数逻辑。