如何清除(取消筛选器)elasticSearch中的筛选查询

问题描述:

GET /Spotafood/Restaurants/_search 
{ 
"query": { 
    "match": { 
     "name": "Pizza" 
    } 
} 
, "filter": { 
    "and": { 
     "filters": [ 
      { 
       "term": { 
       "Location": "New Jersey" 
       } 
      } , 
      { 
       "term": { 
       "Cusines": "Pizza" 
      } 
      } ,{ 
       "numeric_range": { 
       "rating": { 
        "from": 1, 
        "to": 5 
       } 
       } 
      } 
     ] 
    } 
} 
} 

我已经创建了一些如上的筛选器。假设我不想过滤位置(即包含所有位置的结果),是否可以使用任何通配符实现而不重写Query?如何清除(取消筛选器)elasticSearch中的筛选查询

+0

你试过了一个通配符吗?发生了什么? – mconlin

+0

我试过“*”和“”,但它没有帮助。有什么建议么? – Sharath

+0

您可以使用匹配所有过滤器(“过滤器”:{ “match_all”:{} }),但我猜你希望保持结构相同并留在“术语”中:{“location”。 ..部分? – mconlin

最好的方法是使用AndFIlterBuilder并使用add()方法创建动态查询。

public static SearchSourceBuilder search(SearchParams params) { 



Map<String, String> map = new HashMap<String, String>(); 
map = params.getParametermapping(); 

SearchSourceBuilder searchsourcequerybuilder = new SearchSourceBuilder(); 


AndFilterBuilder finalfilter = FilterBuilders.andFilter(); 
TermsFacetBuilder locationfacet = null; 

for (Map.Entry<String, String> entry : map.entrySet()) { 
    if (entry.getKey().equalsIgnoreCase("querystring")) { 
    if (entry.getValue().length() == 0) { 
     searchSourceBuilder = searchSourceBuilder.query(
      QueryBuilders.matchAllQuery()).sort(
       SortBuilders.fieldSort("rating").order(SortOrder.DESC)); 

    } else { 

     searchsourcequerybuilder = searchsourcequerybuilder 
      .query(QueryBuilders.fuzzyLikeThisQuery("name") 
       .likeText(entry.getValue())); 
    } 
    } 
    if (entry.getKey().equalsIgnoreCase("locationName")) { 
    if (entry.getValue().length() == 0) { 
     System.out.println("location Filter is nulll"); 
     locationfacet = FacetBuilders.termsFacet("locationName") 
      .field("locationName").size(20); 

    } else { 
     locationfacet = FacetBuilders 
      .termsFacet("locationName") 
      .facetFilter(
       FilterBuilders.termFilter("locationName", 
        entry.getValue())) 
        .field("locationName").size(20); 
     finalfilter = finalfilter.add(FilterBuilders.termFilter(
      "locationName", entry.getValue())); 
    } 
    } 
    if (entry.getKey().equalsIgnoreCase("dinein")) { 
    if (entry.getValue().length() == 0) { 
     System.out.println("Dine in Filter Disabled"); 
    } else { 
     finalfilter = finalfilter.add(FilterBuilders.termFilter(
      "dinein", entry.getValue())); 
    } 
    } 
    if (entry.getKey().equalsIgnoreCase("rating")) { 
    if (entry.getValue().length() == 0) { 

     System.out.println("Rating Filter Disabled"); 
    } else { 
     finalfilter = finalfilter.add(FilterBuilders 
      .numericRangeFilter("rating") 
      .from(entry.getValue()).to("5")); 

    } 
    } 
    if (entry.getKey().equalsIgnoreCase("barAvailable")) { 
    if (entry.getValue().length() == 0) { 
     System.out.println("barAvailable Filter Disabled"); 

    } else { 
     finalfilter = finalfilter.add(FilterBuilders.termFilter(
      "barAvailable", entry.getValue())); 

    } 
    } 
} 

searchsourcequerybuilder = searchsourcequerybuilder.filter(finalfilter) 
    .facet(locationfacet); 
System.out.println(searchsourcequerybuilder.toString()); 
return searchsourcequerybuilder; 
} 

} 
+0

'SearchSourceBuilder'在ES 1.1.1中没有函数'filter' 。它只允许您添加后期过滤器。 – zengr