【发布时间】:2023-04-02 20:43:01
【问题描述】:
我已经为我的 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 过滤器不起作用。其余过滤器工作正常。
【问题讨论】:
-
您的查询结果如何?
-
@briarheart - 我已经更新了我在问题中的结果
-
@Karthikeyan 请分享映射。
-
@Richa - 我更新了我的映射详细信息。
-
@Karthikeyan 我认为这是“语言环境”类型问题
标签: java elasticsearch elastic-stack