1

我想对字符串“user”进行全文搜索,该字符串可以匹配我文档中的任何字段,然后应用过滤器,以便我只获得 x 字段值为“abc”或“xyz”的记录。

摆弄 Sense ,以下请求满足我的要求。

GET _search
{
   "query":{
      "filtered":{
         "query":{
             "query_string": {
                 "query": "user"
         }
         },
         "filter":
             [

                    {"term": { "x": "abc"}},
                     {"term": { "x": "xyz"}}              
            ]    
      }
   }
}

但是,我想要一个 java api 来做上面的事情。我已经搜索了弹性文档和 SO,但没有找到我正在寻找的东西,因为 QueryBuilders.filteredQuery 之类的 api 似乎已被弃用。我目前使用的是 2.3.4,但可以升级。

4

1 回答 1

0

Elasticsearch 2.x java Api 没有过滤查询的实现。根据 elasticsearch 文档,他们建议使用 bool 查询来代替查询的 must 子句和过滤器的 filter 子句。

在 java 中,您可以创建一个方法来为过滤后的查询创建一个包装器方法。这就像:

   public static QueryBuilder filteredQuery(QueryBuilder query, QueryBuilder filter){
        BoolQueryBuilder filteredQuery = QueryBuilders.boolQuery().must(query);
        return filteredQuery.filter(filter);

    }

在哪里,

QueryBuilder query = QueryBuilders.queryStringQuery("user");
QueryBuilder filter = QueryBuilders.boolQuery().filter(QueryBuilders.boolQuery().should(QueryBuilders.termsQuery("x", "abc", "xyz")));

此查询等效于上述查询。希望这可以帮助

于 2016-11-08T07:04:10.203 回答