【发布时间】:2021-09-09 05:57:45
【问题描述】:
要搜索嵌套(或不嵌套)查询的相邻单词,解决方案如下(答案见here):
{
"query": {
"bool": {
"must": [
{
"nested": {
"path": "metadata",
"query": {
"bool": {
"must": [
{
"wildcard": {
"metadata.text": "*antonio*"
}
},
{
"wildcard": {
"metadata.text": "*banderas*"
}
}
]
}
}
}
}
]
}
}
}
这工作正常。但是,应该有多个嵌套字段,在其中以相同的方式搜索 *antonio* *banderas*,假设现在我们有这个映射:
{
"mappings:": {
"properties": {
"text": {
"type": "text"
},
"metadata": {
"type": "nested",
"properties": {
"text": {
"type": "text"
}
}
},
"other_metadata": {
"type": "nested",
"properties": {
"text": {
"type": "text"
}
}
}
}
}
}
如果我想在metadata 和other_metadata 两个嵌套字段中搜索相邻的单词,我应该使用match 还是should?
我想要一个匹配至少一个模式元数据或其他元数据的结果,所以我想使用should并将minimum_should_match设置为查询的令牌数(由a分隔\s - 空格字符)这样:
{
"should": [{
"nested": {
"path": "metadata",
"query": {
"bool": {
"must": {
"wildcard": {
"metadata.text": "*antonio*"
}
}
}
},
"ignore_unmapped": true
}
},
{
"nested": {
"path": "metadata",
"query": {
"bool": {
"must": {
"wildcard": {
"metadata.text": "*banderas*"
}
}
}
},
"ignore_unmapped": true
}
},
{
"nested": {
"path": "other_metadata",
"query": {
"bool": {
"must": {
"wildcard": {
"other_metadata.text": "*antonio*"
}
}
}
},
"ignore_unmapped": true
}
},
{
"nested": {
"path": "other_metadata",
"query": {
"bool": {
"must": {
"wildcard": {
"other_metadata.text": "*banderas*"
}
}
}
},
"ignore_unmapped": true
}
}
],
"minimum_should_match": 2
}
这似乎可行,但我的疑问如下:这里的minimum_should_match=2 条件将确保这四个条件中至少有两个匹配,但不能保证这两个匹配条件都是与相同的模式相关(比如metadata 两个词*antonio* 和*banderas*。如果是这样,如何确保?也许使用must?但是如何?
【问题讨论】:
标签: elasticsearch elasticsearch-7