必须匹配多个值

时间:2016-02-23 17:07:36

标签: 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" } }
    ]
  }
 } 
}

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

3 个答案:

答案 0 :(得分:5)

如果仅在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"
              }
            }
          ]
        }
      }
    }
  }
}

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

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

另一个可调整且可帮助您实现预期结果的关键选项是minimum_should_match参数。 Have a look at this documentation page

答案 1 :(得分:4)

您可以在多个字词之间terms查询OR,而不是匹配查询。

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

{
  "from": 0, 
  "size": 20,
  "query": {
    "bool": {
      "should": [
        { "match": { "fruit.color": "yellow" } }
      ],
      "must" : [ 
        { "terms": { "fruit.id": ["1","2"] } }
      ]
    }
  } 
}

答案 2 :(得分:1)

字词或字词查询是在ID或文本内进行搜索时使用匹配查询结果来获取准确的textid的完美方法

例如: 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"
                        }
                    }
                }
            }
        }
    }
}

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

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

应该是

{
    "from": 0,
    "size": 20,
    "query": {
        "bool": {
            "should": [{
                "match": {
                    "color": "yellow"
                }
            }],
            "must": [{
                "terms": {
                    "id.keyword": ["1", "2"]
                }
            }]
        }
    }
}

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