

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# Amazon OpenSearch Serviceでのデータの検索
<a name="searching"></a>

Amazon OpenSearch Service でドキュメントを検索する一般的な方法がいくつかあります。これには、URI 検索とリクエストボディ検索が含まれます。OpenSearch Service は、カスタムパッケージ、SQL サポート、非同期検索など、検索エクスペリエンスを向上させる追加機能を提供します。包括的な OpenSearch 検索 API リファレンスについては、「[OpenSearch ドキュメント](https://docs.opensearch.org/latest/opensearch/query-dsl/full-text/)」を参照してください。

**注記**  
次のサンプルリクエストは、OpenSearch API を使用します。一部のリクエストでは古い Elasticsearch バージョンを使用できない可能性があります。

**Topics**
+ [URI 検索](#searching-uri)
+ [リクエストボディ検索](#searching-dsl)
+ [検索結果のページ分割](#searching-paginating)
+ [Dashboards Query Language](#DashboardsQueryLanguages)
+ [Amazon OpenSearch Service でのパッケージのインポートと管理](custom-packages.md)
+ [SQL を用いた Amazon OpenSearch Service のデータのクエリを行う](sql-support.md)
+ [Amazon OpenSearch Service のクロスクラスター検索](cross-cluster-search.md)
+ [Amazon OpenSearch Service 用の Learning to Rank](learning-to-rank.md)
+ [Amazon OpenSearch Service の非同期検索](asynchronous-search.md)
+ [Amazon OpenSearch Service のポイントインタイム検索](pit.md)
+ [Amazon OpenSearch Service でのエージェント検索](agentic-search.md)
+ [Amazon OpenSearch Serviceでのセマンティック検索](semantic-search.md)
+ [Amazon OpenSearch Service での同時セグメント検索](concurrent-segment-search.md)
+ [Amazon OpenSearch Service における自然言語クエリ生成](natural-language-query.md)

## URI 検索
<a name="searching-uri"></a>

Universal Resource Identifier (URI) 検索は、最もシンプルな検索方法です。URI 検索では、HTTP リクエストパラメータとしてクエリを指定します。

```
GET https://search-{{my-domain}}.{{us-west-1.}}es.amazonaws.com/_search?q=house
```

以下にレスポンスの例を示します。

```
{
  "took": 25,
  "timed_out": false,
  "_shards": {
    "total": 10,
    "successful": 10,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": {
      "value": 85,
      "relation": "eq",
    },
    "max_score": 6.6137657,
    "hits": [
      {
        "_index": "movies",
        "_type": "movie",
        "_id": "tt0077975",
        "_score": 6.6137657,
        "_source": {
          "directors": [
            "John Landis"
          ],
          "release_date": "1978-07-27T00:00:00Z",
          "rating": 7.5,
          "genres": [
            "Comedy",
            "Romance"
          ],
          "image_url": "http://ia.media-imdb.com/images/M/MV5BMTY2OTQxNTc1OF5BMl5BanBnXkFtZTYwNjA3NjI5._V1_SX400_.jpg",
          "plot": "At a 1962 College, Dean Vernon Wormer is determined to expel the entire Delta Tau Chi Fraternity, but those troublemakers have other plans for him.",
          "title": "Animal House",
          "rank": 527,
          "running_time_secs": 6540,
          "actors": [
            "John Belushi",
            "Karen Allen",
            "Tom Hulce"
          ],
          "year": 1978,
          "id": "tt0077975"
        }
      },
      {{...}}
    ]
  }
}
```

デフォルトでは、このクエリは*家*という語句をすべてのインデックスのすべてのフィールドで検索します。検索を絞り込むには URI でインデックス (`movies`) およびドキュメントフィールド (`title`) を指定します。

```
GET https://search-{{my-domain}}.{{us-west-1.}}es.amazonaws.com/movies/_search?q=title:house
```

リクエストに追加のパラメータを含めることができますが、サポートされているパラメータはごく一部分の OpenSearch 検索オプションのみを提供します。次のリクエストは 20 の結果 (デフォルトでは 10) を返し、年ごとに (`_score` ではなく) ソートされます。

```
GET https://search-{{my-domain}}.{{us-west-1.}}es.amazonaws.com/movies/_search?q=title:house&size=20&sort=year:desc
```

## リクエストボディ検索
<a name="searching-dsl"></a>

より複雑な検索を実行するには、HTTP リクエストボディと、クエリの OpenSearch ドメイン固有言語 (DSL) を使用します。クエリ DSL では、OpenSearch 検索オプションの全範囲を指定することができます。

**注記**  
テキストフィールドの値に Unicode 特殊文字を含めることはできません。値は特殊文字で区切られた複数の値として解析されます。このような誤った解析により、意図せずに文書がフィルタリングされ、アクセス制御が損なわれる可能性があります。詳しい情報については、OpenSearch ドキュメンテーションの「[テキストフィールド内の Unicode 特殊文字に関する注意](https://opensearch.org/docs/latest/opensearch/query-dsl/index/#a-note-on-unicode-special-characters-in-text-fields)」を参照してください。

次の `match` クエリでは、最終的な [URI 検索](#searching-uri)の例と似ています。

```
POST https://search-{{my-domain}}.{{us-west-1.}}es.amazonaws.com/movies/_search
{
  "size": 20,
  "sort": {
    "year": {
      "order": "desc"
    }
  },
  "query": {
    "query_string": {
      "default_field": "title",
      "query": "house"
    }
  }
}
```

**注記**  
`_search` API はリクエストボディ検索のための HTTP `GET` および `POST` を受け入れます。ただし、すべての HTTP クライアントが `GET` リクエストにリクエストボディを追加することをサポートしているわけではありません。`POST` は普遍的な選択です。

多くの場合、いくつかのフィールドを検索する必要がある場合がありますが、すべてのフィールドを検索する必要はありません。`multi_match` クエリを使用します。

```
POST https://search-{{my-domain}}.{{us-west-1.}}es.amazonaws.com/movies/_search
{
  "size": 20,
  "query": {
    "multi_match": {
      "query": "house",
      "fields": ["title", "plot", "actors", "directors"]
    }
  }
}
```

### ブーストフィールド
<a name="searching-dsl-boost"></a>

特定のフィールドをブーストすることで、検索の関連性を向上させることができます。ブーストは乗数で、あるフィールドの一致を他のフィールドの一致より重く重み付けします。次の例では、`title` フィールドでの *john* の一致は、`plot` フィールドの一致の 2 倍の度合いで、また `actors` もしくは `directors` フィールドの一致の 4 倍の度合いで `_score` に影響を及ぼします。その結果、*John Wick* や *John Carter* のような映画が検索結果の最上部にあり、John Travolta 主演の映画は最下部にあります。

```
POST https://search-{{my-domain}}.{{us-west-1.}}es.amazonaws.com/movies/_search
{
  "size": 20,
  "query": {
    "multi_match": {
      "query": "john",
      "fields": ["title^4", "plot^2", "actors", "directors"]
    }
  }
}
```

### 検索結果のハイライト
<a name="searching-dsl-highlighting"></a>

`highlight` オプションは、クエリが 1 つ以上のフィールドに一致した場合、`hits` 配列内にある追加のオブジェクトを返すよう OpenSearch に指示します。

```
POST https://search-{{my-domain}}.{{us-west-1.}}es.amazonaws.com/movies/_search
{
  "size": 20,
  "query": {
    "multi_match": {
      "query": "house",
      "fields": ["title^4", "plot^2", "actors", "directors"]
    }
  },
  "highlight": {
    "fields": {
      "plot": {}
    }
  }
}
```

クエリが `plot` フィールドのコンテンツに一致した場合、ヒットは次のようになります。

```
{
  "_index": "movies",
  "_type": "movie",
  "_id": "tt0091541",
  "_score": 11.276199,
  "_source": {
    "directors": [
      "Richard Benjamin"
    ],
    "release_date": "1986-03-26T00:00:00Z",
    "rating": 6,
    "genres": [
      "Comedy",
      "Music"
    ],
    "image_url": "http://ia.media-imdb.com/images/M/MV5BMTIzODEzODE2OF5BMl5BanBnXkFtZTcwNjQ3ODcyMQ@@._V1_SX400_.jpg",
    "plot": "A young couple struggles to repair a hopelessly dilapidated house.",
    "title": "The Money Pit",
    "rank": 4095,
    "running_time_secs": 5460,
    "actors": [
      "Tom Hanks",
      "Shelley Long",
      "Alexander Godunov"
    ],
    "year": 1986,
    "id": "tt0091541"
  },
  "highlight": {
    "plot": [
      "A young couple struggles to repair a hopelessly dilapidated <em>house</em>."
    ]
  }
}
```

デフォルトでは、OpenSearch は一致する文字列を `<em>` タグで囲み、一致した文字列の前後 100 文字のコンテキストを提供します。また、区切り記号、スペース、タブ、改行を識別してコンテンツをセンテンスに分割します。これらの設定はすべてカスタマイズ可能です。

```
POST https://search-{{my-domain}}.{{us-west-1.}}es.amazonaws.com/movies/_search
{
  "size": 20,
  "query": {
    "multi_match": {
      "query": "house",
      "fields": ["title^4", "plot^2", "actors", "directors"]
    }
  },
  "highlight": {
    "fields": {
      "plot": {}
    },
    "pre_tags": "<strong>",
    "post_tags": "</strong>",
    "fragment_size": 200,
    "boundary_chars": ".,!? "
  }
}
```

### Count API
<a name="searching-dsl-count"></a>

ドキュメントの内容に関心がなく、一致の数だけを知りたい場合は、`_search` API の代わりに `_count` API を使用できます。次のリクエストでは、`query_string` クエリを使用してロマンチックコメディを識別します。

```
POST https://search-{{my-domain}}.{{us-west-1.}}es.amazonaws.com/movies/_count
{
  "query": {
    "query_string": {
      "default_field": "genres",
      "query": "romance AND comedy"
    }
  }
}
```

以下にレスポンスの例を示します。

```
{
  "count": 564,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  }
}
```

## 検索結果のページ分割
<a name="searching-paginating"></a>

大量の検索結果を表示する必要がある場合は、さまざまな方法を使用してページネーションを実装できます。

### ポイントインタイム
<a name="pag-pit"></a>

ポイントインタイム (PIT) 機能とは、時間が固定されているデータセットにさまざまなクエリを実行できる、検索の一種です。こちらは、OpenSearch、特にディープページネーションを行う場合に推奨される、ページネーションの方法です。PIT は、OpenSearch Service バージョン 2.5 以降で使用できます。PIT の詳細については「[Amazon OpenSearch Service のポイントインタイム検索](pit.md)」を参照してください。

### `from` と `size` のパラメーター
<a name="pag-from-size"></a>

ページ分割の最も簡単な方法は、`from` と `size` パラメータを使用した方法です。次のリクエストは、検索結果のゼロから始まるインデックスリストのうち、20～39 までの結果を返します。

```
POST https://search-{{my-domain}}.{{us-west-1.}}es.amazonaws.com/movies/_search
{
  "from": 20,
  "size": 20,
  "query": {
    "multi_match": {
      "query": "house",
      "fields": ["title^4", "plot^2", "actors", "directors"]
    }
  }
}
```

検索ページネーションの詳細については、「OpenSearch ドキュメント」の「[ページネーションの結果](https://opensearch.org/docs/latest/opensearch/search/paginate/)」を参照してください。

## Dashboards Query Language
<a name="DashboardsQueryLanguages"></a>

[Dashboards Query Language (DQL)](https://opensearch.org/docs/latest/dashboards/dql/#terms-query) を使用して、OpenSearch Dashboards でデータと視覚化を検索できます。DQL は、*用語*、*ブール値*、*日付と範囲*、および*ネストされたフィールド*の 4 つの主要なクエリタイプを使用します。

**用語のクエリ**

用語クエリでは、検索する用語を指定する必要があります。

用語クエリを実行するには、次のように入力します。

```
host:www.example.com
```

**ブール値クエリ**

ブール演算子 `AND`、`or`、および `not` を使用して、複数のクエリを組み合わせることができます。

ブール値クエリを実行するには、次を貼り付けます。

```
host.keyword:www.example.com and response.keyword:200
```

**日付と範囲のクエリ**

日付と範囲のクエリを使用して、クエリの前後の日付を検索できます。
+ `>` は、指定した日付より後の日付を検索することを示します。
+ `<` は、指定した日付より前の日付を検索することを示します。

`@timestamp > "2020-12-14T09:35:33"`

**ネストされたフィールドのクエリ**

ネストされたフィールドを持つドキュメントがある場合は、ドキュメントのどの部分を取得するかを指定する必要があります。ネストされたフィールドを含むサンプルドキュメントを次に示します。

```
{"NBA players":[
    {"player-name": "Lebron James",
      "player-position": "Power forward",
      "points-per-game": "30.3"
    },
    {"player-name": "Kevin Durant",
      "player-position": "Power forward",
      "points-per-game": "27.1"
    },
    {"player-name": "Anthony Davis",
      "player-position": "Power forward",
      "points-per-game": "23.2"
    },
    {"player-name": "Giannis Antetokounmpo",
      "player-position": "Power forward",
      "points-per-game":"29.9"
    }
  ]
}
```

DQL を使用して特定のフィールドを取得するには、次を貼り付けます。

```
NBA players: {player-name: Lebron James}
```

ネストされたドキュメントから複数のオブジェクトを取得するには、次を貼り付けます。

```
NBA players: {player-name: Lebron James} and NBA players: {player-name: Giannis Antetokounmpo}
```

範囲内を検索するには、次を貼り付けます。

```
NBA players: {player-name: Lebron James} and NBA players: {player-name: Giannis Antetokounmpo and < 30}
```

別のオブジェクト内にネストされたオブジェクトがドキュメントにある場合でも、すべてのレベルを指定することでデータを取得できます。これを実行するには、次を貼り付けます。

```
Top-Power-forwards.NBA players: {player-name:Lebron James}
```