使用Firebase Flashlight和Elastic Search匹配多个字段

时间:2015-11-25 13:22:57

标签: elasticsearch firebase

我正在使用Firebase Flashlight来查询我的Firebase数据库。

以下是我在Firebase中构建数据的方式:

posts: {
  id: {  
   "address": "",
   "id": "",
   "name": "",
   "review": "",
   "summary": "",
  }, id: {...}
}, 
users: {
   uid: {
    "username": "",
    "name": "",
   }, uid: {...}
}

这就是我在Flashlight Node应用程序中设置config.js的方式:

exports.paths = [
   {
      path:  "users",
      index: "firebase",
      type:  "user",
      fields: ["username", "name"]
   },{
      path: "posts",
      index: "firebase",
      type: "post",
      fields: ["id","name","summary","review", "address"]
   }
];

我可以通过发送一个简单的查询字符串来轻松搜索用户,该字符串将搜索用户的用户名和用户名并返回该用户的uid。

我希望能够遍历一个post id数组(基本上只是一个查询循环),并查看是否有任何其他字段(地址,名称,评论,摘要)与指定的关键字匹配,还有通配符。

因此搜索必须与帖子ID匹配,并且必须匹配关键字以寻址或命名或审核或摘要。

这是我尝试的查询,但我不知道如何进行OR:

var query = {
  'query': {
    'bool': {
      'must': [
        {'match': {'name': 'duck'}},
        {'match': {'review': 'duck'}},
        {'match': {'summary': 'duck'}},
        {'match': {'address': 'duck'}},
        {'match': {'id': '-K1kiCqGWfM-29pi9wdC'}}
      ]
    }
  }
};

如何形成一个查询,检查id是否与id字段匹配,且该关键字是否与其他任何字段匹配?

2 个答案:

答案 0 :(得分:0)

这将是原始的JSON查询,但它应该适合您:

{
  "query": {
    "bool": {
      "must": [
        {"match": {"id": "-K1kiCqGWfM-29pi9wdC"}},
        {
          "bool": {
            "should": [
              {"match": {"name": "duck"}},
              {"match": {"review": "duck"}},
              {"match": {"summary": "duck"}},
              {"match": {"address": "duck"}}
            ]
          }
        }
      ]
    }
  }
}

在Elasticsearch中should代表OR条件。

请注意,我创建了嵌套的bool查询。如果那将是SQL,它看起来会像这样:

SELECT *
FROM Document
WHERE id = '-K1kiCqGWfM-29pi9wdC'
  AND (
    address = 'duck'
    OR NAME = 'duck'
    OR review = 'duck'
    OR summary = 'duck'
    );

答案 1 :(得分:0)

我使用了以下内容:

$('#toggle').click(function() {
  $('#dropdown').slideToggle();
  $('#opt-slide').toggleClass('open');
  $('#sign #s1').toggleClass('close1');
  $('#sign #s2').toggleClass('close2');

});

$('#dropdown > li').click(function() {
  $('#dropdown').slideUp();
  $('#opt-slide').removeClass('open');
});

感谢Evaldas Buinauskas让我指向了正确的方向。