【问题标题】:Elastic Search SQL Equivalent弹性搜索 SQL 等效项
【发布时间】:2017-05-25 23:46:42
【问题描述】:

我在使用 elasticsearch 进行查询时遇到了一些问题。所以基本上我想知道elasticsearch的sql等价物。

这个 sql 查询的等效 elasticsearch 语法是什么?

SELECT * 
FROM   people 
WHERE  name LIKE( $name% ) 
       AND ( gender = 0 OR age < 18 ) 
       AND id IN( 1, 2, 3 ) 
       AND id NOT IN( 4, 5, 6 ) 
       AND dead = 0 
ORDER  BY status desc, 
          TIME desc 

* 只是举例

【问题讨论】:

    标签: mysql sql search elasticsearch lucene


    【解决方案1】:

    使用布尔查询(和嵌套布尔查询)允许您表达与 sql 请求相同的内容。 术语查询在找到其元素之一时进行验证 (OR)。

    POST /index_name/people/_search

    {
       "query": {
          "bool": {
             "must": [
                {
                   "match": {
                      "name": "John"
                   }
                }
             ],
             "filter": [
                {
                   "bool": {
                      "must": [
                         {
                            "terms": {
                               "id": [
                                  1,
                                  2,
                                  3
                               ]
                            }
                         },
                         {
                            "term": {
                               "dead": 0
                            }
                         },
                         {
                            "bool": {
                               "should": [
                                  {
                                     "term": {
                                        "gender": 0
                                     }
                                  },
                                  {
                                     "range": {
                                        "age": {
                                           "lt": 18
                                        }
                                     }
                                  }
                               ]
                            }
                         }
                      ],
                      "must_not": [
                         {
                            "terms": {
                               "id": [
                                  4,
                                  5,
                                  6
                               ]
                            }
                         }
                      ]
                   }
                }
             ]
          }
       },
       "sort": [
          {
             "status": {
                "order": "desc"
             },
             "time": {
                "order": "desc"
             }
          }
       ]
    }
    

    【讨论】:

    • elastic.co/guide/en/elasticsearch/reference/2.3/…: " 子句(查询)应该出现在匹配的文档中。在没有 must 或 filter 子句的布尔查询中,一个或多个 should 子句必须与文档匹配。可以使用 minimum_should_match 参数设置要匹配的 should 子句。"对不起,我已经编辑了我的答案,因为“应该”应该用来表达 OR!
    猜你喜欢
    • 1970-01-01
    • 2020-04-12
    • 2021-11-23
    • 1970-01-01
    • 2015-05-31
    • 2018-10-26
    • 1970-01-01
    • 2021-08-30
    • 1970-01-01
    相关资源
    最近更新 更多