用語クエリ

指定されたフィールドに1つ以上の正確な用語を含むドキュメントを返します。

  1. ## 例リクエスト
  2. 次の検索は、`````user.id`````フィールドに`````kimchy`````または`````elkbee`````を含むドキュメントを返します。
  3. #### Python
  4. ``````python
  5. resp = client.search(
  6. query={
  7. "terms": {
  8. "user.id": [
  9. "kimchy",
  10. "elkbee"
  11. ],
  12. "boost": 1
  13. }
  14. },
  15. )
  16. print(resp)
  17. `

Ruby

  1. response = client.search(
  2. body: {
  3. query: {
  4. terms: {
  5. 'user.id' => [
  6. 'kimchy',
  7. 'elkbee'
  8. ],
  9. boost: 1
  10. }
  11. }
  12. }
  13. )
  14. puts response

Js

  1. const response = await client.search({
  2. query: {
  3. terms: {
  4. "user.id": ["kimchy", "elkbee"],
  5. boost: 1,
  6. },
  7. },
  8. });
  9. console.log(response);

コンソール

  1. GET /_search
  2. {
  3. "query": {
  4. "terms": {
  5. "user.id": [ "kimchy", "elkbee" ],
  6. "boost": 1.0
  7. }
  8. }
  9. }

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

  • <field>
  • (オプション、オブジェクト) 検索したいフィールド。
    このパラメータの値は、指定されたフィールドで見つけたい用語の配列です。ドキュメントを返すには、1つ以上の用語がフィールド値と正確に一致する必要があります。空白や大文字小文字も含まれます。
    デフォルトでは、Elasticsearchはtermsクエリを最大65,536用語に制限します。この制限は、index.max_terms_count設定を使用して変更できます。
    既存のドキュメントのフィールド値を検索用語として使用するには、boostパラメータを使用します。
  • boost
  • (オプション、浮動小数点数) クエリの関連スコアを減少または増加させるために使用される浮動小数点数。デフォルトは1.0です。
    boostパラメータを使用して、2つ以上のクエリを含む検索の関連スコアを調整できます。
    ブースト値は1.0のデフォルト値に対して相対的です。01.0の間のブースト値は関連スコアを減少させます。1.0より大きい値は関連スコアを増加させます。

ノート

用語クエリのハイライト

ハイライトは最善の努力のみです。Elasticsearchは、次の理由によりtermsクエリのハイライト結果を返さない場合があります:

  • ハイライターの種類
  • クエリ内の用語の数

用語ルックアップ

用語ルックアップは、既存のドキュメントのフィールド値を取得します。Elasticsearchは、その値を検索用語として使用します。これは、大量の用語を検索する際に役立ちます。

用語ルックアップを実行するには、フィールドの_sourceを有効にする必要があります。リモートインデックスで用語ルックアップを実行するためにクロスクラスタ検索を使用することはできません。

デフォルトでは、Elasticsearchはtermsクエリを最大65,536用語に制限します。これには、用語ルックアップを使用して取得された用語が含まれます。この制限は、index.max_terms_count設定を使用して変更できます。

ネットワークトラフィックを減少させるために、用語ルックアップは可能であればローカルデータノードのシャードからドキュメントの値を取得します。用語データが大きくない場合は、ネットワークトラフィックを最小限に抑えるために、すべての適用可能なデータノードに完全に複製された単一のプライマリシャードを持つインデックスを使用することを検討してください。

用語ルックアップを実行するには、次のパラメータを使用します。

用語ルックアップパラメータ

  • index
  • (必須、文字列) フィールド値を取得するインデックスの名前。
  • id
  • (必須、文字列) フィールド値を取得するドキュメントのID
  • path
  • (必須、文字列) フィールド値を取得するフィールドの名前。Elasticsearchはこれらの値をクエリの検索用語として使用します。
    フィールド値にネストされた内部オブジェクトの配列が含まれている場合、ドット表記法を使用してそれらのオブジェクトにアクセスできます。
  • routing
  • (オプション、文字列) 用語値を取得するドキュメントのカスタムルーティング値。ドキュメントがインデックスされたときにカスタムルーティング値が提供された場合、このパラメータは必須です。

用語ルックアップの例

用語ルックアップがどのように機能するかを確認するには、次の例を試してください。

  • 1. keywordフィールド名のcolorを持つインデックスを作成します。

Python

  1. resp = client.indices.create(
  2. index="my-index-000001",
  3. mappings={
  4. "properties": {
  5. "color": {
  6. "type": "keyword"
  7. }
  8. }
  9. },
  10. )
  11. print(resp)

Ruby

  1. response = client.indices.create(
  2. index: 'my-index-000001',
  3. body: {
  4. mappings: {
  5. properties: {
  6. color: {
  7. type: 'keyword'
  8. }
  9. }
  10. }
  11. }
  12. )
  13. puts response

Go

  1. res, err := es.Indices.Create(
  2. "my-index-000001",
  3. es.Indices.Create.WithBody(strings.NewReader(`{
  4. "mappings": {
  5. "properties": {
  6. "color": {
  7. "type": "keyword"
  8. }
  9. }
  10. }
  11. }`)),
  12. )
  13. fmt.Println(res, err)

Js

  1. const response = await client.indices.create({
  2. index: "my-index-000001",
  3. mappings: {
  4. properties: {
  5. color: {
  6. type: "keyword",
  7. },
  8. },
  9. },
  10. });
  11. console.log(response);

コンソール

  1. PUT my-index-000001
  2. {
  3. "mappings": {
  4. "properties": {
  5. "color": { "type": "keyword" }
  6. }
  7. }
  8. }
  • 2. IDが1で["blue", "green"]の値をcolorフィールドに持つドキュメントをインデックスします。

Python

  1. resp = client.index(
  2. index="my-index-000001",
  3. id="1",
  4. document={
  5. "color": [
  6. "blue",
  7. "green"
  8. ]
  9. },
  10. )
  11. print(resp)

Ruby

  1. response = client.index(
  2. index: 'my-index-000001',
  3. id: 1,
  4. body: {
  5. color: [
  6. 'blue',
  7. 'green'
  8. ]
  9. }
  10. )
  11. puts response

Go

  1. res, err := es.Index(
  2. "my-index-000001",
  3. strings.NewReader(`{
  4. "color": [
  5. "blue",
  6. "green"
  7. ]
  8. }`),
  9. es.Index.WithDocumentID("1"),
  10. es.Index.WithPretty(),
  11. )
  12. fmt.Println(res, err)

Js

  1. const response = await client.index({
  2. index: "my-index-000001",
  3. id: 1,
  4. document: {
  5. color: ["blue", "green"],
  6. },
  7. });
  8. console.log(response);

コンソール

  1. PUT my-index-000001/_doc/1
  2. {
  3. "color": ["blue", "green"]
  4. }
  • 3. IDが2でblueの値をcolorフィールドに持つ別のドキュメントをインデックスします。

Python

  1. resp = client.index(
  2. index="my-index-000001",
  3. id="2",
  4. document={
  5. "color": "blue"
  6. },
  7. )
  8. print(resp)

Ruby

  1. response = client.index(
  2. index: 'my-index-000001',
  3. id: 2,
  4. body: {
  5. color: 'blue'
  6. }
  7. )
  8. puts response

Go

  1. res, err := es.Index(
  2. "my-index-000001",
  3. strings.NewReader(`{
  4. "color": "blue"
  5. }`),
  6. es.Index.WithDocumentID("2"),
  7. es.Index.WithPretty(),
  8. )
  9. fmt.Println(res, err)

Js

  1. const response = await client.index({
  2. index: "my-index-000001",
  3. id: 2,
  4. document: {
  5. color: "blue",
  6. },
  7. });
  8. console.log(response);

コンソール

  1. PUT my-index-000001/_doc/2
  2. {
  3. "color": "blue"
  4. }
  • 4. termsクエリを用語ルックアップパラメータと共に使用して、ドキュメント2と同じ用語の1つ以上を含むドキュメントを見つけます。応答がより読みやすくなるようにprettyパラメータを含めます。

Python

  1. resp = client.search(
  2. index="my-index-000001",
  3. pretty=True,
  4. query={
  5. "terms": {
  6. "color": {
  7. "index": "my-index-000001",
  8. "id": "2",
  9. "path": "color"
  10. }
  11. }
  12. },
  13. )
  14. print(resp)

Ruby

  1. response = client.search(
  2. index: 'my-index-000001',
  3. pretty: true,
  4. body: {
  5. query: {
  6. terms: {
  7. color: {
  8. index: 'my-index-000001',
  9. id: '2',
  10. path: 'color'
  11. }
  12. }
  13. }
  14. }
  15. )
  16. puts response

Go

  1. res, err := es.Search(
  2. es.Search.WithIndex("my-index-000001"),
  3. es.Search.WithBody(strings.NewReader(`{
  4. "query": {
  5. "terms": {
  6. "color": {
  7. "index": "my-index-000001",
  8. "id": "2",
  9. "path": "color"
  10. }
  11. }
  12. }
  13. }`)),
  14. es.Search.WithPretty(),
  15. )
  16. fmt.Println(res, err)

Js

  1. const response = await client.search({
  2. index: "my-index-000001",
  3. pretty: "true",
  4. query: {
  5. terms: {
  6. color: {
  7. index: "my-index-000001",
  8. id: "2",
  9. path: "color",
  10. },
  11. },
  12. },
  13. });
  14. console.log(response);

コンソール

  1. GET my-index-000001/_search?pretty
  2. {
  3. "query": {
  4. "terms": {
  5. "color" : {
  6. "index" : "my-index-000001",
  7. "id" : "2",
  8. "path" : "color"
  9. }
  10. }
  11. }
  12. }

ドキュメント2とドキュメント1の両方がbluecolorフィールドの値として含んでいるため、Elasticsearchは両方のドキュメントを返します。

コンソール-結果

  1. {
  2. "took" : 17,
  3. "timed_out" : false,
  4. "_shards" : {
  5. "total" : 1,
  6. "successful" : 1,
  7. "skipped" : 0,
  8. "failed" : 0
  9. },
  10. "hits" : {
  11. "total" : {
  12. "value" : 2,
  13. "relation" : "eq"
  14. },
  15. "max_score" : 1.0,
  16. "hits" : [
  17. {
  18. "_index" : "my-index-000001",
  19. "_id" : "1",
  20. "_score" : 1.0,
  21. "_source" : {
  22. "color" : [
  23. "blue",
  24. "green"
  25. ]
  26. }
  27. },
  28. {
  29. "_index" : "my-index-000001",
  30. "_id" : "2",
  31. "_score" : 1.0,
  32. "_source" : {
  33. "color" : "blue"
  34. }
  35. }
  36. ]
  37. }
  38. }