elasticsearch,nosql,kibana,Java,elasticsearch,Nosql,Kibana" /> elasticsearch,nosql,kibana,Java,elasticsearch,Nosql,Kibana" />

Java 如何使用QueryStringQueryBuilder

Java 如何使用QueryStringQueryBuilder,java,elasticsearch,nosql,kibana,Java,elasticsearch,Nosql,Kibana,我曾尝试在一个非常简单的案例中使用QueryStringQueryBuilder,但我不明白为什么我得到的结果比我从Kibana得到的结果还要多。我做错了什么 基巴纳: GET .../_search { "query": { "query_string" : { "query" : "\"this is a query\"", "lenient": true, "default_operator":

我曾尝试在一个非常简单的案例中使用QueryStringQueryBuilder,但我不明白为什么我得到的结果比我从Kibana得到的结果还要多。我做错了什么

基巴纳:

GET .../_search
{
    "query": {
        "query_string" : {
            "query" : "\"this is a query\"",
            "lenient": true,
            "default_operator": "OR"
        }
    }
}
爪哇:

private可选语法查询(字符串查询){
if(query.equals(“”){
返回可选的.empty();
}
QueryStringQueryBuilder queryBuilder=QueryBuilders.queryStringQuery(查询);
queryBuilder。宽大(真实);
queryBuilder.defaultOperator(Operator.OR);
返回可选。of(queryBuilder);
}
kibana的结果:totalhits=3336。来自Java的结果:totalhits=10018

编辑: 此方法调用parseQuery。输入为“这是一个查询”

public可选getRequestBuilderByQuery(SearchQuery){
SearchRequestBuilder=getBuilderWithMaxHits(query.getMaxHits());
setFetchSource(Globals.getFIELDS(query.isIncludeStory()),新字符串[0]);
parseQuery(query.getQuery()).ifPresent(builder::setQuery);
返回可选。of(生成器);
}

我不知道本例中的输入参数“query”包含什么内容

但是我认为您需要在
QueryStringQueryBuilder
中设置
queryBuilder.queryName(字符串queryName)

从JavaDocs:

queryName(字符串queryName): 设置每次命中搜索匹配的\u筛选器时可使用的筛选器的查询名称

好的,我发现了问题。
对kibana的查询有引号。这意味着它的处理方式与普通字符串不同。QueryStringQuerybuilder似乎正在使用“”和或“”自行解析查询。这是魔术

两个示例中的查询相同。查询可以是:“this-that”或this-that,而不是this。但我开始只使用报价查询。我正在使用queryStringQueryBuilder,因为我认为它可能会用关键字和单独解析查询,或者parseQuery中的输入(在本例中)“这是一个查询”
private Optional<QueryStringQueryBuilder> parseQuery(String query) {
    if (query.equals("")) {
        return Optional.empty();
    }
    QueryStringQueryBuilder queryBuilder = QueryBuilders.queryStringQuery(query);
    queryBuilder.lenient(true);
    queryBuilder.defaultOperator(Operator.OR);
    return Optional.of(queryBuilder);
}
public Optional<SearchRequestBuilder> getRequestBuilderByQuery(SearchQuery query) {
        SearchRequestBuilder builder = getBuilderWithMaxHits(query.getMaxHits());
        builder.setFetchSource(Globals.getFIELDS(query.isIncludeStory()), new String[0]);
        parseQuery(query.getQuery()).ifPresent(builder::setQuery);
        return Optional.of(builder);
    }