Elasti c Поиск Оценка Расчеты - PullRequest
1 голос
/ 27 апреля 2020

Я перехожу с 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, в результате чего получается другое ключевое слово с максимальным значением.

Может кто-нибудь помочь мне узнать, как мы можем получить одинаковые оценки?

1 Ответ

1 голос
/ 27 апреля 2020

В этих двух версиях есть несколько изменений, и главное - как рассчитывается оценка в ES 1.7 ( tf / idf ) и как она изменяется на BM25 в ES6.X.

Это также зависит от того, сколько шардов у вас есть в вашем индексе. поскольку подсчет баллов является локальным по отношению к шарду.

IMO, получить одинаковый балл в обеих этих версиях, даже после нескольких первичных шардов для огромного количества документов, может быть действительно сложно. то, к чему вы должны стремиться, это проверить порядок (ie, если тот же документ был в первой пятерке ранее, он все еще должен быть в первой пятерке или десятке, так что) существенно не изменился для тех же поисковых запросов.

...