ElasticSearch Java API多重筛选器工作不正常
我已经为我的Oracle表编制了索引,我正在尝试使用过滤器进行查询 我的Oracle表:ElasticSearch Java API多重筛选器工作不正常,java,
elasticsearch,elastic-stack,Java,
elasticsearch,Elastic Stack,我已经为我的Oracle表编制了索引,我正在尝试使用过滤器进行查询 我的Oracle表: id code Attr_Label locale Value 1002 TE-7002 description en_US temperature valve 1002 TE-7002 description en_ES temperature v
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
locale)
我正在尝试使用多过滤器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"
}
}
}
}
}
更新
我可以使用过滤器
对多个值进行过滤。修改后的工作代码为:
QueryBuilder qb = QueryBuilders.boolQuery()
.must(QueryBuilders.matchQuery("code", code))
.filter(QueryBuilders.termsQuery("attr_label", "long_description", "description"));
它给了我预期的结果
现在,我必须在它上面再添加一个条件(过滤器)
我已经对它进行了多次测试,只有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);
您的查询结果是什么?@briarheart-我已在question@Karthikeyan请共享映射。@Richa-我已经更新了映射的详细信息。@Karthikeyan我认为是'locale'类型的issuesIts给出了空(null)结果。`QueryBuilder filters=QueryBuilders.boolQuery().filter(QueryBuilders.termQuery(“locale”,“en_US”)).filter(QueryBuilders.termQuery(“attr_标签”,“long_描述”))).filter(QueryBuilders.termQuery(“attr_标签”,“description”));QueryBuilder qb=QueryBuilders.boolQuery().must(QueryBuilders.matchQuery(“code”,code)).filter(filters)`只有
locale
过滤器不工作,其余工作正常。
QueryBuilder filters=QueryBuilders.boolQuery();
//add your filters here
QueryBuilder qb = QueryBuilders.boolQuery()
.must(QueryBuilders.matchQuery("code", code))
.filter(fitlers);