elasticsearch 必须匹配多个值,elasticsearch,elasticsearch" /> elasticsearch 必须匹配多个值,elasticsearch,elasticsearch" />

elasticsearch 必须匹配多个值

elasticsearch 必须匹配多个值,elasticsearch,elasticsearch,当我需要文档的属性时,我有一个可以正常工作的查询 只匹配一个值 然而,我还需要能够搜索必须有两个值 所以如果一个香蕉的id为1,一个柠檬的id为2,我会搜索黄色 如果必须条款中有1和2,我将同时得到这两个。 但是如果我只有一个,我就只能得到香蕉 { "from": 0, "size": 20, "query": { "bool": { "should": [ { "match": { "fruit.color": "yellow" }}

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

然而,我还需要能够搜索必须有两个值

所以如果一个香蕉的id为1,一个柠檬的id为2,我会搜索黄色 如果必须条款中有1和2,我将同时得到这两个。 但是如果我只有一个,我就只能得到香蕉

{
  "from": 0, 
  "size": 20,
  "query": {
  "bool": {
    "should": [
      { "match": 
        { "fruit.color":  "yellow" }}
    ],
    "must" : [ 
      { "match": { "fruit.id" : "1" } }
    ]
  }
 } 
}
我还没有找到一种方法来搜索两个必须的值。 这可能吗?

如果仅当id为1或2时才返回文档“必须”,这听起来像是另一个
应该
子句。如果我正确理解了您的问题,您需要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
子句中。这将实现您正在寻找的目标或行为

再看一看,并注意
should
的细微差别。默认情况下,它的行为有所不同,这取决于是否存在同级
must
子句,以及是否在筛选器上下文中执行bool查询


另一个可调整并可帮助您实现预期结果的关键选项是
minimum\u should\u match
参数

代替匹配查询,您可以简单地尝试对
进行
查询或在多个术语之间进行
匹配

匹配查询通常用于
分析的
字段。要进行精确匹配,应使用术语查询

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

术语或术语查询是获取准确的
文本
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"
                        }
                    }
                }
            }
        }
    }
}
使用@Rahul的答案不起作用,因为你可能会被分析为一个文本

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

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

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

@dontberude很高兴我能提供帮助。:)如果你有机会,考虑接受我的回答,让其他有类似问题的StAccess用户也能从中受益。谢谢老兄!一直在寻找一种在同一字段上实现多个
必须
的方法。非常感谢!我花了很长时间试图将
应该
包含在与
必须
相同的级别上,但失败了。取决于映射,如果设置正确,它会工作,否则不会返回结果。您可能会将字段作为文本进行分析。需要将其作为关键字进行分析。