【问题标题】:Elasticsearch query match multiple values to single fieldElasticsearch 查询将多个值匹配到单个字段
【发布时间】:2020-08-09 09:06:28
【问题描述】:

尝试为字段 ABC 获取匹配值 X1Y1 的文档。尝试了 mustshould 查询,但没有得到预期的结果。有人可以建议我应该尝试什么样的查询吗?使用HighLevelRestClient

{
  "bool" : {
    "must" : [
      {
        "term" : {
          "ABC" : {
            "value" : "X1",
            "boost" : 1.0
          }
        }
      },
      {
        "term" : {
          "ABC" : {
            "value" : "Y1",
            "boost" : 1.0
          }
        }
      }
    ]
  }
}

{
  "bool" : {
    "should" : [
      {
        "term" : {
          "ABC" : {
            "value" : "X1",
            "boost" : 1.0
          }
        }
      },
      {
        "term" : {
          "ABC" : {
            "value" : "Y1",
            "boost" : 1.0
          }
        }
      }
    ]
  }
}

映射


{
  "mappings": {
    "properties": {
      "ABC": {
        "type": "text",
        "fields": {
          "keyword": {
            "type": "keyword",
            "ignore_above": 2
          }
        }
      },


mustNot 条件工作正常。如果我只是反转条件并忽略字段值,那么我会得到结果。

X1 和 Y1 是精确的字段值(想想枚举)

BoolQueryBuilder x = QueryBuilders.boolQuery();
for (SomeEnum enum : enums) { 
   x.should(QueryBuilders.termQuery("ABC",enum.name());
}

仍然查询返回所有文档。这应该已将文档过滤为匹配值

示例文档


{
  "_index": "some_index",
  "_type": "_doc",
  "_id": "uyeuyeuryweoyqweo",
  "_score": 1.0,
  "_source": {
    "A": true
    "ABC": "X1"
    "WS": "E"
  }
}, 
{
  "_index" : "some_index",
  "_type" : "_doc",
  "_id" : "uyeuyeuryweoyqweo1",
  "_score" : 1.0,
  "_source" : {
    "A" : true,
    "ABC" : "Y1",
    "WS" : "MMM"
  }
}


【问题讨论】:

  • 您能否展示您的映射、示例文档和预期输出?
  • 添加了更多上下文

标签: elasticsearch elasticsearch-rest-client


【解决方案1】:

由于您没有提供映射,可能的原因是搜索时间标记与索引标记不匹配。

当您使用term 查询时,未按照doc 中的说明进行分析

返回在提供的字段中包含确切术语的文档。

这意味着您在索引中的文档必须包含确切的标记为 X1Y1 并且如果这些字段是 text 字段并且您没有定义任何分析器,则 elasticsearch 使用 standard 分析器 lowercases标记,因此在索引 x1y1 中将被存储并且没有任何匹配。

编辑:据怀疑,问题是由于在 text 字段上使用了 term 查询,下面的查询将给出预期的结果

{
  "bool" : {
    "should" : [
      {
        "term" : {
          "ABC.keyword" : {
            "value" : "X1",
            "boost" : 1.0
          }
        }
      },
      {
        "term" : {
          "ABC.keyword" : {
            "value" : "Y1",
            "boost" : 1.0
          }
        }
      }
    ]
  }
}

【讨论】:

  • 我添加了映射
  • @java_dude 知道了,您只需要在查询中使用shouldABC.keyword 即可获得预期的输出:)
  • 使用 should 时结果返回所有文档。添加了rest客户端代码
  • @java_dude,你能展示你的样本和预期的文档吗?您需要同时存在 X1 和 Y1 还是任何一个都足够?
  • 文档可以有。需要在字段中选择所有匹配值的文档。添加示例文档
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-10
  • 1970-01-01
  • 1970-01-01
  • 2021-08-18
  • 1970-01-01
相关资源
最近更新 更多