2016-02-23 102 views
2

我有一个查询,当我需要文件 的属性只匹配一个值时,工作正常。必须匹配多个值

但是我也需要能够搜索必须与两个值。

所以,如果一个香蕉有ID 1和一个柠檬有ID 2,我搜索黄色 如果我在must子句中有1和2,我将得到两者。 但是,如果我只有1我只会得到香蕉。

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

我还没有找到一种方法来搜索带有必须的两个值。 是可能的吗?

回答

2

如果文档“必须”仅在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查询一个单独的布尔查询should子句。这可以实现您正在查找的OR行为。

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

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

+0

氏似乎这样的伎俩,谢谢:) – dontberude

+0

@dontberude很高兴我能帮忙。 :)如果您有机会,请考虑接受我的答案,以便其他具有类似问题的StackOverflow用户也可以从中受益。 – BrookeB

2

而不是匹配查询,您可以简单地尝试在多个术语之间查询OR

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

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