我正在尝试使用多匹配查询,如下所示。对于某些字段,我希望在该字段中找到所有关键字,但对于其他一些字段,至少应找到 1 个关键字。据此,我想使用 must 和 should 组合 2 个多匹配查询。
"from": 0,
"size": 10,
"explain": true,
"query": {
"bool": {
"must": [
{
"multi_match": {
"type": "best_fields",
"query": "hp 301",
"fields": [
"MPN^9",
"SKU^8"
]
}
}
],
"should": [
{"multi_match": {
"type": "best_fields",
"query": "hp 301",
"fields": [
"Name.raw2^7.5",
"Name^7",
"Description^6"
]
}}
]
}
}
如果我理解正确,MPN 和 SKU 必须仅在 hp 和 301 时匹配,两者都可以在字段中找到,但是当我分析评分时,我在下面看到了这一点。
产品具有:"MPN":"CF 301 A"
对此的解释:
"_explanation": {
"value": 2.0636692,
"description": "sum of:",
"details": [
{
"value": 1.0522164,
"description": "max of:",
"details": [
{
"value": 1.0522164,
"description": "product of:",
"details": [
{
"value": 2.1044328,
"description": "sum of:",
"details": [
{
"value": 2.1044328,
"description": "weight(MPN:301 in 375) [PerFieldSimilarity], result of:",
"details": [
{
"value": 2.1044328,
"description": "score(doc=375,freq=1.0), product of:",
"details": [
{
"value": 0.45506343,
"description": "queryWeight, product of:",
"details": [
{
"value": 9,
"description": "boost",
"details": []
},
{
"value": 9.248965,
"description": "idf(docFreq=2, maxDocs=11471)",
"details": []
},
{
"value": 0.0054668393,
"description": "queryNorm",
"details": []
}
]
},
如果 MPN 字段中只有 301,为什么 MPN 会返回分数?它不需要"hp"也存在于现场吗?如果不是,我怎样才能使其完全匹配?
对于多重匹配查询,搜索词默认解析为单独的单词,如果这些单词中的任何一个匹配,则整个查询将匹配。要打破此默认行为,您需要做的是添加"and"运算符,以便它知道仅在找到两个术语时才匹配。
"from": 0,
"size": 10,
"explain": true,
"query": {
"bool": {
"must": [
{
"multi_match": {
"type": "best_fields",
"query": "hp 301",
"fields": [
"MPN^9",
"SKU^8"
],
"operator": "and"
}
}
],
"should": [
{"multi_match": {
"type": "best_fields",
"query": "hp 301",
"fields": [
"Name.raw2^7.5",
"Name^7",
"Description^6"
]
}}
]
}
}
希望对您有所帮助!