Saya memiliki indeks seperti ini:

PUT job_offers
{
  "mappings": {
    "properties": {
      "location": {
        "properties": {
          "slug": {
            "type": "keyword"
          },
          "name": {
            "type": "text"
          }
        },
        "type": "nested"
      },
      "experience": {
        "properties": {
          "slug": {
            "type": "keyword"
          },
          "name": {
            "type": "text"
          }
        },
        "type": "nested"
      }
    }
  }
}

Saya memasukkan objek ini:

POST job_offers/_doc
{
  "title": "Junior Ruby on Rails Developer",
  "location": [
    {
      "slug": "new-york",
      "name": "New York"
    },
    {
      "slug": "atlanta",
      "name": "Atlanta"
    },
    {
      "slug": "remote",
      "name": "Remote"
    }
  ],
  "experience": [
    {
      "slug": "junior",
      "name": "Junior"
    }
  ]
}

Kueri ini mengembalikan 0 dokumen.

GET job_offers/_search
{
  "query": {
    "terms": {
      "location.slug": [
        "remote",
        "new-york"
      ]
    }
  }
}

Bisakah Anda menjelaskan kepada saya mengapa? Saya pikir itu harus mengembalikan dokumen di mana location.slug adalah remote atau new-york.

0
Marcin Doliwa 9 April 2020, 15:04

1 menjawab

Jawaban Terbaik

Kueri Bersarang telah sintaks yang berbeda

GET job_offers/_search
{
  "query": {
    "nested": {
      "path": "location",
      "query": {
        "terms": {
          "location.slug": ["remote","new-york"]
        }
      }
    }
  }
}

Hasil:

  "hits" : [
      {
        "_index" : "job_offers",
        "_type" : "_doc",
        "_id" : "wWjoXnEBs0rCGpYsvUf4",
        "_score" : 1.0,
        "_source" : {
          "title" : "Junior Ruby on Rails Developer",
          "location" : [
            {
              "slug" : "new-york",
              "name" : "New York"
            },
            {
              "slug" : "atlanta",
              "name" : "Atlanta"
            },
            {
              "slug" : "remote",
              "name" : "Remote"
            }
          ],
          "experience" : [
            {
              "slug" : "junior",
              "name" : "Junior"
            }
          ]
        }
      }
    ]

Ini akan mengembalikan seluruh dokumen di mana location.slug cocok dengan "remote" atau "new-york". Jika Anda ingin mendapatkan dokumen bersarang yang cocok, Anda perlu menggunakan inner_hits

GET job_offers/_search
{
  "query": {
    "nested": {
      "path": "location",
      "query": {
        "terms": {
          "location.slug": ["remote","new-york"]
        }
      },
      "inner_hits": {} --> note
    }
  }
}

Hasil:

"hits" : [
      {
        "_index" : "job_offers",
        "_type" : "_doc",
        "_id" : "wWjoXnEBs0rCGpYsvUf4",
        "_score" : 1.0,
        "_source" : {
          "title" : "Junior Ruby on Rails Developer",
          "location" : [
            {
              "slug" : "new-york",
              "name" : "New York"
            },
            {
              "slug" : "atlanta",
              "name" : "Atlanta"
            },
            {
              "slug" : "remote",
              "name" : "Remote"
            }
          ],
          "experience" : [
            {
              "slug" : "junior",
              "name" : "Junior"
            }
          ]
        },
        "inner_hits" : {  --> will give matched nested object
          "location" : {
            "hits" : {
              "total" : {
                "value" : 2,
                "relation" : "eq"
              },
              "max_score" : 1.0,
              "hits" : [
                {
                  "_index" : "job_offers",
                  "_type" : "_doc",
                  "_id" : "wWjoXnEBs0rCGpYsvUf4",
                  "_nested" : {
                    "field" : "location",
                    "offset" : 0
                  },
                  "_score" : 1.0,
                  "_source" : {
                    "slug" : "new-york",
                    "name" : "New York"
                  }
                },
                {
                  "_index" : "job_offers",
                  "_type" : "_doc",
                  "_id" : "wWjoXnEBs0rCGpYsvUf4",
                  "_nested" : {
                    "field" : "location",
                    "offset" : 2
                  },
                  "_score" : 1.0,
                  "_source" : {
                    "slug" : "remote",
                    "name" : "Remote"
                  }
                }
              ]
            }
          }
        }
      }
    ]

Saya juga melihat bahwa Anda menggunakan dua bidang untuk data yang sama dengan tipe yang berbeda. jika data sama di kedua bidang (nama dan siput) dan hanya tipe data yang berbeda, Anda dapat menggunakan bidang untuk itu

Seringkali berguna untuk mengindeks bidang yang sama dengan cara yang berbeda untuk tujuan yang berbeda. Ini adalah tujuan dari multi-bidang. Misalnya, bidang string dapat dipetakan sebagai bidang teks untuk pencarian teks lengkap, dan sebagai bidang kata kunci untuk pengurutan atau agregasi:

Dalam hal ini pemetaan Anda akan menjadi di bawah

PUT job_offers
{
  "mappings": {
    "properties": {
      "location": {
        "properties": {
          "name": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword"
              }
            }
          }
        },
        "type": "nested"
      },
      "experience": {
        "properties": {
          "name": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword"
              }
            }
          }
        },
        "type": "nested"
      }
    }
  }
}
1
jaspreet chahal 9 April 2020, 12:40