距離特徴クエリ

relevance scoreを提供されたoriginの日付またはポイントに近い文書に対してブーストします。たとえば、このクエリを使用して、特定の日付や場所に近い文書により多くの重みを与えることができます。

  1. ## 例リクエスト
  2. ### インデックス設定
  3. `````distance_feature`````クエリを使用するには、インデックスに[`````date`````](/read/elasticsearch-8-15/9dfa1da42eb162ff.md)、[`````date_nanos`````](/read/elasticsearch-8-15/b43d322aa0194e4b.md)または[`````geo_point`````](/read/elasticsearch-8-15/88b015c027a75b7c.md)フィールドが含まれている必要があります。
  4. `````distance_feature`````クエリのためにインデックスを設定する方法を確認するには、次の例を試してください。
  5. - 1*.* 次のフィールドマッピングを持つ`````items`````インデックスを作成します:
  6. - `````name`````、[`````keyword`````](/read/elasticsearch-8-15/491649a654160c3a.md)フィールド
  7. - `````production_date`````、[`````date`````](/read/elasticsearch-8-15/9dfa1da42eb162ff.md)フィールド
  8. - `````location`````、[`````geo_point`````](/read/elasticsearch-8-15/88b015c027a75b7c.md)フィールド
  9. #### Python
  10. ``````python
  11. resp = client.indices.create(
  12. index="items",
  13. mappings={
  14. "properties": {
  15. "name": {
  16. "type": "keyword"
  17. },
  18. "production_date": {
  19. "type": "date"
  20. },
  21. "location": {
  22. "type": "geo_point"
  23. }
  24. }
  25. },
  26. )
  27. print(resp)
  28. `

Ruby

  1. response = client.indices.create(
  2. index: 'items',
  3. body: {
  4. mappings: {
  5. properties: {
  6. name: {
  7. type: 'keyword'
  8. },
  9. production_date: {
  10. type: 'date'
  11. },
  12. location: {
  13. type: 'geo_point'
  14. }
  15. }
  16. }
  17. }
  18. )
  19. puts response

Js

  1. const response = await client.indices.create({
  2. index: "items",
  3. mappings: {
  4. properties: {
  5. name: {
  6. type: "keyword",
  7. },
  8. production_date: {
  9. type: "date",
  10. },
  11. location: {
  12. type: "geo_point",
  13. },
  14. },
  15. },
  16. });
  17. console.log(response);

コンソール

  1. PUT /items
  2. {
  3. "mappings": {
  4. "properties": {
  5. "name": {
  6. "type": "keyword"
  7. },
  8. "production_date": {
  9. "type": "date"
  10. },
  11. "location": {
  12. "type": "geo_point"
  13. }
  14. }
  15. }
  16. }
  • 2. このインデックスにいくつかの文書をインデックスします。

Python

  1. resp = client.index(
  2. index="items",
  3. id="1",
  4. refresh=True,
  5. document={
  6. "name": "chocolate",
  7. "production_date": "2018-02-01",
  8. "location": [
  9. -71.34,
  10. 41.12
  11. ]
  12. },
  13. )
  14. print(resp)
  15. resp1 = client.index(
  16. index="items",
  17. id="2",
  18. refresh=True,
  19. document={
  20. "name": "chocolate",
  21. "production_date": "2018-01-01",
  22. "location": [
  23. -71.3,
  24. 41.15
  25. ]
  26. },
  27. )
  28. print(resp1)
  29. resp2 = client.index(
  30. index="items",
  31. id="3",
  32. refresh=True,
  33. document={
  34. "name": "chocolate",
  35. "production_date": "2017-12-01",
  36. "location": [
  37. -71.3,
  38. 41.12
  39. ]
  40. },
  41. )
  42. print(resp2)

Ruby

  1. response = client.index(
  2. index: 'items',
  3. id: 1,
  4. refresh: true,
  5. body: {
  6. name: 'chocolate',
  7. production_date: '2018-02-01',
  8. location: [
  9. -71.34,
  10. 41.12
  11. ]
  12. }
  13. )
  14. puts response
  15. response = client.index(
  16. index: 'items',
  17. id: 2,
  18. refresh: true,
  19. body: {
  20. name: 'chocolate',
  21. production_date: '2018-01-01',
  22. location: [
  23. -71.3,
  24. 41.15
  25. ]
  26. }
  27. )
  28. puts response
  29. response = client.index(
  30. index: 'items',
  31. id: 3,
  32. refresh: true,
  33. body: {
  34. name: 'chocolate',
  35. production_date: '2017-12-01',
  36. location: [
  37. -71.3,
  38. 41.12
  39. ]
  40. }
  41. )
  42. puts response

Js

  1. const response = await client.index({
  2. index: "items",
  3. id: 1,
  4. refresh: "true",
  5. document: {
  6. name: "chocolate",
  7. production_date: "2018-02-01",
  8. location: [-71.34, 41.12],
  9. },
  10. });
  11. console.log(response);
  12. const response1 = await client.index({
  13. index: "items",
  14. id: 2,
  15. refresh: "true",
  16. document: {
  17. name: "chocolate",
  18. production_date: "2018-01-01",
  19. location: [-71.3, 41.15],
  20. },
  21. });
  22. console.log(response1);
  23. const response2 = await client.index({
  24. index: "items",
  25. id: 3,
  26. refresh: "true",
  27. document: {
  28. name: "chocolate",
  29. production_date: "2017-12-01",
  30. location: [-71.3, 41.12],
  31. },
  32. });
  33. console.log(response2);

コンソール

  1. PUT /items/_doc/1?refresh
  2. {
  3. "name" : "chocolate",
  4. "production_date": "2018-02-01",
  5. "location": [-71.34, 41.12]
  6. }
  7. PUT /items/_doc/2?refresh
  8. {
  9. "name" : "chocolate",
  10. "production_date": "2018-01-01",
  11. "location": [-71.3, 41.15]
  12. }
  13. PUT /items/_doc/3?refresh
  14. {
  15. "name" : "chocolate",
  16. "production_date": "2017-12-01",
  17. "location": [-71.3, 41.12]
  18. }

例クエリ

日付に基づいて文書をブースト

次のbool検索は、name値がchocolateの文書を返します。この検索は、distance_featureクエリを使用して、production_date値がnowに近い文書の関連スコアを増加させます。

Python

  1. resp = client.search(
  2. index="items",
  3. query={
  4. "bool": {
  5. "must": {
  6. "match": {
  7. "name": "chocolate"
  8. }
  9. },
  10. "should": {
  11. "distance_feature": {
  12. "field": "production_date",
  13. "pivot": "7d",
  14. "origin": "now"
  15. }
  16. }
  17. }
  18. },
  19. )
  20. print(resp)

Ruby

  1. response = client.search(
  2. index: 'items',
  3. body: {
  4. query: {
  5. bool: {
  6. must: {
  7. match: {
  8. name: 'chocolate'
  9. }
  10. },
  11. should: {
  12. distance_feature: {
  13. field: 'production_date',
  14. pivot: '7d',
  15. origin: 'now'
  16. }
  17. }
  18. }
  19. }
  20. }
  21. )
  22. puts response

Js

  1. const response = await client.search({
  2. index: "items",
  3. query: {
  4. bool: {
  5. must: {
  6. match: {
  7. name: "chocolate",
  8. },
  9. },
  10. should: {
  11. distance_feature: {
  12. field: "production_date",
  13. pivot: "7d",
  14. origin: "now",
  15. },
  16. },
  17. },
  18. },
  19. });
  20. console.log(response);

コンソール

  1. GET /items/_search
  2. {
  3. "query": {
  4. "bool": {
  5. "must": {
  6. "match": {
  7. "name": "chocolate"
  8. }
  9. },
  10. "should": {
  11. "distance_feature": {
  12. "field": "production_date",
  13. "pivot": "7d",
  14. "origin": "now"
  15. }
  16. }
  17. }
  18. }
  19. }

位置に基づいて文書をブースト

次のbool検索は、name値がchocolateの文書を返します。この検索は、distance_featureクエリを使用して、location値が[-71.3, 41.15]に近い文書の関連スコアを増加させます。

Python

  1. resp = client.search(
  2. index="items",
  3. query={
  4. "bool": {
  5. "must": {
  6. "match": {
  7. "name": "chocolate"
  8. }
  9. },
  10. "should": {
  11. "distance_feature": {
  12. "field": "location",
  13. "pivot": "1000m",
  14. "origin": [
  15. -71.3,
  16. 41.15
  17. ]
  18. }
  19. }
  20. }
  21. },
  22. )
  23. print(resp)

Ruby

  1. response = client.search(
  2. index: 'items',
  3. body: {
  4. query: {
  5. bool: {
  6. must: {
  7. match: {
  8. name: 'chocolate'
  9. }
  10. },
  11. should: {
  12. distance_feature: {
  13. field: 'location',
  14. pivot: '1000m',
  15. origin: [
  16. -71.3,
  17. 41.15
  18. ]
  19. }
  20. }
  21. }
  22. }
  23. }
  24. )
  25. puts response

Js

  1. const response = await client.search({
  2. index: "items",
  3. query: {
  4. bool: {
  5. must: {
  6. match: {
  7. name: "chocolate",
  8. },
  9. },
  10. should: {
  11. distance_feature: {
  12. field: "location",
  13. pivot: "1000m",
  14. origin: [-71.3, 41.15],
  15. },
  16. },
  17. },
  18. },
  19. });
  20. console.log(response);

コンソール

  1. GET /items/_search
  2. {
  3. "query": {
  4. "bool": {
  5. "must": {
  6. "match": {
  7. "name": "chocolate"
  8. }
  9. },
  10. "should": {
  11. "distance_feature": {
  12. "field": "location",
  13. "pivot": "1000m",
  14. "origin": [-71.3, 41.15]
  15. }
  16. }
  17. }
  18. }
  19. }

距離特徴のためのトップレベルパラメータ

  • field
  • (必須、文字列) 距離を計算するために使用されるフィールドの名前。このフィールドは次の基準を満たす必要があります:
    • datedate_nanosまたはgeo_pointフィールドであること
    • indexマッピングパラメータ値がtrueであること、これはデフォルトです
    • doc_valuesマッピングパラメータ値がtrueであること、これはデフォルトです
  • origin
  • (必須、文字列) 距離を計算するために使用される日付または起点。
    field値がdateまたはdate_nanosフィールドの場合、origin値は日付でなければなりません。日付数学now-1hのようなものがサポートされています。
    field値がgeo_pointフィールドの場合、origin値はジオポイントでなければなりません。
  • pivot
  • (必須、時間単位または距離単位) 関連スコアがboost値の半分を受け取るoriginからの距離。
    field値がdateまたはdate_nanosフィールドの場合、pivot値は時間単位でなければなりません、1h10dのような。
    field値がgeo_pointフィールドの場合、pivot値は距離単位でなければなりません、1km12mのような。
  • boost
  • (オプション、浮動小数点) 一致する文書の関連スコアを乗算するために使用される浮動小数点数。この値は負であってはなりません。デフォルトは1.0です。

ノート

距離特徴クエリが関連スコアを計算する方法

  1. `````distance_feature`````クエリは、文書の[関連スコア](e8aa4b0e7ff9e612.md#relevance-scores)を次のように計算します:
  2. ``````bash
  3. relevance score = boost * pivot / (pivot + distance)
  4. `

distanceは、origin値と文書のフィールド値との絶対差です。

非競争ヒットをスキップ

function_scoreクエリや他の方法で関連スコアを変更するのとは異なり、distance_featureクエリは、track_total_hitsパラメータがnot trueの場合、非競争ヒットを効率的にスキップします。