_score при выполнении индексации вasticsearch

0
{
  "query": {
    "custom_score": {
      "query": {
        "match": {
          "xxx": {
            "query": "foobar"
          }
        }
      },
      "filter": {
        "and": [
          {
            "query": {
              "match": {
                "yyyy": {
                  "query": "barfoo"
                }
              }
            }
          }
        ]
      }
    },
    "script": "_score * doc['_score']"
  }
}

Это дает ошибку

 [custom_score] query does not support [filter]

Затем, как оценить такой запрос?

Теги:
elasticsearch

1 ответ

1
Лучший ответ

Я бы посоветовал вам взглянуть на ваши требования относительно повышения, поскольку ваш текущий script не имеет большого смысла.

Кроме того, посмотрите документацию по запросу elasticsearch DSL. Он предоставляет как сложные запросы, так и простые, которые вы можете комбинировать. Как говорится в ошибке, вы не можете поместить фильтр в пользовательский запрос оценки. Вы можете использовать отфильтрованный запрос в пользовательском запросе оценки:

{
  "query": {
    "custom_score": {
      "query": {
        "filtered" : {
          "query" : {
            "match": {
              "xxx": {
                "query": "foobar"
              }
            }
          },
          "filter" : {
            "and": [
              {
                "query": {
                  "match": {
                    "yyyy": {
                      "query": "barfoo"
                    }
                  }
                }
              }
            ]
          }
        }
      },
      "script": "_score * doc['_score']"
    }
  }
}

или используйте верхний уровень filter следующим образом:

{
  "query": {
    "custom_score": {
      "query": {
        "match": {
          "xxx": {
            "query": "foobar"
          }
        }
      },
      "script": "_score * doc['_score']"
    }
  },
  "filter": {
    "and": [
      {
        "query": {
          "match": {
            "yyyy": {
              "query": "barfoo"
            }
          }
        }
      }
    ]
  }
}

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

Еще одна вещь, на которую нужно обратить внимание: вам не нужен фильтр и фильтр, если у вас есть только одно предложение. Кроме того, обычно нет смысла размещать полнотекстовый поиск в фильтре, поскольку фильтры кэшируемы и при условии, что полнотекстовые поиски бесплатны и в значительной степени непредсказуемы, это было бы потерей для их кеширования.

  • 0
    Свойство «script» должно быть в скобках свойства «custom_score», а не за его пределами. Спасибо за ваши различные примеры в SO, очень помогли.
  • 0
    Спасибо @TedAvery за указание на это, я отредактировал свой ответ.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню