0

我有这个查询,其中包含范围、文本和排序。当我将范围与排序或文本与排序一起使用时,它可以工作,但是当我尝试将所有三个一起使用时,它会引发错误:

“解析失败:无法解析源”

我不确定为什么它不起作用,因为错误不是很清楚。我使用 jsonlint.com 检查了 JSON,它是有效的。我可以不使用文本和范围查询的组合吗?

{
   "query" : {       
       "text" : {
          "Content" : "fight"
       },
       "range" : {
         "UpdateTime" : {
            "from" : "20120601T000000",
            "to" : "20120630T235959"
         }
       }        
    },
    "sort" : [{ "UpdateTime" : {"order" : "desc"} }]
}
4

2 回答 2

4

查询元素内部只能包含一个查询。如果您想通过范围和文本来限制搜索,您需要将这两个查询组合成一个查询,或者将其中一个用作查询,另一个用作过滤器。

使用布尔查询组合这两个查询将如下所示:

{
    "query" : {       
        "bool" : {
            "must" : [
                {
                    "text" : {
                        "Content" : "fight"
                    }                    
                },
                {
                    "range" : {
                        "UpdateTime" : {
                            "from" : "20120601T000000",
                            "to" : "20120630T235959"
                        }
                    }
                }
            ]
        }
    },
    "sort" : [{ "UpdateTime" : {"order" : "desc"} }]
}'

使用过滤器它看起来像这样:

{
    "query" : {       
        "text" : {
            "Content" : "fight"
        }                    
    },
    "filter" : {
        "range" : {
            "UpdateTime" : {
                "from" : "20120601T000000",
                "to" : "20120630T235959"
            }
        }
    },
    "sort" : [{ "UpdateTime" : {"order" : "desc"} }]
}

使用过滤器会影响构面的计算方式。有关详细信息,请参阅elasticsearch 文档的过滤器页面

于 2012-07-18T14:07:02.523 回答
0

使用这样的布尔查询并且它有效。

{
    "query": {
        "bool": {
            "must": {     
                "range": {
                    "UpdateTime": {
                        "from": "20120601T000000",
                        "to": "20120630T235959"
                    }
                }                
            },
            "must_not": { 
               "text": {
                    "Content": "fight"
                }
           }
        }
    }
}
于 2012-07-18T14:06:53.833 回答