如何使用ElasticSearch和Flashlight查询Firebase?

当我使用带有Firebase的Flashlight和带有直接查询的弹性搜索时,它确实有效:

询问

{"index":"firebase","query":"rose","type":"tasting"} 

 ... Map q = new HashMap(); q.put("index", "firebase"); q.put("type", "tasting"); q.put("query", "rose"); String key = ref.child("request").push().getKey(); ref.child("request").child(key).setValue(q); ... 

但是当我想要不仅限于10个提示时,这个失败了(没有结果)

询问

 {"index":"firebase","options":{"from":0,"to":50},"query":{"query_string":{"query":"rose"}},"type":"tasting"} 

 ... HashMap q = new HashMap(); q.put("query", "rose"); qs = new HashMap(); qs.put("query_string", q); Map options = new HashMap(); options.put("from", 0); options.put("to", 50); HashMap qo = new HashMap(); qo.put("index", "firebase"); qo.put("type", "tasting"); qo.put("options", options); qo.put("query", a); String key = ref.child("request").push().getKey(); ref.child("request").child(key).setValue(q); ... 

我使用Flashlight示例中提供的选项,并添加部分选项:

 "search": { "request": { "$recid": { // I can only read records assigned to me ".read": "auth.id === data.child('id').val() || auth.uid === data.child('id').val()", // I can only write new records that don't exist yet ".write": "!data.exists() && (newData.child('id').val() === auth.id || newData.child('id').val() === auth.uid)", ".validate": "newData.hasChildren(['query', 'index', 'type'])", "index": { // accepts arrays or strings ".validate": "(newData.isString() && newData.val().length < 1000) || newData.hasChildren()", "$child": { ".validate": "newData.isString() && newData.val().length < 1000" } }, "type": { // accepts arrays or strings ".validate": "(newData.isString() && newData.val().length < 1000) || newData.hasChildren()", "$child": { ".validate": "newData.isString() && newData.val().length < 1000" } }, "query": { // structure of the query object is pretty open-ended ".validate": "newData.isString() || newData.hasChildren()" }, "$other": { ".validate": false } } }, "response": { "$recid": { // I can only read/write records assigned to me ".read": "auth.id === data.child('id').val() || auth.uid === data.child('id').val()", ".write": "auth.id === data.child('id').val() || auth.uid === data.child('id').val()", // Assumes that Flashlight will be writing the records using a secret or a token that has admin: true // The only thing a logged in user needs to do is delete results after reading them ".validate": false } } } 

为什么可以在https://github.com/firebase/flashlight/issues/29#issuecomment-129340229找到options参数

我期待手电筒可以处理所有类型的elasticsearch查询。 2解决方案:1 /它没有2 /我没找到怎么样!

在我这边,我不得不像这样更新Flashlight SearchQueue.js文件:

 _process: function (snap) { var dat = snap.val(); var key = snap.key(); // get your query string var q = dat.query.query_string.query; // build your ES query var q1 = {"query":{"match":{"_all":q}}}; if (this._assertValidSearch(key, dat)) { // Perform (a very simple) ElasticSearch query this.esc.search({ index: dat.index, type: dat.type, // add options from : dat.options.from, size : dat.options.size, // add ES Query body : q1 }, function (error, response) { if (error) { this._reply(key, {error: error, total: 0}); } else { this._reply(key, response); } }.bind(this)); } },