如何清除(取消筛选器)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中的筛选查询
答
最好的方法是使用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
你试过了一个通配符吗?发生了什么? – mconlin
我试过“*”和“”,但它没有帮助。有什么建议么? – Sharath
您可以使用匹配所有过滤器(“过滤器”:{ “match_all”:{} }),但我猜你希望保持结构相同并留在“术语”中:{“location”。 ..部分? – mconlin