Spec-Zone.ru › Elasticsearch 8
›Руководство по Elasticsearch [8.17] ›DSL запросов ›Специализированные запросы

Запрос по полю признака ранжирования

Увеличивает релевантность документов, основанную на числовом значении поля счёта релевантности типа rank_feature или rank_features.

Запрос типа rank_feature обычно используется в блоке should запроса bool, чтобы к его счётам релевантности добавились и другие счёты релевантности от запроса bool.

При установке positive_score_impact на значение false для поля типа rank_feature или rank_features, рекомендуется, чтобы каждый документ, участвующий в запросе, содержал значение для этого поля. В противном случае, если запрос rank_feature используется в блоке should, он не добавляет ничего к счёту релевантности документа с отсутствующим значением, но увеличивает счёт релевантности документа, содержащего признак. Это противоречит нашей цели — так как мы рассматриваем эти признаки как отрицательные, мы хотим ранжировать документы, содержащие их, ниже документов, в которых они отсутствуют.

В отличие от запроса function_score или других способов изменения счётов релевантности, запрос rank_feature эффективно пропускает неконкурентные совпадения, когда параметр track_total_hits не является true. Это может значительно улучшить скорость запроса.

Функции полей признаков ранжирования

Для вычисления счётов релевантности, основанных на полях признаков ранжирования, запрос rank_feature поддерживает следующие математические функции:

  • Насыщение
  • Логарифм
  • Сигмоида
  • Линейная

Если вы не знаете, с чего начать, мы рекомендуем использовать функцию saturation. Если функция не указана, запрос rank_feature по умолчанию использует функцию saturation.

Пример запроса

Настройка индекса

Для использования запроса rank_feature, ваш индекс должен включать сопоставление поля типа rank_feature или rank_features. Чтобы увидеть, как можно настроить индекс для запроса rank_feature, попробуйте следующий пример.

Создайте индекс test со следующими сопоставлениями полей:

  • pagerank, поле типа rank_feature, которое измеряет важность веб-сайта
  • url_length, поле типа rank_feature, которое содержит длину URL веб-сайта. В этом примере, длинный URL коррелирует отрицательно с релевантностью, указанной значением positive_score_impact равным false.
  • topics, поле типа rank_features, которое содержит список тем и меру того, насколько хорошо каждый документ связан с каждой из них
resp = client.indices.create(
    index="test",
    mappings={
        "properties": {
            "pagerank": {
                "type": "rank_feature"
            },
            "url_length": {
                "type": "rank_feature",
                "positive_score_impact": False
            },
            "topics": {
                "type": "rank_features"
            }
        }
    },
)
print(resp)
response = client.indices.create(
  index: 'test',
  body: {
    mappings: {
      properties: {
        pagerank: {
          type: 'rank_feature'
        },
        url_length: {
          type: 'rank_feature',
          positive_score_impact: false
        },
        topics: {
          type: 'rank_features'
        }
      }
    }
  }
)
puts response
const response = await client.indices.create({
  index: "test",
  mappings: {
    properties: {
      pagerank: {
        type: "rank_feature",
      },
      url_length: {
        type: "rank_feature",
        positive_score_impact: false,
      },
      topics: {
        type: "rank_features",
      },
    },
  },
});
console.log(response);
PUT /test
{
  "mappings": {
    "properties": {
      "pagerank": {
        "type": "rank_feature"
      },
      "url_length": {
        "type": "rank_feature",
        "positive_score_impact": false
      },
      "topics": {
        "type": "rank_features"
      }
    }
  }
}

Добавьте несколько документов в индекс test.

resp = client.index(
    index="test",
    id="1",
    refresh=True,
    document={
        "url": "https://en.wikipedia.org/wiki/2016_Summer_Olympics",
        "content": "Rio 2016",
        "pagerank": 50.3,
        "url_length": 42,
        "topics": {
            "sports": 50,
            "brazil": 30
        }
    },
)
print(resp)

resp1 = client.index(
    index="test",
    id="2",
    refresh=True,
    document={
        "url": "https://en.wikipedia.org/wiki/2016_Brazilian_Grand_Prix",
        "content": "Formula One motor race held on 13 November 2016",
        "pagerank": 50.3,
        "url_length": 47,
        "topics": {
            "sports": 35,
            "formula one": 65,
            "brazil": 20
        }
    },
)
print(resp1)

resp2 = client.index(
    index="test",
    id="3",
    refresh=True,
    document={
        "url": "https://en.wikipedia.org/wiki/Deadpool_(film)",
        "content": "Deadpool is a 2016 American superhero film",
        "pagerank": 50.3,
        "url_length": 37,
        "topics": {
            "movies": 60,
            "super hero": 65
        }
    },
)
print(resp2)
response = client.index(
  index: 'test',
  id: 1,
  refresh: true,
  body: {
    url: 'https://en.wikipedia.org/wiki/2016_Summer_Olympics',
    content: 'Rio 2016',
    pagerank: 50.3,
    url_length: 42,
    topics: {
      sports: 50,
      brazil: 30
    }
  }
)
puts response

response = client.index(
  index: 'test',
  id: 2,
  refresh: true,
  body: {
    url: 'https://en.wikipedia.org/wiki/2016_Brazilian_Grand_Prix',
    content: 'Formula One motor race held on 13 November 2016',
    pagerank: 50.3,
    url_length: 47,
    topics: {
      sports: 35,
      "formula one": 65,
      brazil: 20
    }
  }
)
puts response

response = client.index(
  index: 'test',
  id: 3,
  refresh: true,
  body: {
    url: 'https://en.wikipedia.org/wiki/Deadpool_(film)',
    content: 'Deadpool is a 2016 American superhero film',
    pagerank: 50.3,
    url_length: 37,
    topics: {
      movies: 60,
      "super hero": 65
    }
  }
)
puts response
const response = await client.index({
  index: "test",
  id: 1,
  refresh: "true",
  document: {
    url: "https://en.wikipedia.org/wiki/2016_Summer_Olympics",
    content: "Rio 2016",
    pagerank: 50.3,
    url_length: 42,
    topics: {
      sports: 50,
      brazil: 30,
    },
  },
});
console.log(response);

const response1 = await client.index({
  index: "test",
  id: 2,
  refresh: "true",
  document: {
    url: "https://en.wikipedia.org/wiki/2016_Brazilian_Grand_Prix",
    content: "Formula One motor race held on 13 November 2016",
    pagerank: 50.3,
    url_length: 47,
    topics: {
      sports: 35,
      "formula one": 65,
      brazil: 20,
    },
  },
});
console.log(response1);

const response2 = await client.index({
  index: "test",
  id: 3,
  refresh: "true",
  document: {
    url: "https://en.wikipedia.org/wiki/Deadpool_(film)",
    content: "Deadpool is a 2016 American superhero film",
    pagerank: 50.3,
    url_length: 37,
    topics: {
      movies: 60,
      "super hero": 65,
    },
  },
});
console.log(response2);
PUT /test/_doc/1?refresh
{
  "url": "https://en.wikipedia.org/wiki/2016_Summer_Olympics",
  "content": "Rio 2016",
  "pagerank": 50.3,
  "url_length": 42,
  "topics": {
    "sports": 50,
    "brazil": 30
  }
}

PUT /test/_doc/2?refresh
{
  "url": "https://en.wikipedia.org/wiki/2016_Brazilian_Grand_Prix",
  "content": "Formula One motor race held on 13 November 2016",
  "pagerank": 50.3,
  "url_length": 47,
  "topics": {
    "sports": 35,
    "formula one": 65,
    "brazil": 20
  }
}

PUT /test/_doc/3?refresh
{
  "url": "https://en.wikipedia.org/wiki/Deadpool_(film)",
  "content": "Deadpool is a 2016 American superhero film",
  "pagerank": 50.3,
  "url_length": 37,
  "topics": {
    "movies": 60,
    "super hero": 65
  }
}

Пример запроса

Следующий запрос ищет 2016 и увеличивает счёты релевантности, основываясь на pagerank, url_length, и теме sports.

resp = client.search(
    index="test",
    query={
        "bool": {
            "must": [
                {
                    "match": {
                        "content": "2016"
                    }
                }
            ],
            "should": [
                {
                    "rank_feature": {
                        "field": "pagerank"
                    }
                },
                {
                    "rank_feature": {
                        "field": "url_length",
                        "boost": 0.1
                    }
                },
                {
                    "rank_feature": {
                        "field": "topics.sports",
                        "boost": 0.4
                    }
                }
            ]
        }
    },
)
print(resp)
const response = await client.search({
  index: "test",
  query: {
    bool: {
      must: [
        {
          match: {
            content: "2016",
          },
        },
      ],
      should: [
        {
          rank_feature: {
            field: "pagerank",
          },
        },
        {
          rank_feature: {
            field: "url_length",
            boost: 0.1,
          },
        },
        {
          rank_feature: {
            field: "topics.sports",
            boost: 0.4,
          },
        },
      ],
    },
  },
});
console.log(response);
GET /test/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "content": "2016"
          }
        }
      ],
      "should": [
        {
          "rank_feature": {
            "field": "pagerank"
          }
        },
        {
          "rank_feature": {
            "field": "url_length",
            "boost": 0.1
          }
        },
        {
          "rank_feature": {
            "field": "topics.sports",
            "boost": 0.4
          }
        }
      ]
    }
  }
}

Параметры верхнего уровня для запроса rank_feature

field
(Обязательно, строка) Поле типа rank_feature или rank_features, используемое для повышения счёта релевантности.
boost

(Необязательно, число с плавающей запятой) Число с плавающей запятой, используемое для уменьшения или увеличения счёта релевантности. По умолчанию 1.0.

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

saturation

(Необязательно, объект функции) Функция насыщения, используемая для повышения счёта релевантности, основанная на значении поля признака ранжирования field. Если функция не указана, запрос rank_feature по умолчанию использует функцию saturation. Подробнее см. Насыщение.

Можно указать только одну функцию saturation, log, sigmoid или linear.

log

(Необязательно, объект функции) Логарифмическая функция, используемая для повышения счёта релевантности, основанная на значении поля признака ранжирования field. Подробнее см. Логарифм.

Можно указать только одну функцию saturation, log, sigmoid или linear.

sigmoid

(Необязательно, объект функции) Сигмоидальная функция, используемая для повышения счёта релевантности, основанная на значении поля признака ранжирования field. Подробнее см. Сигмоида.

Можно указать только одну функцию saturation, log, sigmoid или linear.

linear

(Необязательно, объект функции) Линейная функция, используемая для повышения счёта релевантности, основанная на значении поля признака ранжирования field. Подробнее см. Линейная.

Можно указать только одну функцию saturation, log, sigmoid или linear.

Примечания

Насыщенность

Функция saturation возвращает оценку, равную S / (S + pivot), где S — значение поля характеристики ранжирования, а pivot — настраиваемое опорное значение, так что результат будет меньше 0.5, если S меньше опорного значения, и больше 0.5 в противном случае. Оценки всегда (0,1).

Если поле характеристики ранжирования оказывает отрицательное влияние на оценку, функция вычисляется как pivot / (S + pivot), которая уменьшается при увеличении S.

resp = client.search(
    index="test",
    query={
        "rank_feature": {
            "field": "pagerank",
            "saturation": {
                "pivot": 8
            }
        }
    },
)
print(resp)
const response = await client.search({
  index: "test",
  query: {
    rank_feature: {
      field: "pagerank",
      saturation: {
        pivot: 8,
      },
    },
  },
});
console.log(response);
GET /test/_search
{
  "query": {
    "rank_feature": {
      "field": "pagerank",
      "saturation": {
        "pivot": 8
      }
    }
  }
}

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

resp = client.search(
    index="test",
    query={
        "rank_feature": {
            "field": "pagerank",
            "saturation": {}
        }
    },
)
print(resp)
const response = await client.search({
  index: "test",
  query: {
    rank_feature: {
      field: "pagerank",
      saturation: {},
    },
  },
});
console.log(response);
GET /test/_search
{
  "query": {
    "rank_feature": {
      "field": "pagerank",
      "saturation": {}
    }
  }
}

Логарифм

Функция log возвращает оценку, равную log(scaling_factor + S), где S — значение поля характеристики ранжирования, а scaling_factor — настраиваемый масштабирующий коэффициент. Оценки не ограничены.

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

resp = client.search(
    index="test",
    query={
        "rank_feature": {
            "field": "pagerank",
            "log": {
                "scaling_factor": 4
            }
        }
    },
)
print(resp)
const response = await client.search({
  index: "test",
  query: {
    rank_feature: {
      field: "pagerank",
      log: {
        scaling_factor: 4,
      },
    },
  },
});
console.log(response);
GET /test/_search
{
  "query": {
    "rank_feature": {
      "field": "pagerank",
      "log": {
        "scaling_factor": 4
      }
    }
  }
}

Сигмоида

Функция sigmoid является расширением функции saturation, которая добавляет настраиваемый показатель степени. Оценки вычисляются как S^exp^ / (S^exp^ + pivot^exp^). Как и для функции saturation, pivot — значение S, которое даёт оценку 0.5, и оценки (0,1).

exponent должно быть положительным и обычно находится в диапазоне [0.5, 1]. Хорошее значение должно быть получено в результате обучения. Если у вас нет такой возможности, рекомендуется использовать функцию saturation.

resp = client.search(
    index="test",
    query={
        "rank_feature": {
            "field": "pagerank",
            "sigmoid": {
                "pivot": 7,
                "exponent": 0.6
            }
        }
    },
)
print(resp)
const response = await client.search({
  index: "test",
  query: {
    rank_feature: {
      field: "pagerank",
      sigmoid: {
        pivot: 7,
        exponent: 0.6,
      },
    },
  },
});
console.log(response);
GET /test/_search
{
  "query": {
    "rank_feature": {
      "field": "pagerank",
      "sigmoid": {
        "pivot": 7,
        "exponent": 0.6
      }
    }
  }
}

Линейная

Функция linear — самая простая функция и возвращает оценку, равную индексированному значению S, где S — значение поля характеристики ранжирования. Если поле характеристики ранжирования индексируется с помощью "positive_score_impact": true, его индексированное значение равно S и округлено для сохранения только 9 значащих битов точности. Если поле характеристики ранжирования индексируется с помощью "positive_score_impact": false, его индексированное значение равно 1/S и округлено для сохранения только 9 значащих битов точности.

resp = client.search(
    index="test",
    query={
        "rank_feature": {
            "field": "pagerank",
            "linear": {}
        }
    },
)
print(resp)
const response = await client.search({
  index: "test",
  query: {
    rank_feature: {
      field: "pagerank",
      linear: {},
    },
  },
});
console.log(response);
GET /test/_search
{
  "query": {
    "rank_feature": {
      "field": "pagerank",
      "linear": {}
    }
  }
}

© 2023-2025 Elasticsearch
As of September 2024, Elasticsearch is available under a choice of three licenses: the Server Side Public License (SSPL), the Elastic License, or the AGPLv3 (OSI approved).
Elasticsearch and the Elasticsearch logo are trademarks of Elasticsearch B.V., registered in the U.S. and in other countries.
https://www.elastic.co/guide/en/elasticsearch/reference/8.17/query-dsl-rank-feature-query.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API