[英]ElasticSearch Java API multiple filter is not working properly
我已为Oracle表建立索引,并且尝试使用过滤器进行查询。
我的Oracle表:
id code Attr_Label locale Value
1002 TE-7002 description en_US temperature valve
1002 TE-7002 description en_ES temperature valve
1002 TE-7002 Longdescription en_US High Temperture Valve
1002 TE-7002 Longdescription en_ES High Temperture Valve
1002 TE-7002 description en_EU High Temperture Valve tube
从该表中,我使用code : TE-7002
和locale : en_US
,我期望输出作为description
值和Longdescription
值(它应该是en_US
语言环境)。
我正在尝试使用多个过滤器API,但无法正常工作。
input query : `code : TE-7002` & `locale : en_US`
我期望输出如下:
code : TE-7002
long_description : High Temperture Valve
description : temperature valve
请找到我的Java API代码:
QueryBuilder qb = QueryBuilders.boolQuery()
.must(QueryBuilders.matchQuery("code", code))
.filter(QueryBuilders.termQuery("locale", "en_US"))
.filter(QueryBuilders.termQuery("attr_label", "long_description"))
.filter(QueryBuilders.termQuery("attr_label", "description"));
对于上面的查询,我已经空了(没有结果)。
但是,如果我的查询如下所示:
QueryBuilder qb = QueryBuilders.boolQuery()
.filter(QueryBuilders.termQuery("attr_label", "long_description"))
我得到的结果不满足locale:en_US
条件,例如:
code : TE-7002
long_description : HighTemperature Valve
请找到我的映射详细信息:
PUT products
{
"settings": {
"analysis": {
"analyzer": {
"custom_analyzer": {
"type": "custom",
"tokenizer": "whitespace",
"char_filter": [
"html_strip"
],
"filter": [
"lowercase",
"asciifolding"
]
}
}
}
},
"mappings": {
"doc": {
"properties": {
"code": {
"type": "text",
"analyzer": "custom_analyzer"
},
"id": {
"type": "long"
},
"attr_label":{
"type":"text"
},
"locale":{
"type":"text"
},
"value":{
"type":"text"
}
}
}
}
}
更新资料
我可以使用滤镜对多个值进行filters
。 修改后的工作代码为:
QueryBuilder qb = QueryBuilders.boolQuery()
.must(QueryBuilders.matchQuery("code", code))
.filter(QueryBuilders.termsQuery("attr_label", "long_description", "description"));
它给了我预期的结果。
现在,我必须在上面添加一个条件(过滤器)。
QueryBuilder qb = QueryBuilders.boolQuery()
.must(QueryBuilders.matchQuery("code", code))
.filter(QueryBuilders.termsQuery("attr_label", "long_description", "description"))
.filter(QueryBuilders.termQuery("locale", "en_US")); // If I add this line it's giving `null` result.
我已经测试了多次。,只有locale
过滤器无法正常工作。 其余的过滤器工作正常。
QueryBuilder qb = QueryBuilders.boolQuery()
.must(QueryBuilders.matchQuery("code", code))
.filter(QueryBuilders.termQuery("locale", "en_US"))
.filter(QueryBuilders.termQuery("attr_label", "long_description"))
.filter(QueryBuilders.termQuery("attr_label", "description"));
您必须将此处使用的字词查询包装到单个boolQuery中,并将其用作过滤器。 或多或少是这样的:
QueryBuilder filters=QueryBuilders.boolQuery();
//add your filters here
QueryBuilder qb = QueryBuilders.boolQuery()
.must(QueryBuilders.matchQuery("code", code))
.filter(fitlers);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.