スコアへの静的関連信号の組み込み

多くのドメインには、関連性と相関があることが知られている静的信号があります。例えば、PageRankやURLの長さは、クエリに依存せずにウェブページのスコアを調整するために、ウェブ検索で一般的に使用される2つの特徴です。

静的スコアの寄与をテキストの関連性と組み合わせるための2つの主要なクエリがあります。例えば、BM25で計算されたものです: - script_score クエリ - rank_feature クエリ

例えば、pagerankフィールドがあり、BM25スコアと組み合わせたいとします。最終的なスコアがscore = bm25_score + pagerank / (10 + pagerank)に等しくなるように。

script_score クエリを使用すると、クエリは次のようになります:

Python

  1. resp = client.search(
  2. index="index",
  3. query={
  4. "script_score": {
  5. "query": {
  6. "match": {
  7. "body": "elasticsearch"
  8. }
  9. },
  10. "script": {
  11. "source": "_score * saturation(doc['pagerank'].value, 10)"
  12. }
  13. }
  14. },
  15. )
  16. print(resp)

Ruby

  1. response = client.search(
  2. index: 'index',
  3. body: {
  4. query: {
  5. script_score: {
  6. query: {
  7. match: {
  8. body: 'elasticsearch'
  9. }
  10. },
  11. script: {
  12. source: "_score * saturation(doc['pagerank'].value, 10)"
  13. }
  14. }
  15. }
  16. }
  17. )
  18. puts response

Js

  1. const response = await client.search({
  2. index: "index",
  3. query: {
  4. script_score: {
  5. query: {
  6. match: {
  7. body: "elasticsearch",
  8. },
  9. },
  10. script: {
  11. source: "_score * saturation(doc['pagerank'].value, 10)",
  12. },
  13. },
  14. },
  15. });
  16. console.log(response);

Console

  1. GET index/_search
  2. {
  3. "query": {
  4. "script_score": {
  5. "query": {
  6. "match": { "body": "elasticsearch" }
  7. },
  8. "script": {
  9. "source": "_score * saturation(doc['pagerank'].value, 10)"
  10. }
  11. }
  12. }
  13. }
pagerankNumeric としてマッピングされる必要があります

一方、rank_feature クエリでは、以下のようになります:

Python

  1. resp = client.search(
  2. query={
  3. "bool": {
  4. "must": {
  5. "match": {
  6. "body": "elasticsearch"
  7. }
  8. },
  9. "should": {
  10. "rank_feature": {
  11. "field": "pagerank",
  12. "saturation": {
  13. "pivot": 10
  14. }
  15. }
  16. }
  17. }
  18. },
  19. )
  20. print(resp)

Ruby

  1. response = client.search(
  2. body: {
  3. query: {
  4. bool: {
  5. must: {
  6. match: {
  7. body: 'elasticsearch'
  8. }
  9. },
  10. should: {
  11. rank_feature: {
  12. field: 'pagerank',
  13. saturation: {
  14. pivot: 10
  15. }
  16. }
  17. }
  18. }
  19. }
  20. }
  21. )
  22. puts response

Js

  1. const response = await client.search({
  2. query: {
  3. bool: {
  4. must: {
  5. match: {
  6. body: "elasticsearch",
  7. },
  8. },
  9. should: {
  10. rank_feature: {
  11. field: "pagerank",
  12. saturation: {
  13. pivot: 10,
  14. },
  15. },
  16. },
  17. },
  18. },
  19. });
  20. console.log(response);

Console

  1. GET _search
  2. {
  3. "query": {
  4. "bool": {
  5. "must": {
  6. "match": { "body": "elasticsearch" }
  7. },
  8. "should": {
  9. "rank_feature": {
  10. "field": "pagerank",
  11. "saturation": {
  12. "pivot": 10
  13. }
  14. }
  15. }
  16. }
  17. }
  18. }
pagerankrank_feature フィールドとしてマッピングされる必要があります

両方のオプションは類似のスコアを返しますが、トレードオフがあります: script_score は多くの柔軟性を提供し、テキストの関連性スコアと静的信号を好みに応じて組み合わせることができます。一方、rank_feature クエリは、スコアに静的信号を組み込む方法をいくつかしか公開していません。しかし、rank_featurerank_featuresフィールドに依存しており、これらは特別な方法で値をインデックス化し、rank_feature クエリが競争のないドキュメントをスキップし、クエリのトップマッチをより早く取得できるようにします。