gpt4 book ai didi

Elasticsearch 查询将多个值匹配到单个字段

转载 作者:行者123 更新时间:2023-12-02 23:08:04 24 4
gpt4 key购买 nike

尝试为字段 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"
}
}


最佳答案

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

因为您使用的是未按 doc 中所述进行分析的 term 查询

Returns documents that contain an exact term in a provided field.

这意味着您在索引中的文档必须包含与 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
}
}
}
]
}
}

关于Elasticsearch 查询将多个值匹配到单个字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63324468/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com