ElasticSearch:执行简单的IN查询

时间:2014-04-11 03:06:44

标签: elasticsearch

我是ElasticSearch的新手,试图学习它。

在常规的RDBM中,我可以执行" in"声明如下:

 select * from results where mycal in ['abc', 'def', 'ghi'] and col2 in ['er', 'es', 'et']

我如何在elasticsearch中执行此操作?

由于

2 个答案:

答案 0 :(得分:2)

很多将取决于您如何索引elasticsearch中的数据。但您可以使用terms filter来实现上述目标:

  {
   "filter": {
      "and": [
         {
            "terms": {
               "cal": [
                  "abc",
                  "def",
                  "ghi"
               ],
               "execution": "or"
            }
         },
         {
            "terms": {
               "col2": [
                  "er",
                  "es",
                  "et"
               ],
               "execution": "or"
            }
         }
      ]
   }
}

答案 1 :(得分:2)

根据您是否需要filter or a query,您可以使用bool查询/过滤器或快捷terms查询/过滤器(两者都链接到查询,正如我所料这不会被缓存)。

当您使用多个字段时,您希望在其中使用bool terms查询:

{
  "query" : {
    "bool" : {
      "should" : [
        { "terms" : { "mycal" : [ "abc", "def", "ghi" ] } },
        { "terms" : { "col2" : [ "er", "es", "et" ] } }
      ],
      "minimum_should_match" : 2
    }
  }
}

默认情况下,"minimum_should_match"1,这会使上述查询成为OR

这假定文件如:

{ "mycal" : "abc", "col2" : "es" }
{ "mycal" : "def", "col2" : "er" }

如果您的字段嵌套在对象中(例如{ "key" : { "mycal" : "abc" } }),那么您只需访问它们"key.mycal"

重要的是你如何进行映射。默认情况下,您的字符串将以全部小写进行分析和存储,因此您需要使用全部小写的term(s)查询进行搜索。如果您想查找"ABC",那么您仍然寻找"abc"。但是,如果您使用了其他内容,例如match而不是term(s),那么您无需将其全部放在小写中:

{
  "query" : {
    "bool" : {
      "should" : [
        { "match" : { "mycal" : "ABC" } },
        { "match" : { "mycal" : "DEF" } },
        { "match" : { "mycal" : "GHI" } },
        { "match" : { "col2" : "ER" } },
        { "match" : { "col2" : "ES" } },
        { "match" : { "col2" : "ET" } }
      ],
      "minimum_should_match" : 2
    }
  }
}