我有一个查询,当我需要文档的属性时工作正常 只匹配一个值。
但是我还需要能够使用两个值搜索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搜索两个值的方法。 那可能吗?
答案 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或文本内进行搜索时使用匹配查询结果来获取准确的text
或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的答案无效,因为您可能会被分析为文本。
应该是
{
"from": 0,
"size": 20,
"query": {
"bool": {
"should": [{
"match": {
"color": "yellow"
}
}],
"must": [{
"terms": {
"id.keyword": ["1", "2"]
}
}]
}
}
}
所以我想说被接受的答案将返回错误的结果。请使用@Rahul的答案以及相应的映射。