Мне нужна помощь по запросу elasticsearch

Мне нужна помощь для запроса.

Это мой запрос и мой образец:

GET /product/_search
{
  "query": {
    "bool" : {
      "must" : {
        "multi_match" : {
          "query":    "Torsades", 
          "fields": [ "ean^10", "name^4", "brand" ] 
        }
      }
    }
  }
}

[
  {
    "_index" : "product_2022-05-13-194440",
    "_type" : "_doc",
    "_id" : "1",
    "_score" : 13.78764,
    "_source" : {
      "country" : 1,
      "ean" : "3250391967858",
      "name" : "Torsades Semi-complètes BIO - 500G",
      "brand" : "Fiorini"
    }
  },
  {
    "_index" : "product_2022-05-13-194440",
    "_type" : "_doc",
    "_id" : "74",
    "_score" : 13.78764,
    "_source" : {
      "country" : null,
      "ean" : "3564700009826",
      "name" : "Pâtes Torsades - Turini - 500 g",
      "brand" : "Turini"
    }
  },
  {
    "_index" : "product_2022-05-13-194440",
    "_type" : "_doc",
    "_id" : "78",
    "_score" : 11.964245,
    "_source" : {
      "country" : null,
      "ean" : "3250391967858",
      "name" : "Torsades Semi-complètes BIO - 500G - ITM BENCHMARK",
      "brand" : "Fiorini"
    }
  }
]

Мне нужно конкретное условие, и я не могу найти решение:

Я хочу :

ВСЕ продукты для страны = 1 И (ВСЕ продукты для страны = ноль МИНУС product.ean В стране = 1)

В моем образце я хочу иметь 2 попадания:

ЭТО удалено, потому что EAN в стране=1:

{
    "_index" : "product_2022-05-13-194440",
    "_type" : "_doc",
    "_id" : "78",
    "_score" : 11.964245,
    "_source" : {
      "country" : null,
      "ean" : "3250391967858",
      "name" : "Torsades Semi-complètes BIO - 500G - ITM BENCHMARK",
      "brand" : "Fiorini"
    }
}

У кого-то есть решение?

РЕДАКТИРОВАТЬ : Я хочу этот результат:

[
  {
    "_index" : "product_2022-05-13-194440",
    "_type" : "_doc",
    "_id" : "1",
    "_score" : 13.78764,
    "_source" : {
      "country" : 1,
      "ean" : "3250391967858",
      "name" : "Torsades Semi-complètes BIO - 500G",
      "brand" : "Fiorini"
    }
  },
  {
    "_index" : "product_2022-05-13-194440",
    "_type" : "_doc",
    "_id" : "74",
    "_score" : 13.78764,
    "_source" : {
      "country" : null,
      "ean" : "3564700009826",
      "name" : "Pâtes Torsades - Turini - 500 g",
      "brand" : "Turini"
    }
  }
]
0
0
41
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы пытались использовать Поле свертывается?

GET test/_search
{
  "query": {
    "bool": {
      "must": {
        "multi_match": {
          "query": "Torsades",
          "fields": [
            "ean^10",
            "name^4",
            "brand"
          ]
        }
      }
    }
  },
  "collapse": {
    "field": "ean.keyword"
  }
}

Ответ:

  "hits" : [
      {
        "_index" : "test",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 0.5611319,
        "_source" : {
          "country" : 1,
          "ean" : "3250391967858",
          "name" : "Torsades Semi-complètes BIO - 500G",
          "brand" : "Fiorini"
        },
        "fields" : {
          "ean.keyword" : [
            "3250391967858"
          ]
        }
      },
      {
        "_index" : "test",
        "_type" : "_doc",
        "_id" : "2",
        "_score" : 0.5611319,
        "_source" : {
          "country" : null,
          "ean" : "3564700009826",
          "name" : "Pâtes Torsades - Turini - 500 g",
          "brand" : "Turini"
        },
        "fields" : {
          "ean.keyword" : [
            "3564700009826"
          ]
        }
      }
    ]

Спасибо, я не знал этого поля! Это работает отлично. Но, чтобы быть уверенным, как Elastic делает между Country=1 и Country=null для получения хорошего? Мне нужно поле «сортировка»? Это зависит от порядка вставки в индекс? Спасибо !

Nowis 14.05.2022 20:19

Другие вопросы по теме