elasticsearch 如何在elasticSearch中清除(取消选中筛选器)filterred查询
我已经创建了一些如上所述的过滤器。假设如果我不想过滤位置(即,包括来自所有位置的结果),是否可以在不重写查询的情况下使用任何通配符实现 最好的方法是使用AndFIlterBuilder并使用add()方法来创建动态查询elasticsearch 如何在elasticSearch中清除(取消选中筛选器)filterred查询,elasticsearch,filter,elasticsearch,Filter,我已经创建了一些如上所述的过滤器。假设如果我不想过滤位置(即,包括来自所有位置的结果),是否可以在不重写查询的情况下使用任何通配符实现 最好的方法是使用AndFIlterBuilder并使用add()方法来创建动态查询 GET /Spotafood/Restaurants/_search { "query": { "match": { "name": "Pizza" } } , "filter": { "and": { "filters": [
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
}
}
}
]
}
}
}
publicstaticsearchsourcebuilder搜索(SearchParams-params){
Map Map=newhashmap();
map=params.getParametermapping();
SearchSourceBuilder searchsourcequerybuilder=新的SearchSourceBuilder();
AndFilterBuilder finalfilter=FilterBuilders.andFilter();
TermsFacetBuilder locationfacet=null;
对于(Map.Entry:Map.entrySet()){
if(entry.getKey().equalsIgnoreCase(“querystring”)){
if(entry.getValue().length()==0){
searchSourceBuilder=searchSourceBuilder.query(
QueryBuilders.matchAllQuery()).sort(
SortBuilders.fieldSort(“评级”).order(SortOrder.DESC));
}否则{
searchsourcequerybuilder=searchsourcequerybuilder
.query(QueryBuilders.fuzzyLikeThisQuery(“名称”)
.likeText(entry.getValue());
}
}
if(entry.getKey().equalsIgnoreCase(“locationName”)){
if(entry.getValue().length()==0){
System.out.println(“位置过滤器为空”);
locationfacet=FaceBuilders.termsFacet(“locationName”)
.字段(“位置名称”)。大小(20);
}否则{
locationfacet=FacetBuilders
.termsFacet(“位置名称”)
.面过滤器(
FilterBuilders.termFilter(“locationName”,
entry.getValue())
.字段(“位置名称”)。大小(20);
finalfilter=finalfilter.add(FilterBuilders.termFilter(
“locationName”,entry.getValue());
}
}
if(entry.getKey().equalsIgnoreCase(“dinein”)){
if(entry.getValue().length()==0){
System.out.println(“禁用进餐过滤器”);
}否则{
finalfilter=finalfilter.add(FilterBuilders.termFilter(
“dinein”,entry.getValue());
}
}
if(entry.getKey().equalsIgnoreCase(“评级”)){
if(entry.getValue().length()==0){
System.out.println(“禁用分级过滤器”);
}否则{
finalfilter=finalfilter.add(FilterBuilders
.numericRangeFilter(“评级”)
.from(entry.getValue())到(“5”);
}
}
if(entry.getKey().equalsIgnoreCase(“barAvailable”)){
if(entry.getValue().length()==0){
System.out.println(“禁用可用过滤器”);
}否则{
finalfilter=finalfilter.add(FilterBuilders.termFilter(
“barAvailable”,entry.getValue());
}
}
}
searchsourcequerybuilder=searchsourcequerybuilder.filter(finalfilter)
.面(位置面);
System.out.println(searchsourcequerybuilder.toString());
返回searchsourcequerybuilder;
}
}
您尝试过通配符吗?发生什么事了?我试过“*”和“。但没用。有什么建议吗?您可以使用match all筛选器(“筛选器”:{“match_all”:{}),但我猜您希望保持结构不变,并保留在“term”:{“location”中…部分?是的,我想保留这种结构,因为如果我有多个过滤器,有时会出现类似于启用其他过滤器的情况。因此,我猜,匹配所有过滤器都不会有帮助。您是否无法更改查询,只需根据需要添加/删除过滤器?SearchSourceBuilder
在ES 1.1.1中没有功能filter
。它打开了ly允许您添加后期过滤器。
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;
}
}