Как получить только значения элементов, которые соответствуют списку в Elastic Search? - PullRequest
0 голосов
/ 29 декабря 2018

[Привет!]

Я хочу создать запрос ES, который извлекает только определенные элементы, которые совпадают в списке.

Вот моя схема индекса ES.

"test-es-2018":{
"aliases": {}, 
"mappings": { 
  "test-1": { 
    "properties": { 
      "categoryName": { 
        "type": "keyword", 
        "index": false 
      }, 
      "genDate": { 
        "type": "date" 
      }, 
      "docList": { 
        "properties": { 
          "rank": { 
            "type": "integer", 
            "index": false 
          }, 
          "doc-info": {
            "properties": { 
              "docId": { 
                "type": "keyword" 
              }, 
              "docName": { 
                "type": "keyword", 
                "index": false 
              }, 
            } 
          }
        } 
      }, 
      "categoryId": { 
        "type": "keyword" 
      }, 
    } 
  }
} 

}

В этой категории перечислены документы.Документы в списке имеют свою собственную информацию.

* поисковый запрос в Кибане.

source": { 
        "categoryName" : "food" , 
        "genDate" : 1577981646638, 
        "docList" [
        {
          "rank": 2, 
          "doc-info": {...} 
        },
        {
          "rank": 1, 
          "doc-info": {...} 
        },
        {
          "rank": 5, 
          "doc-info": {...}
        },
       ],
       "categoryId": "201"
       }

Сначала я хочу получить только значение элемента, которое соответствует вlist.

Я бы хотел видеть в списке только документы с рангом 1.Однако, если я сделаю запрос, используя match, как показано ниже, результат будет таким же, как и * поисковый запрос в кибане .

* запрос на совпадение в Кибане.

GET test-es-2018/_search
{
  "query": {
    "bool": {
      "must": [
        { "match": { "docList.rank": 1 } },
      ] 
    }
  }
}

На мой взгляд, кажется, что распечатывается весь список, потому что он содержит документ с рангом 1.

Что я хочу:

source": { 
        "categoryName" : "food" , 
        "genDate" : 1577981646638, 
        "docList" [
          {
            "rank": 1, 
            "doc-info": {...} 
          },
       ],
       "categoryId": "201"
       }

Возможно ли это?

Во-вторых, я хочу отсортировать список документов по рангу.Я попытался отсортировать, создав запрос, подобный следующему, но он не был отсортирован.

* запрос сортировки в Кибане.

GET test-es-2018/_search? 
{
  "query" : {
    "bool" : {...}
  },
  "sort" : [
    {
      "docList.rank" : {
          "order" : "asc"
      }
    }
  ]
}

Что я хочуis:

source": { 
    "categoryName" : "food" , 
    "genDate" : 1577981646638, 
    "docList" [
    {
      "rank": 1, 
      "doc-info": {...} 
    },
    {
      "rank": 2, 
      "doc-info": {...} 
    },
    {
      "rank": 5, 
      "doc-info": {...}
    },
   ],
   "categoryId": "201"
   }

Я не знаю, как получить доступ к списку.Есть ли хорошая идея для обеих этих проблем?

1 Ответ

0 голосов
/ 30 декабря 2018
  1. Как правило, вы можете использовать фильтр источника для извлечения только части документа, но таким образом невозможно исключить некоторые поля на основе их значений.
  2. НасколькоЯ знаю, что Elasticsearch не поддерживает изменение порядка значений полей в _source .Частично желаемый результат может быть достигнут с помощью полей nested вместе с inner_hits -> sort выражением запроса.Таким образом, отсортированные субхиты будут возвращены в разделе inner_hits ответа.

PS Обычно при работе с Elasticsearch индексированный документ следует рассматривать как наименьшую неделимую единицу поиска.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...