2012-07-18 100 views
0

我对该范围,文本和排序的查询。当我使用范围与种类或文字与排序它的工作原理,但是当我尝试使用所有这三个在一起,它抛出一个错误:ElasticSearch查询问题

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

我不知道为什么它不工作的错误不是很清楚。我使用jsonlint.com检查了JSON并且它是有效的。我不能使用文本和范围查询的组合吗?

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

回答

0

使用了一个像这样的布尔查询,它的工作。

{ 
    "query": { 
     "bool": { 
      "must": {  
       "range": { 
        "UpdateTime": { 
         "from": "20120601T000000", 
         "to": "20120630T235959" 
        } 
       }     
      }, 
      "must_not": { 
       "text": { 
        "Content": "fight" 
       } 
      } 
     } 
    } 
} 
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"} }] 
} 

使用过滤器会影响面的计算方法。请参阅Filter弹性搜索文档的页面以获取更详细的信息

+0

将日期用作过滤器似乎在阅读后更有意义。如果我没有错,在日期和条件以及bool值的情况下,使用过滤器比查询更快? – Gabbar 2012-07-18 15:22:00

+0

它可能会更快。筛选器不参与评分(这可能与您的情况无关,因为您按日期排序)并将其缓存。如果您在几次查询中重复使用此过滤器,可能会有所帮助。 – imotov 2012-07-18 16:24:24