当我需要文档的属性只匹配一个值时,我有一个工作正常的查询.
但是我还需要能够使用两个值搜索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参数.看看这个文档页面.
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的答案不起作用,因为您可能会被分析为文本。
这将是
{
"from": 0,
"size": 20,
"query": {
"bool": {
"should": [{
"match": {
"color": "yellow"
}
}],
"must": [{
"terms": {
"id.keyword": ["1", "2"]
}
}]
}
}
}
Run Code Online (Sandbox Code Playgroud)
所以我想说接受的答案将返回错误的结果请使用 @Rahul 的答案和相应的映射。
除了匹配查询,您还可以尝试在多个字词之间进行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)
| 归档时间: |
|
| 查看次数: |
28924 次 |
| 最近记录: |