繁体   English   中英

ElasticSearch Java API多重过滤器无法正常工作

[英]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-7002locale : 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM