我是Elasticsearch的新手。我有以下查询:
{
"query": {
"filtered" : {
"query" : {
"term" : {
"title" : "crime"
}
},
"filter" : {
"term" : { "year" : 1961 }
}
}
}
}
它在Windows提示符下运行正常,如下所示:
curl -XGET localhost:9200/book/_search?pretty -d @my-query.json
对于与Java客户端相同的查询,我有以下内容:
SearchResponse sr = client.prepareSearch("book")
.setTypes("fiction")
.setQuery(query_string)
.setFrom(page)
.setSize(10).execute().actionGet();
但是,我必须使用以下查询字符串才能毫无例外地运行它:
{
"filtered" : {
"query" : {
"term" : {
"title" : "crime"
}
},
"filter" : {
"term" : { "year" : 1961 }
}
}
}
为什么会有这样的差异?如何保留已删除的"查询"属性&#34 ;?假设我必须在我的Java客户端中使用查询字符串。
谢谢和问候!
答案 0 :(得分:1)
严格地说,您展示的两个变体不一样:您没有在基于URI的查询中指定类型,偏移或大小参数(即使您也可以在那里执行,根据docs)。您也可以在Java查询中省略这些参数:
SearchResponse sr = client.prepareSearch("book")
.setQuery(query_string)
.execute().actionGet();
关于setQuery的参数,它可以是与URI变体中相同的JSON:
String theQuery = String.join(System.getProperty("line.separator"),
"{\"filtered\" : {\"query\" : {\"term\" : {\"title\" : \"crime\"}},",
"\"filter\" : {\"term\" : { \"year\" : 1961 }}}}");
SearchResponse sr = client.prepareSearch("book")
.setTypes("fiction")
.setFrom(page)
.setQuery(queryString(theQuery)).execute().actionGet();
或者您可以使用Java方法提供此查询的模拟:
SearchResponse sr = client.prepareSearch("book")
.setTypes("fiction")
.setFrom(page)
.setQuery(filteredQuery(QueryBuilders.termQuery("title","crime"),
FilterBuilders.termFilter("year","1961")))
.execute().actionGet();