必须匹配多个值

don*_*ude 8 elasticsearch

当我需要文档的属性只匹配一个值时,我有一个工作正常的查询.

但是我还需要能够使用两个值搜索must.

因此,如果一个香蕉的id为1且一个柠檬的id为2并且我搜索黄色,那么如果我在must子句中有1和2,我将得到两者.但如果我只有1,我将只获得香蕉.

{
  "from": 0, 
  "size": 20,
  "query": {
  "bool": {
    "should": [
      { "match": 
        { "fruit.color":  "yellow" }}
    ],
    "must" : [ 
      { "match": { "fruit.id" : "1" } }
    ]
  }
 } 
}
Run Code Online (Sandbox Code Playgroud)

我还没有找到一种用must搜索两个值的方法.那可能吗?

Bro*_*keB 11

如果文件"必须"仅在id为1或2时返回,则听起来像另一个should子句.如果我正确理解你的问题,你需要id为1或id为2的文件.此外,如果颜色为黄色,则给它一个更高的分数.

这是您实现所需目标的一种方式:

{
  "query": {
    "bool": {
      "should": {
        "match": {
          "fruit.color": "yellow"
        }
      },
      "must": {
        "bool": {
          "should": [
            {
              "match": {
                "fruit.id": "1"
              }
            },
            {
              "match": {
                "fruit.id": "2"
              }
            }
          ]
        }
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

在这里,我将两个match查询放在should一个单独的bool查询的子句中.这实现了您正在寻找的OR行为.

再看一下Bool Query文档并注意其中的细微差别should.默认情况下,它的行为会有所不同,具体取决于是否存在sibling must子句以及bool查询是否在过滤器上下文中执行.

另一个可调节的关键选项是帮助您实现预期结果的minimum_should_match参数.看看这个文档页面.


dev*_*svd 9

term 或 terms 查询是获取精确textor的完美方式id,在 id 或文本内的搜索中使用匹配查询结果

例如:id = '4' id = '44'

使用 id = 4 的匹配查询进行搜索会返回 4 和 44,因为它与两者都匹配 4。这就是术语查询发挥作用的地方。使用术语查询进行相同的搜索将仅返回 4。

所以所接受的绝对是错误的。使用@Rahul 的答案。您还需要做一件事,您需要将字段作为关键字进行分析,而不是文本

将字段索引为文本和关键字的示例(映射用于嵌套的平面级别,相应地更改它)

{
    "index_patterns": [ "test" ],
    "mappings": {
        "kb_mapping_doc": {
            "_source": {
                "enabled": true
            },
            "properties": {
                "id": {
                    "type": "text",
                    "fields": {
                        "keyword": {
                            "type": "keyword"
                        }
                    }
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

使用@Rahul的答案不起作用,因为您可能会被分析为文本。

  • id - 访问文本字段
  • id.keyword - 访问关键字字段

这将是

{
    "from": 0,
    "size": 20,
    "query": {
        "bool": {
            "should": [{
                "match": {
                    "color": "yellow"
                }
            }],
            "must": [{
                "terms": {
                    "id.keyword": ["1", "2"]
                }
            }]
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

所以我想说接受的答案将返回错误的结果请使用 @Rahul 的答案和相应的映射。


Rah*_*hul 8

除了匹配查询,您还可以尝试在多个字词之间进行terms查询OR

匹配查询通常用于analyzed字段。为了精确匹配,您应该使用term queries

{
  "from": 0, 
  "size": 20,
  "query": {
    "bool": {
      "should": [
        { "match": { "fruit.color": "yellow" } }
      ],
      "must" : [ 
        { "terms": { "fruit.id": ["1","2"] } }
      ]
    }
  } 
}
Run Code Online (Sandbox Code Playgroud)