java - ElasticSearch Java API 多重过滤器无法正常工作
问题描述
我已经为我的 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
Value 和Longdescription
Value(它应该是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);
推荐阅读
- javascript - mat-form-field 选择按钮背景颜色适用于所有 div 而不是按钮
- javascript - 如何使用 javascript 或 jquery 获取实际的 svg 填充属性
- java - 无法使用模型映射器从 POJO 的字符串表示形式映射到另一个 POJO
- javascript - start-giveaway ... `start` 未定义
- c# - C# AutoMapper 映射多对多的问题,错误的外键
- sparql - Anzograph SPARQL 问题
- java - 策略模式@Service 重复组件名的两种用法
- rust - 如何在 Rust 库中包含图像文件
- c++ - 为内核设置参数非常慢(OpenCL)
- html - 用户提交的带有 http:// url 的图像导致浏览器警告该页面不安全