这是我索引中某个字段的映射:
"resourceId": {
"type": "string",
"index_analyzer": "partial_match",
"search_analyzer": "lowercase",
"include_in_all": true
}
以下是索引中使用的自定义分析器:
"analysis": {
"filter": {
"partial_match_filter": {
"type": "ngram",
"min_gram": 1,
"max_gram": 50
}
},
"analyzer": {
"partial_match": {
"type": "custom",
"tokenizer": "whitespace",
"filter": [
"lowercase",
"partial_match_filter"
]
},
"lowercase": {
"type": "custom",
"tokenizer": "whitespace",
"filter": [
"lowercase"
]
}
}
}
此字段将包含一个字符串数组,这些字符串是资源可以拥有的多个ID(由于不同的系统通过不同的id调用每个资源,因此它可以具有多个ID)。
现在让我们假设资源#1 有三个ID:
resourceId: [3]
0: "ID:MATCH"
1: "MATCH"
2: "ID:ALT"
资源#2 只有一个ID:
resourceId: [1]
0: "ID:MATCHFIVE"
让我们假设我们针对我的索引运行此查询:
{
"from": 0,
"size": 30,
"query": {
"query_string": {
"query": "resourceId:ID\\:MATCH"
}
}
}
我想要的是资源#1首先显示,因为它的数组包含完全匹配。 然而,资源#2是最重要的资源;
当我在查询请求中使用 explain 参数时,我看到 tf 和 idf 得分两个资源相同。 但是,资源#1的规范得分较低。
我的理论是,由于资源#1在数组中有三个项(我假设它们在索引期间连接在一起),因此该字段被认为更大,因此标准值减小。当涉及资源#2时,它只有一个项目(并且它比另一个数组的串联短),因此规范更高,将资源提升到顶部。
因此,我的问题是:在计算分数时,规范计算是否可以仅考虑数组中匹配项目的大小?
例如:搜索" ID:MATCH"会在resourceId [0]上的资源#1上找到完全匹配。此时,阵列中的所有其他项目将被放在一边, norm 将基于该单个项目(resourceId [0])计算,显示完美匹配。对于资源#2,规范会更低,因为resourceId字段会更大。
如果这是不可能的,是否会有解决方法与顶部完全匹配?或者我完全不理解我的理论?