2014-01-09 370 views
1
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

回答

0

最好的方法是使用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