Эластичный поиск получает элементы в массиве, которые все соответствуют требованиям?

#elasticsearch

#elasticsearch

Вопрос:

Я действительно новичок в эластичном поиске, и теперь заблокирован одной проблемой.

Если я использую GET http://127.0.0.1:9200/index/type/_search , в результате получается

 {
  "took": 1,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "failed": 0
  },
  "hits": {
    "total": 3,
    "max_score": 1,
    "hits": [
      {
        "_index": "index",
        "_type": "type",
        "_id": "AVe3AcpYbUIbMIPUYcZ2",
        "_score": 1,
        "_source": {
          "applications": [
            {
              "jobs": [
                {
                  "id": 1,
                  "country": "a"
                },
                {
                  "id": 2,
                  "country": "b"
                }
              ]
            },
            {
              "jobs": [
                {
                  "id": 3,
                  "country": "c"
                },
                {
                  "id": 4,
                  "country": "d"
                }
              ]
            }
          ]
        }
      },
      {
        "_index": "index",
        "_type": "type",
        "_id": "AVe3cMaPbUIbMIPUYcaS",
        "_score": 1,
        "_source": {
          "applications": [
            {
              "jobs": [
                {
                  "id": 11,
                  "country": "aa"
                },
                {
                  "id": 2,
                  "country": "aa"
                }
              ]
            },
            {
              "jobs": [
                {
                  "id": 33,
                  "country": "aa"
                },
                {
                  "id": 44,
                  "country": "aa"
                }
              ]
            }
          ]
        }
      },
      {
        "_index": "index",
        "_type": "type",
        "_id": "AVe3b1KmbUIbMIPUYcaR",
        "_score": 1,
        "_source": {
          "applications": [
            {
              "jobs": [
                {
                  "id": 11,
                  "country": "aa"
                },
                {
                  "id": 2,
                  "country": "bb"
                }
              ]
            },
            {
              "jobs": [
                {
                  "id": 33,
                  "country": "cc"
                },
                {
                  "id": 44,
                  "country": "d"
                }
              ]
            }
          ]
        }
      }
    ]
  }
}
  

я хочу получить одно приложение, в котором каждая job.country в приложении является «aa», поэтому ожидаемый результат

 "applications": [
            {
              "jobs": [
                {
                  "id": 11,
                  "country": "aa"
                },
                {
                  "id": 2,
                  "country": "aa"
                }
              ]
            },
            {
              "jobs": [
                {
                  "id": 33,
                  "country": "aa"
                },
                {
                  "id": 44,
                  "country": "aa"
                }
              ]
            }
          ]
  

Что я пробовал, так это POST http://127.0.0.1:9200/index/type/_search

 {
    "query": {
        "match": {
            "applications.jobs.country": "aa"
        }
    }
}
  

Но результат

 {
  "took": 65,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "failed": 0
  },
  "hits": {
    "total": 2,
    "max_score": 0.30685282,
    "hits": [
      {
        "_index": "index",
        "_type": "type",
        "_id": "AVe3cMaPbUIbMIPUYcaS",
        "_score": 0.30685282,
        "_source": {
          "applications": [
            {
              "jobs": [
                {
                  "id": 11,
                  "country": "aa"
                },
                {
                  "id": 2,
                  "country": "aa"
                }
              ]
            },
            {
              "jobs": [
                {
                  "id": 33,
                  "country": "aa"
                },
                {
                  "id": 44,
                  "country": "aa"
                }
              ]
            }
          ]
        }
      },
      {
        "_index": "index",
        "_type": "type",
        "_id": "AVe3b1KmbUIbMIPUYcaR",
        "_score": 0.15342641,
        "_source": {
          "applications": [
            {
              "jobs": [
                {
                  "id": 11,
                  "country": "aa"
                },
                {
                  "id": 2,
                  "country": "bb"
                }
              ]
            },
            {
              "jobs": [
                {
                  "id": 33,
                  "country": "cc"
                },
                {
                  "id": 44,
                  "country": "d"
                }
              ]
            }
          ]
        }
      }
    ]
  }
}
  

Кажется, что если приложение содержит applications.jobs.country, соответствующее требованиям, оно будет возвращено. и я хочу получить каждый элемент в приложениях.задания соответствуют потребностям. кто-нибудь может мне помочь? Спасибо

Ответ №1:

Я использую регулярное выражение для временного решения этой проблемы. СООБЩЕНИЕ http://127.0.0.1:9200/index/type/_search

 {
    "query": {
        "bool": {
            "must_not": {
                "regexp": {
                    "applications.jobs.country": "~(.*aa.*)"
                }
            }
        }
    }
}
  

не должно содержать, что applications.jobs.country содержит другие, чем «aa»