lucene 在Solr中创建自定义FunctionQuery

ccrfmcuu  于 2022-11-07  发布在  Lucene
关注(0)|答案(1)|浏览(160)

我想创建一个自定义的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>

我现在有几个问题:
1.要使此功能正常工作,我是否必须使用Nutch重新索引文档?
1.如何检查它是否工作?一个简单的solr查询会像http://localhost:8983/solr/nutch/select?indent=on&q=*:*&wt=json一样工作吗?

ttcibm8c

ttcibm8c1#

你可以使用更新请求处理器。有很多方法可以做到这一点。
请查看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中执行计数逻辑。

相关问题