【问题标题】:Default value for Elasticsearch queryElasticsearch 查询的默认值
【发布时间】:2020-09-02 12:38:20
【问题描述】:

我正在用烧瓶和 Elasticsearch 做一个项目。用户通过 url 将查询参数传递给 elasticsearch 以执行搜索。我目前有两个字段:短语和日期。

@app.route('/search')
def get_search_article():

  phrase = request.args.get('phrase')
  from_date = request.args.get('from')
  to_date = request.args.get('to')

doc = {
          "query": {
            "bool": {
              "must": [
                {
                  "match": {
                    "title": phrase
                  }
                }
              ],
              "filter": [
                {
                  "range": {
                    "pubDate": {
                      "gte": from_date + ' 00:00:00',
                      "lte": to_date + ' 23:59:59'
                    }
                  }
                }
              ]
            }
          }
        }

我想知道有没有办法,如果用户没有通过url传递值,例如短语的url,elasticsearch查询可以遍历所有标题值。我实现的解决方案是使用 ifs 检查值是否已填充,并对每个 if 进行不同的查询。但是当我为查询实现更多参数时,代码变得非常大。

【问题讨论】:

标签: python elasticsearch flask


【解决方案1】:

解决此问题的一种方法是声明一个最低限度的查询并根据您收到的输入参数填充它。例如,

from_date = request.args.get('from')
to_date = request.args.get('to')

doc = {
          "query": {
            "bool": {
              "must": [

              ],
              "filter": [
                {
                  "range": {
                    "pubDate": {
                      "gte": from_date + ' 00:00:00',
                      "lte": to_date + ' 23:59:59'
                    }
                  }
                }
              ]
            }
          }
        }


phrase = request.args.get('phrase')
if phrase is not None:
    doc['query']['bool']['must'].append(
        {
            "match": {
                "title": phrase
            } 
        }
    ) 

您现在可以执行文档查询了。

【讨论】:

    猜你喜欢
    • 2014-02-04
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 2015-07-12
    • 2015-08-26
    • 1970-01-01
    • 1970-01-01
    • 2017-01-17
    相关资源
    最近更新 更多