簡體   English   中英

2個查詢過濾器在ElasticSearch中不起作用,Java

[英]2 filters with query not working in elasticSearch, java

這是我的舊代碼,可以正常工作

qb = QueryBuilders.queryString(query.replaceAll(" ", " OR ").replaceAll(",", " AND ").replaceAll("!", " NOT "));
FilterBuilder fb = FilterBuilders.andFilter(FilterBuilders.rangeFilter("Experiance").from(smonth).to(emonth));
 FilteredQueryBuilder fqBuilder = QueryBuilders.filteredQuery(qb, fb);

org.elasticsearch.action.search.SearchResponse searchHits =  node.client()
                .prepareSearch(name)                
                .setQuery(fqBuilder)

在這段代碼中,我正在搜索在月和月之間經歷過的數據。

現在,我需要在搜索中添加更多過濾器,因此我轉到“ NativeSearchQueryBuilder”。 修改后,我寫這段代碼:

qb = QueryBuilders.queryString(query.replaceAll(" ", " OR ").replaceAll(",", " AND ").replaceAll("!", " NOT "));
FilterBuilder fb = FilterBuilders.andFilter(FilterBuilders.rangeFilter("Experiance").from(smonth).to(emonth));
NativeSearchQueryBuilder builder = new NativeSearchQueryBuilder();
        builder.withQuery(qb);
        AndFilterBuilder filters = null;
        filters = new AndFilterBuilder(fb);
       filters.add(FilterBuilders.andFilter(FilterBuilders.boolFilter().must(FilterBuilders.termFilter("providedZipcode", zipcode))));  //third filter
        builder.withFilter(filters);


org.elasticsearch.action.search.SearchResponse searchHits =  node.client()
                .prepareSearch(name)                
                .setQuery(builder.build().getQuery());

但是,當我搜索然后篩選器不起作用。 我沒有根據經驗和郵政編碼獲得數據。

得到它了。

我們可以使用setPostFilter

https://www.elastic.co/guide/en/elasticsearch/client/java-api/current/search.html

org.elasticsearch.action.search.SearchResponse searchHits =  node.client()
                .prepareSearch(name)
              //  .setIndices(name)
                 .setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
                .setQuery(fqBuilder)
                .setPostFilter(FilterBuilders.andFilter(FilterBuilders.boolFilter().must(FilterBuilders.termFilter("providedZipcode", zipcode))));  // Filter

但是我還有另一個問題。 如果我沒有通過郵政編碼,則不會顯示數據。 如果我不通過任何郵政編碼,我想獲取所有數據。

您看起來實際上會從使用布爾過濾器中受益,除了查詢字符串外,還具有兩個條件。 我們將搜索所有希望與providedZipcode smonth匹配但肯定具有從smonthemonth經驗的emonth 在我的回答中,我使用了bool過濾器來實現此邏輯。

上述答案中的“發布過濾器”並不是您真正想要的功能。 它使用原始查詢執行您的請求,然后通過第二個過濾器過濾該原始查詢的結果。

這是我寫您的請求的方式:

QueryStringQueryBuilder qb = QueryBuilders.queryString(query
                                                .replaceAll(" ", " OR ")
                                                .replaceAll(",", " AND ")
                                                .replaceAll("!", " NOT "));

FilterBuilder fb = FilterBuilders.boolFilter()
            .should(FilterBuilders.termFilter("providedZipcode", zipcode))
            .must(FilterBuilders.rangeFilter("Experiance").from(smonth).to(emonth));


FilteredQueryBuilder fqb = new FilteredQueryBuilder(qb, fb);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM