【问题标题】:How query Firebase with ElasticSearch and Flashlight?如何使用 ElasticSearch 和 Flashlight 查询 Firebase?
【发布时间】:2016-05-02 19:37:30
【问题描述】:

当我将 Flashlight 与 Firebase 和 Elastic 搜索一起使用时,它确实有效:

查询

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

代码

...
Map<String,String> 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<String, String> q = new HashMap<>();
q.put("query", "rose");
qs = new HashMap<>();
qs.put("query_string", q);


Map<String, Object> options = new HashMap<>();
options.put("from", 0);
options.put("to", 50);

HashMap<String, Object> 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);
...

我使用手电筒示例中提供的选项,并为选项添加部分:

"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参数

【问题讨论】:

  • 如果你使用qo.put("options", options);而不是qo.put("from", 0); qo.put("to", 50);,它有效吗?
  • @AndreiStefan 刚刚尝试过(符合安全规则)。请求的日志是::{"from":0,"index":"firebase","query":{"query_string":{"query":"*"}},"to":50,"type":"tasting"}but 它仍然返回不命中
  • 我知道我不是在证明一个解决方案,但是我怎样才能学习如何使用 FlashLight 以及我必须学习哪种语言,换句话说,您是如何知道如何将 FlashLight 与 Firebase 一起使用的

标签: java android elasticsearch firebase


【解决方案1】:

我原以为手电筒可以处理所有类型的弹性搜索查询。 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));
    }
},

【讨论】:

  • 您好,我无法理解 Flashlight,我正在使用 react native 开发应用程序。我是否将 Flashlight 克隆到我的项目中?还是我只是让一些文件在我的项目中使用?
猜你喜欢
  • 2017-03-06
  • 2017-02-04
  • 1970-01-01
  • 2016-09-24
  • 2019-12-19
  • 1970-01-01
  • 2019-11-17
  • 2019-05-28
  • 2020-08-27
相关资源
最近更新 更多