ElasticSearch исходный фильтрующий массив объектов

Вот документ

{
  "Id": "1",
  "Name": "Thing",
  "Prices": [
    {"CompanyId": "1", "Price": "11.11"},
    {"CompanyId": "2", "Price": "12.12"},
    {"CompanyId": "3", "Price": "13.13"}

А вот связанная схема ElasticSearch:

"Prices" : {
    "type" : "nested",
    "properties" : {
        "CompanyId": {
            "type" : "integer"
        },
        "Price" : {
            "type" : "scaled_float",
            "scaling_factor" : 100
        }
    }
}

Если пользователь покупает за CompantId = 3, то поставщик не хочет, чтобы он мог видеть льготную цену, скажем, за CompanyId = 1.

Поэтому мне нужно использовать исходный фильтр, чтобы удалить все цены, для которых CompanyId не равно 3.

Я обнаружил, что это работает.

"_source":{
  "excludes": ["Prices.companyId.CompanyId"]
}

Но я не понимаю, как и почему. Это не может работать, потому что требуемый CompanyId нигде не упоминается во всем JSON поиска ElasticSearch.

Добавление полного поиска JSON:

{
   "query":{
      "bool":{
         "must":[
            {
               "match_all":{

               }
            }
         ],
         "filter":{
            "match":{
               "PurchasingViews":6060
            }
         }
      }
   },
   "size":20,
   "aggs":{
      "CompanyName.raw":{
         "terms":{
            "field":"CompanyName.raw",
            "size":20,
            "order":{
               "_count":"desc"
            }
         }
      }
   },
   "_source":{
      "excludes":[
         "PurchasingViews",
         "ContractFilters",
         "SearchField*",
         "Keywords*",
         "Menus*",
         "Prices.companyId.CompanyId"
      ]
   }
}

Результат:

{
   "took":224,
   "timed_out":false,
   "_shards":{
      "total":5,
      "successful":5,
      "skipped":0,
      "failed":0
   },
   "hits":{
      "total":1173525,
      "max_score":1.0,
      "hits":[
         {
            "_index":"products_purchasing",
            "_type":"product_purchasing",
            "_id":"12787114",
            "_score":1.0,
            "_source":{
               "CompanyName":"...",
               "Prices":[
                  {
                     "CompanyId":1474,
                     "Price":697.3
                  }
               ],
               "CompanyId":571057,
               "PartNumber":"...",
               "LongDescription_en":"...",
               "Name_en":"...",
               "DescriptionSnippet_en":"...",
               "ProductId":9605985,
               "Id":12787114
            }
         }
      ]
   },
   "aggregations":{
      "CompanyName.raw":{
         "doc_count_error_upper_bound":84,
         "sum_other_doc_count":21078,
         "buckets":[
            {
               "key":"...",
               "doc_count":534039
            }
         ]
      }
   }
}

person Richard Barraclough    schedule 09.08.2019    source источник
comment
Можете ли вы показать запрос, который вы отправляете, и результат, который вы видите?   -  person Val    schedule 09.08.2019
comment
Можете ли вы вместо этого добавить все это к своему вопросу, так как это более разборчиво, спасибо   -  person Val    schedule 09.08.2019
comment
Просто выяснилось, что по стечению обстоятельств фильтр сводит результаты к документам, у которых только одна цена. Итак, остается вопрос: как мне написать исходный фильтр, чтобы удалить все цены, для которых CompanyId не равен 3.   -  person Richard Barraclough    schedule 09.08.2019


Ответы (1)


https://www.elastic.co/guide/en/elasticsearch/reference/current/nested.html

Я считаю, что то, как вы поместили свое сопоставление с «вложенным» типом, создало ссылку, которую вы ставите под сомнение.

Кроме того, я бы предложил сформулировать запрос как ищущий только 3, а не «исключая» все, кроме 3.

person user7594840    schedule 09.08.2019