elasticsearch Elasticsearch:为什么Java客户端使用不同的查询语法?,elasticsearch,elasticsearch" /> elasticsearch Elasticsearch:为什么Java客户端使用不同的查询语法?,elasticsearch,elasticsearch" />

elasticsearch Elasticsearch:为什么Java客户端使用不同的查询语法?

elasticsearch Elasticsearch:为什么Java客户端使用不同的查询语法?,elasticsearch,elasticsearch,我不熟悉Elasticsearch。我有以下疑问: { "query": { "filtered" : { "query" : { "term" : { "title" : "crime" } }, "filter" : { "term" : { "year" : 1

我不熟悉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 }
            }
        }

}
为什么会有这样的差异?如何保留已删除的“查询”属性?假设我必须在Java客户端中使用查询字符串


感谢并问候!

严格地说,您显示的两个变体并不相同:您不在基于URI的查询中指定类型、偏移量或大小参数(即使您也可以在基于URI的查询中这样做,根据的)。您也可以在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(); 

Ashalynd,非常感谢您的帮助!您从哪里获得String.join方法?您使用的查询变量包含的查询字符串与我在Windows prompt中使用的查询字符串不同。我可以在Java客户端中使用与Windows prompt中完全相同的查询字符串吗?为什么我必须删除所示的“query”(也显示在您的theQuery中)?外部“query”指定了一个查询部分,不需要它,因为该方法已经被称为setQuery。关于String.join:它是Java8。如果您不能使用它,您可以查看Apache中的StringUtils,那里有类似的功能,或者guava库。