ランク機能クエリ
文書の 関連スコア を rank_feature
または rank_features
フィールドの数値に基づいてブーストします。
rank_feature
クエリは通常、bool
クエリの should
句で使用され、その関連スコアは bool
クエリからの他のスコアに追加されます。
positive_score_impact
が false
に設定されている rank_feature
または rank_features
フィールドの場合、クエリに参加するすべての文書がこのフィールドの値を持つことを推奨します。そうでない場合、should 句で rank_feature
クエリが使用されると、値が欠落している文書のスコアには何も追加されず、特徴を含む文書にはいくらかのブーストが追加されます。これは私たちが望むこととは反対です – これらの特徴を負のものと見なすため、私たちはそれらを含む文書をそれらを欠く文書よりも低くランク付けしたいと考えています。
関連スコア を変更する他の方法や function_score
クエリとは異なり、rank_feature
クエリは、track_total_hits
パラメータが not true
の場合、非競争的なヒットを効率的にスキップします。これにより、クエリ速度が劇的に向上する可能性があります。
ランク機能関数
ランク機能フィールドに基づいて関連スコアを計算するために、rank_feature
クエリは次の数学関数をサポートします:
どこから始めればよいかわからない場合は、saturation
関数を使用することをお勧めします。関数が提供されていない場合、rank_feature
クエリはデフォルトで saturation
関数を使用します。
例リクエスト
インデックス設定
rank_feature
クエリを使用するには、インデックスに rank_feature
または rank_features
フィールドマッピングが含まれている必要があります。rank_feature
クエリのためにインデックスを設定する方法を確認するには、次の例を試してください。
次のフィールドマッピングを持つ test
インデックスを作成します:
pagerank
、ウェブサイトの重要性を測定するrank_feature
フィールドurl_length
、ウェブサイトの URL の長さを含むrank_feature
フィールド。この例では、長い URL は関連性に対して負の相関があり、positive_score_impact
値がfalse
であることを示します。topics
、トピックのリストと各文書がこのトピックにどれだけ関連しているかを測定するrank_features
フィールド
Python
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)
Ruby
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
Js
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
インデックスに複数の文書をインデックスします。
Python
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)
Ruby
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
Js
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
トピックに基づいて関連スコアをブーストします。
Python
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)
Js
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
は1つだけ提供できます。 log
- (オプション、関数オブジェクト) ランク機能
field
の値に基づいて 関連スコア をブーストするために使用される対数関数。詳細については 対数 を参照してください。
関数saturation
、log
、sigmoid
またはlinear
は1つだけ提供できます。 sigmoid
- (オプション、関数オブジェクト) ランク機能
field
の値に基づいて 関連スコア をブーストするために使用されるシグモイド関数。詳細については シグモイド を参照してください。
関数saturation
、log
、sigmoid
またはlinear
は1つだけ提供できます。 linear
- (オプション、関数オブジェクト) ランク機能
field
の値に基づいて 関連スコア をブーストするために使用される線形関数。詳細については 線形 を参照してください。
関数saturation
、log
、sigmoid
またはlinear
は1つだけ提供できます。
ノート
飽和
saturation
関数は S / (S + pivot)
に等しいスコアを与えます。ここで S
はランク機能フィールドの値で、pivot
は設定可能なピボット値です。S
がピボットより小さい場合、結果は 0.5
より小さくなり、そうでない場合は 0.5
より大きくなります。スコアは常に (0,1)
です。
ランク機能が負のスコア影響を持つ場合、関数は pivot / (S + pivot)
として計算され、S
が増加すると減少します。
Python
resp = client.search(
index="test",
query={
"rank_feature": {
"field": "pagerank",
"saturation": {
"pivot": 8
}
}
},
)
print(resp)
Js
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 はインデックス内のすべてのランク機能値の近似幾何平均に等しいデフォルト値を計算します。良いピボット値をトレーニングする機会がない場合は、このデフォルト値を使用することをお勧めします。
Python
resp = client.search(
index="test",
query={
"rank_feature": {
"field": "pagerank",
"saturation": {}
}
},
)
print(resp)
Js
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
は設定可能なスケーリングファクターです。スコアは無制限です。
この関数は、正のスコア影響を持つランク機能のみをサポートします。
Python
resp = client.search(
index="test",
query={
"rank_feature": {
"field": "pagerank",
"log": {
"scaling_factor": 4
}
}
},
)
print(resp)
Js
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
関数を代わりに使用することをお勧めします。
Python
resp = client.search(
index="test",
query={
"rank_feature": {
"field": "pagerank",
"sigmoid": {
"pivot": 7,
"exponent": 0.6
}
}
},
)
print(resp)
Js
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桁の有効数字のみを保持するように丸められます。
Python
resp = client.search(
index="test",
query={
"rank_feature": {
"field": "pagerank",
"linear": {}
}
},
)
print(resp)
Js
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": {}
}
}
}