ランク機能クエリ

文書の 関連スコアrank_feature または rank_features フィールドの数値に基づいてブーストします。

rank_feature クエリは通常、bool クエリの should 句で使用され、その関連スコアは bool クエリからの他のスコアに追加されます。

positive_score_impactfalse に設定されている 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

  1. resp = client.indices.create(
  2. index="test",
  3. mappings={
  4. "properties": {
  5. "pagerank": {
  6. "type": "rank_feature"
  7. },
  8. "url_length": {
  9. "type": "rank_feature",
  10. "positive_score_impact": False
  11. },
  12. "topics": {
  13. "type": "rank_features"
  14. }
  15. }
  16. },
  17. )
  18. print(resp)

Ruby

  1. response = client.indices.create(
  2. index: 'test',
  3. body: {
  4. mappings: {
  5. properties: {
  6. pagerank: {
  7. type: 'rank_feature'
  8. },
  9. url_length: {
  10. type: 'rank_feature',
  11. positive_score_impact: false
  12. },
  13. topics: {
  14. type: 'rank_features'
  15. }
  16. }
  17. }
  18. }
  19. )
  20. puts response

Js

  1. const response = await client.indices.create({
  2. index: "test",
  3. mappings: {
  4. properties: {
  5. pagerank: {
  6. type: "rank_feature",
  7. },
  8. url_length: {
  9. type: "rank_feature",
  10. positive_score_impact: false,
  11. },
  12. topics: {
  13. type: "rank_features",
  14. },
  15. },
  16. },
  17. });
  18. console.log(response);

コンソール

  1. PUT /test
  2. {
  3. "mappings": {
  4. "properties": {
  5. "pagerank": {
  6. "type": "rank_feature"
  7. },
  8. "url_length": {
  9. "type": "rank_feature",
  10. "positive_score_impact": false
  11. },
  12. "topics": {
  13. "type": "rank_features"
  14. }
  15. }
  16. }
  17. }

test インデックスに複数の文書をインデックスします。

Python

  1. resp = client.index(
  2. index="test",
  3. id="1",
  4. refresh=True,
  5. document={
  6. "url": "https://en.wikipedia.org/wiki/2016_Summer_Olympics",
  7. "content": "Rio 2016",
  8. "pagerank": 50.3,
  9. "url_length": 42,
  10. "topics": {
  11. "sports": 50,
  12. "brazil": 30
  13. }
  14. },
  15. )
  16. print(resp)
  17. resp1 = client.index(
  18. index="test",
  19. id="2",
  20. refresh=True,
  21. document={
  22. "url": "https://en.wikipedia.org/wiki/2016_Brazilian_Grand_Prix",
  23. "content": "Formula One motor race held on 13 November 2016",
  24. "pagerank": 50.3,
  25. "url_length": 47,
  26. "topics": {
  27. "sports": 35,
  28. "formula one": 65,
  29. "brazil": 20
  30. }
  31. },
  32. )
  33. print(resp1)
  34. resp2 = client.index(
  35. index="test",
  36. id="3",
  37. refresh=True,
  38. document={
  39. "url": "https://en.wikipedia.org/wiki/Deadpool_(film)",
  40. "content": "Deadpool is a 2016 American superhero film",
  41. "pagerank": 50.3,
  42. "url_length": 37,
  43. "topics": {
  44. "movies": 60,
  45. "super hero": 65
  46. }
  47. },
  48. )
  49. print(resp2)

Ruby

  1. response = client.index(
  2. index: 'test',
  3. id: 1,
  4. refresh: true,
  5. body: {
  6. url: 'https://en.wikipedia.org/wiki/2016_Summer_Olympics',
  7. content: 'Rio 2016',
  8. pagerank: 50.3,
  9. url_length: 42,
  10. topics: {
  11. sports: 50,
  12. brazil: 30
  13. }
  14. }
  15. )
  16. puts response
  17. response = client.index(
  18. index: 'test',
  19. id: 2,
  20. refresh: true,
  21. body: {
  22. url: 'https://en.wikipedia.org/wiki/2016_Brazilian_Grand_Prix',
  23. content: 'Formula One motor race held on 13 November 2016',
  24. pagerank: 50.3,
  25. url_length: 47,
  26. topics: {
  27. sports: 35,
  28. "formula one": 65,
  29. brazil: 20
  30. }
  31. }
  32. )
  33. puts response
  34. response = client.index(
  35. index: 'test',
  36. id: 3,
  37. refresh: true,
  38. body: {
  39. url: 'https://en.wikipedia.org/wiki/Deadpool_(film)',
  40. content: 'Deadpool is a 2016 American superhero film',
  41. pagerank: 50.3,
  42. url_length: 37,
  43. topics: {
  44. movies: 60,
  45. "super hero": 65
  46. }
  47. }
  48. )
  49. puts response

Js

  1. const response = await client.index({
  2. index: "test",
  3. id: 1,
  4. refresh: "true",
  5. document: {
  6. url: "https://en.wikipedia.org/wiki/2016_Summer_Olympics",
  7. content: "Rio 2016",
  8. pagerank: 50.3,
  9. url_length: 42,
  10. topics: {
  11. sports: 50,
  12. brazil: 30,
  13. },
  14. },
  15. });
  16. console.log(response);
  17. const response1 = await client.index({
  18. index: "test",
  19. id: 2,
  20. refresh: "true",
  21. document: {
  22. url: "https://en.wikipedia.org/wiki/2016_Brazilian_Grand_Prix",
  23. content: "Formula One motor race held on 13 November 2016",
  24. pagerank: 50.3,
  25. url_length: 47,
  26. topics: {
  27. sports: 35,
  28. "formula one": 65,
  29. brazil: 20,
  30. },
  31. },
  32. });
  33. console.log(response1);
  34. const response2 = await client.index({
  35. index: "test",
  36. id: 3,
  37. refresh: "true",
  38. document: {
  39. url: "https://en.wikipedia.org/wiki/Deadpool_(film)",
  40. content: "Deadpool is a 2016 American superhero film",
  41. pagerank: 50.3,
  42. url_length: 37,
  43. topics: {
  44. movies: 60,
  45. "super hero": 65,
  46. },
  47. },
  48. });
  49. console.log(response2);

コンソール

  1. PUT /test/_doc/1?refresh
  2. {
  3. "url": "https://en.wikipedia.org/wiki/2016_Summer_Olympics",
  4. "content": "Rio 2016",
  5. "pagerank": 50.3,
  6. "url_length": 42,
  7. "topics": {
  8. "sports": 50,
  9. "brazil": 30
  10. }
  11. }
  12. PUT /test/_doc/2?refresh
  13. {
  14. "url": "https://en.wikipedia.org/wiki/2016_Brazilian_Grand_Prix",
  15. "content": "Formula One motor race held on 13 November 2016",
  16. "pagerank": 50.3,
  17. "url_length": 47,
  18. "topics": {
  19. "sports": 35,
  20. "formula one": 65,
  21. "brazil": 20
  22. }
  23. }
  24. PUT /test/_doc/3?refresh
  25. {
  26. "url": "https://en.wikipedia.org/wiki/Deadpool_(film)",
  27. "content": "Deadpool is a 2016 American superhero film",
  28. "pagerank": 50.3,
  29. "url_length": 37,
  30. "topics": {
  31. "movies": 60,
  32. "super hero": 65
  33. }
  34. }

例クエリ

次のクエリは 2016 を検索し、pagerankurl_lengthsports トピックに基づいて関連スコアをブーストします。

Python

  1. resp = client.search(
  2. index="test",
  3. query={
  4. "bool": {
  5. "must": [
  6. {
  7. "match": {
  8. "content": "2016"
  9. }
  10. }
  11. ],
  12. "should": [
  13. {
  14. "rank_feature": {
  15. "field": "pagerank"
  16. }
  17. },
  18. {
  19. "rank_feature": {
  20. "field": "url_length",
  21. "boost": 0.1
  22. }
  23. },
  24. {
  25. "rank_feature": {
  26. "field": "topics.sports",
  27. "boost": 0.4
  28. }
  29. }
  30. ]
  31. }
  32. },
  33. )
  34. print(resp)

Js

  1. const response = await client.search({
  2. index: "test",
  3. query: {
  4. bool: {
  5. must: [
  6. {
  7. match: {
  8. content: "2016",
  9. },
  10. },
  11. ],
  12. should: [
  13. {
  14. rank_feature: {
  15. field: "pagerank",
  16. },
  17. },
  18. {
  19. rank_feature: {
  20. field: "url_length",
  21. boost: 0.1,
  22. },
  23. },
  24. {
  25. rank_feature: {
  26. field: "topics.sports",
  27. boost: 0.4,
  28. },
  29. },
  30. ],
  31. },
  32. },
  33. });
  34. console.log(response);

コンソール

  1. GET /test/_search
  2. {
  3. "query": {
  4. "bool": {
  5. "must": [
  6. {
  7. "match": {
  8. "content": "2016"
  9. }
  10. }
  11. ],
  12. "should": [
  13. {
  14. "rank_feature": {
  15. "field": "pagerank"
  16. }
  17. },
  18. {
  19. "rank_feature": {
  20. "field": "url_length",
  21. "boost": 0.1
  22. }
  23. },
  24. {
  25. "rank_feature": {
  26. "field": "topics.sports",
  27. "boost": 0.4
  28. }
  29. }
  30. ]
  31. }
  32. }
  33. }

rank_feature のトップレベルパラメータ

  • field
  • (必須、文字列) rank_feature または rank_features フィールドを使用して 関連スコア をブーストします。
  • boost
  • (オプション、浮動小数点数) 関連スコア を減少または増加させるために使用される浮動小数点数。デフォルトは 1.0 です。
    ブースト値は 1.0 のデフォルト値に対して相対的です。 01.0 の間のブースト値は関連スコアを減少させます。 1.0 より大きい値は関連スコアを増加させます。
  • saturation
  • (オプション、関数オブジェクト) ランク機能 field の値に基づいて 関連スコア をブーストするために使用される飽和関数。関数が提供されていない場合、rank_feature クエリはデフォルトで saturation 関数を使用します。詳細については 飽和 を参照してください。
    関数 saturationlogsigmoid または linear は1つだけ提供できます。
  • log
  • (オプション、関数オブジェクト) ランク機能 field の値に基づいて 関連スコア をブーストするために使用される対数関数。詳細については 対数 を参照してください。
    関数 saturationlogsigmoid または linear は1つだけ提供できます。
  • sigmoid
  • (オプション、関数オブジェクト) ランク機能 field の値に基づいて 関連スコア をブーストするために使用されるシグモイド関数。詳細については シグモイド を参照してください。
    関数 saturationlogsigmoid または linear は1つだけ提供できます。
  • linear
  • (オプション、関数オブジェクト) ランク機能 field の値に基づいて 関連スコア をブーストするために使用される線形関数。詳細については 線形 を参照してください。
    関数 saturationlogsigmoid または linear は1つだけ提供できます。

ノート

飽和

saturation 関数は S / (S + pivot) に等しいスコアを与えます。ここで S はランク機能フィールドの値で、pivot は設定可能なピボット値です。S がピボットより小さい場合、結果は 0.5 より小さくなり、そうでない場合は 0.5 より大きくなります。スコアは常に (0,1) です。

ランク機能が負のスコア影響を持つ場合、関数は pivot / (S + pivot) として計算され、S が増加すると減少します。

Python

  1. resp = client.search(
  2. index="test",
  3. query={
  4. "rank_feature": {
  5. "field": "pagerank",
  6. "saturation": {
  7. "pivot": 8
  8. }
  9. }
  10. },
  11. )
  12. print(resp)

Js

  1. const response = await client.search({
  2. index: "test",
  3. query: {
  4. rank_feature: {
  5. field: "pagerank",
  6. saturation: {
  7. pivot: 8,
  8. },
  9. },
  10. },
  11. });
  12. console.log(response);

コンソール

  1. GET /test/_search
  2. {
  3. "query": {
  4. "rank_feature": {
  5. "field": "pagerank",
  6. "saturation": {
  7. "pivot": 8
  8. }
  9. }
  10. }
  11. }

pivot 値が提供されていない場合、Elasticsearch はインデックス内のすべてのランク機能値の近似幾何平均に等しいデフォルト値を計算します。良いピボット値をトレーニングする機会がない場合は、このデフォルト値を使用することをお勧めします。

Python

  1. resp = client.search(
  2. index="test",
  3. query={
  4. "rank_feature": {
  5. "field": "pagerank",
  6. "saturation": {}
  7. }
  8. },
  9. )
  10. print(resp)

Js

  1. const response = await client.search({
  2. index: "test",
  3. query: {
  4. rank_feature: {
  5. field: "pagerank",
  6. saturation: {},
  7. },
  8. },
  9. });
  10. console.log(response);

コンソール

  1. GET /test/_search
  2. {
  3. "query": {
  4. "rank_feature": {
  5. "field": "pagerank",
  6. "saturation": {}
  7. }
  8. }
  9. }

対数

log 関数は log(scaling_factor + S) に等しいスコアを与えます。ここで S はランク機能フィールドの値で、scaling_factor は設定可能なスケーリングファクターです。スコアは無制限です。

この関数は、正のスコア影響を持つランク機能のみをサポートします。

Python

  1. resp = client.search(
  2. index="test",
  3. query={
  4. "rank_feature": {
  5. "field": "pagerank",
  6. "log": {
  7. "scaling_factor": 4
  8. }
  9. }
  10. },
  11. )
  12. print(resp)

Js

  1. const response = await client.search({
  2. index: "test",
  3. query: {
  4. rank_feature: {
  5. field: "pagerank",
  6. log: {
  7. scaling_factor: 4,
  8. },
  9. },
  10. },
  11. });
  12. console.log(response);

コンソール

  1. GET /test/_search
  2. {
  3. "query": {
  4. "rank_feature": {
  5. "field": "pagerank",
  6. "log": {
  7. "scaling_factor": 4
  8. }
  9. }
  10. }
  11. }

シグモイド

sigmoid 関数は saturation の拡張で、設定可能な指数を追加します。スコアは S^exp^ / (S^exp^ + pivot^exp^) として計算されます。saturation 関数の場合と同様に、pivotS の値で、0.5 のスコアを与え、スコアは (0,1) です。

exponent は正でなければならず、通常は [0.5, 1] にあります。良い値はトレーニングによって計算されるべきです。そうする機会がない場合は、saturation 関数を代わりに使用することをお勧めします。

Python

  1. resp = client.search(
  2. index="test",
  3. query={
  4. "rank_feature": {
  5. "field": "pagerank",
  6. "sigmoid": {
  7. "pivot": 7,
  8. "exponent": 0.6
  9. }
  10. }
  11. },
  12. )
  13. print(resp)

Js

  1. const response = await client.search({
  2. index: "test",
  3. query: {
  4. rank_feature: {
  5. field: "pagerank",
  6. sigmoid: {
  7. pivot: 7,
  8. exponent: 0.6,
  9. },
  10. },
  11. },
  12. });
  13. console.log(response);

コンソール

  1. GET /test/_search
  2. {
  3. "query": {
  4. "rank_feature": {
  5. "field": "pagerank",
  6. "sigmoid": {
  7. "pivot": 7,
  8. "exponent": 0.6
  9. }
  10. }
  11. }
  12. }

線形

linear 関数は最も単純な関数で、S のインデックス値に等しいスコアを与えます。ここで S はランク機能フィールドの値です。ランク機能フィールドが "positive_score_impact": true でインデックスされている場合、そのインデックス値は S に等しく、精度を保つために9桁の有効数字のみを保持するように丸められます。ランク機能フィールドが "positive_score_impact": false でインデックスされている場合、そのインデックス値は 1/S に等しく、精度を保つために9桁の有効数字のみを保持するように丸められます。

Python

  1. resp = client.search(
  2. index="test",
  3. query={
  4. "rank_feature": {
  5. "field": "pagerank",
  6. "linear": {}
  7. }
  8. },
  9. )
  10. print(resp)

Js

  1. const response = await client.search({
  2. index: "test",
  3. query: {
  4. rank_feature: {
  5. field: "pagerank",
  6. linear: {},
  7. },
  8. },
  9. });
  10. console.log(response);

コンソール

  1. GET /test/_search
  2. {
  3. "query": {
  4. "rank_feature": {
  5. "field": "pagerank",
  6. "linear": {}
  7. }
  8. }
  9. }