首页 > 解决方案 > 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我期望输出为descriptionValue 和LongdescriptionValue(它应该是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过滤器不起作用。其余过滤器工作正常。

标签: javaelasticsearchelastic-stack

解决方案


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);

推荐阅读