Рассчитать пользовательский счет на основе function_score с ElasticSearch - PullRequest
0 голосов
/ 17 октября 2019

Я пытаюсь реализовать пользовательскую оценку в запросе ElasticSearch.

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

У меня есть объект Item с несколькимиполя:

  • types (ключевое слово): список типов
  • themes (ключевое слово): список типов
  • location:местонахождение предмета

Мой запрос состоит из:

  • Сначала нацеливается на подмножество предметов. Элементы, которые имеют TYPE1, но не имеют TYPE2 и TYPE3, например
  • Вторые определяющие правила для подсчета очков. Элементы с TYPE4 должны быть увеличены на 2. Элементы с THEME1 должны быть увеличены на 3. Элементы в указанном многоугольнике должны быть увеличены на 4.

Вот запрос, который я пробовал:

{
  "from": 0,
  "size": 10,
  "query": {
    "function_score": {
      "boost": 1,
      "boost_mode": "multiply",
      "query": {
        "bool": {
          "filter": [
            {
              "term": {
                "types": {
                  "value": "TYPE1"
                }
              }
            },
            {
              "not": {
                "filter": {
                  "term": {
                    "types": {
                      "value": [
                        "TYPE2",
                        "TYPE3"
                      ]
                    }
                  }
                }
              }
            }
          ]
        }
      },
      "functions": [
        {
          "filter": {
            "term": {
              "themes": "THEME1"
            }
          },
          "weight": 3
        },
        {
          "filter": {
            "term": {
              "types": "TYPE4"
            }
          },
          "weight": 2
        },
        {
          "filter": {
            "geo_polygon": {
              "location": {
                "points": [ ... ]
              }
            }
          },
          "weight": 4
        }
      ]
    }
  },
  "sort": [
    "_score"
  ]
}

По этому запросу я получил эту ошибку:

"type": "parsing_exception",
"reason": "no [query] registered for [not]",

Так что я думаю, что проблема на уровне блока not ...

Если я удалю этот блок, запрос будет успешным, но результаты не будут ожидаемыми (значение 0 для всех).

Я включил режим explain и вижу:

"_explanation": {
    "value": 0,
    "description": "function score, product of:",
    "details": [
      {
        "value": 0,
        "description": "ConstantScore(types:TYPE1)^0.0",
        "details": []
      },
      {
        "value": 1,
        "description": "min of:",
        "details": [
          {
            "value": 1,
            "description": "No function matched",
            "details": []
          },
          {
            "value": 3.4028235e+38,
            "description": "maxBoost",
            "details": []
          }
        ]
      }
    ]

Итак, мои вопросы:

  • Как использовать блок not для этого запроса?
  • Как рассчитать оценку на основе function_score?

Спасибо за помощь, Тьерри

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...