簡體   English   中英

Elasticsearch - 如何將范圍過濾器添加到搜索查詢

[英]Elasticsearch - How to add range filter to search query

我使用 elasticsearch -dsl來查詢 python 中的 Elasticsearch。
我想搜索帶有text字段的文檔並獲取所有created字段小於datetime.now()的文檔。
我執行以下查詢,但 elasticsearch 引發錯誤。

q = "some word"
es.search(
        index="comment",
        body={
            "query": {
                "query_string": {
                    "query": f"*{q}*" ,
                    "default_field": "text"
                },
                "range": {"created": {"lt": datetime.now()}}
            },
            "fields": ["id"],
            "size": 10
        },
    )

以下是 elasticsearch 錯誤:

elasticsearch.exceptions.RequestError: RequestError(400, 'parsing_exception', '[query_string] malformed query, expected [END_OBJECT] but found [FIELD_NAME]')

注意:當我評論"range": {"created": {"lt": datetime.now()}}時,查詢將正常工作(但不應用日期時間過濾器)。

您不能像這樣組合幾種類型的查詢,請使用bool

{
  "query": {
    "bool": {
      "must": [{"query_string": {"query": f"*{q}*" , "default_field": "text"}}],
      "filter": [{"range": {"created": {"lt": datetime.now()}}}]}
    }
  }
}

請注意,全文query_string子句進入must部分並被評分,而range過濾器進入filter並且 ES 不計算這些分數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM