【问题标题】:ElasticSearch Java API multiple filter is not working properlyElasticSearch Java API 多重过滤器无法正常工作
【发布时间】: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-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 过滤器不起作用。其余过滤器工作正常。

【问题讨论】:

  • 您的查询结果如何?
  • @briarheart - 我已经更新了我在问题中的结果
  • @Karthikeyan 请分享映射。
  • @Richa - 我更新了我的映射详细信息。
  • @Karthikeyan 我认为这是“语言环境”类型问题

标签: java elasticsearch elastic-stack


【解决方案1】:
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);

【讨论】:

  • 它给出空(null)结果。 ` QueryBuilder filters=QueryBuilders.boolQuery() .filter(QueryBuilders.termQuery("locale", "en_US")) .filter(QueryBuilders.termQuery("attr_label", "long_description")) .filter(QueryBuilders.termQuery("attr_label “, “描述”)); QueryBuilder qb = QueryBuilders.boolQuery() .must(QueryBuilders.matchQuery("code", code)) .filter(filters); `
  • 只有locale 过滤器不工作。其余的工作正常。
猜你喜欢
  • 2013-09-15
  • 2016-10-22
  • 2015-07-19
  • 2014-08-07
  • 1970-01-01
  • 2015-02-14
  • 2013-08-16
相关资源
最近更新 更多