“”当我尝试用我的Node / Express应用程序将文档添加到我的Solr索引

我正在尝试将Solr集成到Node / Express应用程序中,同时我正在使用此节点包进行Solr集成。 我能够正确查询索引,但按照包的GitHub上的说明,我无法将文档添加到索引。 我不断收到这个错误:

[SyntaxError: Unexpected token <] 

在Solr控制台上,错误更为详细:

 SEVERE: Error processing "legacy" update command:com.ctc.wstx.exc.WstxUnexpectedCharException: Unexpected character '[' (code 91) in prolog; expected '<' 

这里是我正在使用的一个小testing应用程序来试试这个工作:

 // set variables for environment var express = require('express'); var path = require('path'); var solr = require('solr-client'); // Create the Express app var app = express(); module.exports = app; // Initialize the Vash view engine app.set("views", path.join( __dirname, "/views") ); app.set("view engine", "vash"); // set routes app.get('/', function(req, res) { // Create a client var client = solr.createClient(); var query = 'q=fencing'; client.get('select', query, function(err, obj) { if (err) { console.log(err); } else { console.log(obj); } }); // Switch on "auto commit", by default `client.autoCommit = false` client.autoCommit = true; var docs = []; for(var i = 0; i <= 10 ; i++){ var doc = { id : 12345 + i, title_t : "Title "+ i, description_t : "Text"+ i + "Alice" }; docs.push(doc); } // Add documents client.add(docs,function(err,obj){ if(err){ console.log(err); }else{ console.log(obj); } }); res.render('index'); }); // Set server port app.listen(4000); console.log('server is running on localhost:4000'); 

不工作的特定部分是我尝试在这里添加一个文档到索引的地方:

 // Add documents client.add(docs,function(err,obj){ if(err){ console.log(err); }else{ console.log(obj); } }); 

我的直觉是,这与接收JSON时需要处理XML有关,但是我不能一辈子知道如何发送XML或者让Solr接受JSON。 有什么build议?

我已经看到了solr-node-client的一些代码,我发现为了添加一个文档,他们使用了这个函数Client.prototype.add,这个函数最终使用这个handler

 this.UPDATE_JSON_HANDLER = (versionUtils.version(this.options.solrVersion) >= versionUtils.Solr4_0) ? 'update' : 'update/json'; 

这意味着如果你使用大于或等于4的Solr版本,那么在Solrconfig.xml文件中就存在一个名为update的请求处理程序。

  <requestHandler name="/update" class="solr.UpdateRequestHandler"> </requestHandler> 

一个统一的更新请求处理程序支持XML,CSV,JSON和javabin更新请求,根据ContentStream的Content-Type委托给相应的ContentStreamLoader。

看看这里https://cwiki.apache.org/confluence/display/solr/Uploading+Data+with+Index+Handlers#UploadingDatawithIndexHandlers-JSONFormattedIndexUpdates

Node包中的代码发送json,因此Solr将委托给相应的ContentStreamLoader。 这是Node包中的代码

'content-type':'application / json; 字符集= UTF-8' ,

如果你使用的Solr小于版本4,那么在你的solrconfig.xml中你应该有这样的请求处理程序

 <requestHandler name="/update/json" class="solr.JsonUpdateRequestHandler"> <lst name="defaults"> <str name="stream.contentType">application/json</str> </lst> </requestHandler> 

所以,简单来说,确保如果你使用Solr> = 4,那么在solrconfig.xml中你必须有一个更新请求处理程序

  <requestHandler name="/update" class="solr.UpdateRequestHandler"> </requestHandler> 

如果你使用Solr <4,那么确保你有一个像这样的更新处理程序

 <requestHandler name="/update/json" class="solr.JsonUpdateRequestHandler"> <lst name="defaults"> <str name="stream.contentType">application/json</str> </lst> </requestHandler> 

希望这可以帮助

可能是由于没有CFX库。 请参阅: http : //cxf.apache.org/