【问题标题】:Elasticsearch 2+ JAVA API orFilterElasticsearch 2+ JAVA API 或过滤器
【发布时间】:2017-07-31 02:18:12
【问题描述】:

我正在尝试编写一些 Java 代码来查询 ES5 实例。在 ES1 中,您可以 OR 和 AND 过滤器,或者过滤器和 andFilter。 ES5 中的等价物是什么?我试过了——

QueryBuilder fb1 = QueryBuilders.termQuery("term1", "value1");
QueryBuilder fb2 = QueryBuilders.termQuery("term1", "value2");
QueryBuilder fb3 = QueryBuilders.termQuery("term2", "value3");

QueryBuilder fb = QueryBuilders.boolQuery()
                        .must(fb1)
                        .should(fb2)

This gives results that match fb1, so this is not an OR

QueryBuilder fb = QueryBuilders.boolQuery()
                        .must(fb1)
                        .must(fb2)

This gives no results, so the AND worked.

我想弄清楚构建 AND、OR 查询的方法

【问题讨论】:

    标签: java elasticsearch filtering


    【解决方案1】:

    为了进行 AND 查询,请将所有条件放入“必须”中。

    QueryBuilder fb = QueryBuilders.boolQuery().must(fb1).must(fb2);
    

    为了进行 OR 查询,请将所有条件放入“应该”中。

    QueryBuilder fb = QueryBuilders.boolQuery().should(fb1).should(fb2);
    

    【讨论】:

      【解决方案2】:

      您可以将 BoolQueryBuiler 用于这些过滤器:

      BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery().must(QueryBuilders.termQuery("customerId", customerId))

      boolQueryBuilder.mustNot(QueryBuilders.termsQuery("reason", "failed"));

                          boolQueryBuilder.should(QueryBuilders.termsQuery("action", "deny")).minimumNumberShouldMatch(1);
      

      QueryBuilder queryBuilder=boolQueryBuilder;

      new SearchContext().prepareSearch(sc.getIndexNames()).setTypes(sc.getTypeName()).setSearchType(SearchType.DFS_QUERY_THEN_FETCH).setQuery(queryBuilder);

      【讨论】:

      • 我不确定我是否理解上述内容。您如何实现 OR 查询?
      • 使用 minimumNumberShouldMatch(1) --> 您可以添加多个 should 过滤器,如果您将 minimumNumberShouldMatch 设置为一个,它至少会尝试匹配其中一个过滤器。
      【解决方案3】:

      来自 ElasticSearch 文档 (https://www.elastic.co/guide/en/elasticsearch/client/java-api/current/java-compound-queries.html):

      QueryBuilder qb = boolQuery()
          .must(termQuery("content", "test1"))    
          .must(termQuery("content", "test4"))    
          .mustNot(termQuery("content", "test2")) 
          .should(termQuery("content", "test3"))  
          .filter(termQuery("content", "test5")); 
      

      必须看起来它可能等同于 AND,并且应该看起来等同于 OR。

      【讨论】:

      • 什么不起作用?您可以发布您正在尝试的内容吗?
      • QueryBuilder fb = QueryBuilders.boolQuery() .should(fb1) .should(fb2) 得到或
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-03-02
      • 1970-01-01
      • 2017-08-19
      • 2014-10-09
      • 2023-04-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多