Я перехожу с ES 1.7 на ES 6.5. Источники данных распространены, но когда я ищу какое-либо конкретное ключевое слово, оно возвращает разные баллы, в результате чего возвращается другой набор, так как выбран максимальный балл.
Я использовал ' _explain ' in elasti c, чтобы понять детали расчета оценки запроса. Я поделился запросом и объяснением одного и того же ключевого слова в обоих индексах.
Используемый запрос:
{
"explain": true,
"query": {
"function_score": {
"query": {
"match": {
"search": {
"query": "san"
}
}
},
"functions": [
{
"field_value_factor": {
"field": "related.score"
}
}
]
}
},
"from": 0,
"size": 1
}
Отображения для ES 1.7
{
"_id": {
"path": "search"
},
"properties": {
"related": {
"properties": {
"category": {
"type": "long"
},
"score": {
"type": "double"
},
"search": {
"type": "string"
}
}
},
"search": {
"type": "string",
"analyzer": "english"
}
}
}
Объяснение для запроса в ES 1.7:
{
"_explanation": {
"value": 4.83643,
"description": "function score, product of:",
"details": [
{
"value": 4.8384395,
"description": "weight(search:san in 11405) [PerFieldSimilarity], result of:",
"details": [
{
"value": 4.8384395,
"description": "fieldWeight in 11405, product of:",
"details": [
{
"value": 1,
"description": "tf(freq=1.0), with freq of:",
"details": [
{
"value": 1,
"description": "termFreq=1.0"
}
]
},
{
"value": 4.8384395,
"description": "idf(docFreq=1072, maxDocs=49844)"
},
{
"value": 1,
"description": "fieldNorm(doc=11405)"
}
]
}
]
},
{
"value": 0.99958473,
"description": "Math.min of",
"details": [
{
"value": 0.99958473,
"description": "field value function: (doc['related.score'].value * factor=1.0)"
},
{
"value": 3.4028235e+38,
"description": "maxBoost"
}
]
},
{
"value": 1,
"description": "queryBoost"
}
]
}
}
Отображения для ES 6.5
{
“mappings”: {
“searches”: {
“properties”: {
“related”: {
“properties”: {
“category”: {
“type”: “long”
},
“score”: {
“type”: “double”
},
“search”: {
“type”: “text”
}
}
},
“search”: {
“type”: “text”,
“analyzer”: “english”
}
}
}
}
Объяснение для Query в ES 6.5:
{
"_explanation": {
"value": 5.1439505,
"description": "function score, product of:",
"details": [
{
"value": 5.1460876,
"description": "weight(search:san in 2464) [PerFieldSimilarity], result of:",
"details": [
{
"value": 5.1460876,
"description": "score(doc=2464,freq=1.0 = termFreq=1.0\n), product of:",
"details": [
{
"value": 3.82669,
"description": "idf, computed as log(1 + (docCount - docFreq + 0.5) / (docFreq + 0.5)) from:",
"details": [
{
"value": 5419,
"description": "docFreq",
"details": []
},
{
"value": 248810,
"description": "docCount",
"details": []
}
]
},
{
"value": 1.3447882,
"description": "tfNorm, computed as (freq * (k1 + 1)) / (freq + k1 * (1 - b + b * fieldLength / avgFieldLength)) from:",
"details": [
{
"value": 1,
"description": "termFreq=1.0",
"details": []
},
{
"value": 1.2,
"description": "parameter k1",
"details": []
},
{
"value": 0.75,
"description": "parameter b",
"details": []
},
{
"value": 2.679008,
"description": "avgFieldLength",
"details": []
},
{
"value": 1,
"description": "fieldLength",
"details": []
}
]
}
]
}
]
},
{
"value": 0.99958473,
"description": "min of:",
"details": [
{
"value": 0.99958473,
"description": "field value function: none(doc['related.score'].value * factor=1.0)",
"details": []
},
{
"value": 3.4028235e+38,
"description": "maxBoost",
"details": []
}
]
}
]
}
}
Если мы посмотрим на оба варианта, расчет объяснения изменился по-разному в обеих версиях ES, что привело к разным оценкам. size = 1 в запросе, следовательно, он должен возвращать запись с максимальным счетом, но при изменении метода вычисления оценки он возвращает разные значения для одного и того же ключевого слова в ES 1.7 и ES 6.5, в результате чего получается другое ключевое слово с максимальным значением.
Может кто-нибудь помочь мне узнать, как мы можем получить одинаковые оценки?