Elasticsearch `function_score` с путаницей` score_mode` при использовании с вложенными объектами - PullRequest
1 голос
/ 08 мая 2020

Фон:

У меня есть следующее сопоставление для curriculum_posts документов. Обратите внимание на вложенное свойство skills.

{
  "curriculum_posts" : {
    "mappings" : {
      "dynamic" : "false",
      "properties" : {
        "title" : {
          "type" : "text",
          "analyzer" : "english"
        },
        "skills" : {
          "type" : "nested",
          "properties" : {
            "slug" : {
              "type" : "text",
              "fields" : {
                "raw" : {
                  "type" : "keyword"
                },
                "text" : {
                  "type" : "text"
                }
              }
            },
            "start_skill_level" : {
              "type" : "keyword"
            },
            "start_skill_level_value" : {
              "type" : "integer"
            }
          }
        }
      }
    }
  }
}

Пример записи выглядит следующим образом:

{
  "_source" : {
    "skills" : [
      {
        "start_skill_level_value" : 1,
        "slug" : "infrastructure-as-code-iac"
      },
      {
        "start_skill_level_value" : 1,
        "slug" : "devops"
      }
    ],
    "title" : "Terraform: Infrastructure as code"
  }
}

Я хотел запустить запрос, который возвращает все документы, но с оценками, соответствующими количеству skills.slug совпавших значений. Мой запрос выглядит так:

{
  "query": {
    "nested": {
      "path": "skills",
      "query": {
        "function_score": {
          "query": { "match_all": {} },
          "functions": [
            { "script_score": { "script": "0" } },
            { 
              "filter": { 
                "term": { "skills.slug.raw": { "value": "devops" } }
              },  
              "weight": 2
            },
            { 
              "filter": { 
                "term": { "skills.slug.raw": { "value": "infrastructure-as-code-iac" } }
              },  
              "weight": 2
            }
          ],
          "score_mode": "sum",
          "boost_mode": "replace"
        }
      }
    }
  }
}

Я решил использовать function_score с boost_mode: replace, чтобы оценки из документов игнорировались, а брались только оценки функций. score_mode: sum для обеспечения суммирования баллов по функциям.

Проблема

Итак, для приведенного выше запроса в приведенном выше примере документа я был ожидал, что оценка будет 4.0, потому что он соответствует skills.slug как для infrastructure-as-code-iac, так и devops. Однако у меня оценка в результате составляет всего 2.0 для документа.

Вопрос

Полагаю, я не понимаю, как function_score берет баллы из функций или как мои функции влияют на оценку. Может ли кто-нибудь помочь мне понять здесь подсчет очков?

Некоторая отладка

Я просмотрел объяснение, но я не могу расшифровать из него много информации. Тем не менее, вот объяснение:

{
  "_index" : "curriculum_posts",
  "_type" : "_doc",
  "_id" : "18",
  "matched" : true,
  "explanation" : {
    "value" : 2.0,
    "description" : "Score based on 2 child docs in range from 83 to 93, best match:",
    "details" : [
      {
        "value" : 2.0,
        "description" : "sum of:",
        "details" : [
          {
            "value" : 2.0,
            "description" : "min of:",
            "details" : [
              {
                "value" : 2.0,
                "description" : "function score, score mode [sum]",
                "details" : [
                  {
                    "value" : 0.0,
                    "description" : "script score function, computed with script:\"Script{type=inline, lang='painless', idOrCode='0', options={}, params={}}\"",
                    "details" : [
                      {
                        "value" : 1.0,
                        "description" : "_score: ",
                        "details" : [
                          {
                            "value" : 1.0,
                            "description" : "*:*",
                            "details" : [ ]
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "value" : 2.0,
                    "description" : "function score, product of:",
                    "details" : [
                      {
                        "value" : 1.0,
                        "description" : "match filter: skills.slug.raw:infrastructure-as-code-iac",
                        "details" : [ ]
                      },
                      {
                        "value" : 2.0,
                        "description" : "product of:",
                        "details" : [
                          {
                            "value" : 1.0,
                            "description" : "constant score 1.0 - no function provided",
                            "details" : [ ]
                          },
                          {
                            "value" : 2.0,
                            "description" : "weight",
                            "details" : [ ]
                          }
                        ]
                      }
                    ]
                  }
                ]
              },
              {
                "value" : 3.4028235E38,
                "description" : "maxBoost",
                "details" : [ ]
              }
            ]
          },
          {
            "value" : 0.0,
            "description" : "match on required clause, product of:",
            "details" : [
              {
                "value" : 0.0,
                "description" : "# clause",
                "details" : [ ]
              },
              {
                "value" : 1.0,
                "description" : "_type:__skills",
                "details" : [ ]
              }
            ]
          }
        ]
      }
    ]
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...