Запрос ElasticSearch для получения точных результатов из Документов - PullRequest
0 голосов
/ 20 февраля 2019

У меня есть индекс (имя: "index1"), указывающий на несколько документов в ElasticSearch.

Формат (json) документа - -

{
  "_index": "index1",
  "_type": "someType",
  "_id": "randomIDBlahBlah",
  "_source": {
    "version": "2018",
    "fields": [
      {
        "field": "A.B",
        "lineNumber": 1
      },
      {
        "field": "C.D",
        "lineNumber": 2
      },
      {
        "field": "A.E",
        "lineNumber": 3
      }]
  },
  "fields": {
    "created": [
      "2017-01-19T20:11:07.977Z"
    ]
  },
  "sort": [
    2324343
  ]
}

Вот отображение-

{
  "index1": {
    "mappings": {
      "mapping": {
        "properties": {
          "branch": {
            "type": "text"
          },
          "created": {
            "type": "date"
          },
          "fields": {
            "type": "nested",
            "properties": {
              "field": {
                "type": "text"
              },
              "lineNumber": {
                "type": "integer"
              }
            }
          }
        }
      }
    }
  }
}

Аналогично, в этом индексе есть несколько документов одного формата, но разные данные поля.

Теперь я пытаюсь выполнить упомянутый ниже упругий поиск в определенном поле.(здесь - AB), он дает мне все результаты из всех документов, как будто это поиск по всем полям.

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

Это мой запрос ES -

POST index1/_search
{
 "query": {
   "bool": {
     "must": [
       {
         "bool": {
           "should": [
             {
               "nested": {
                 "path": "fields",
                 "query": {
                   "match_phrase": {
                     "fields.field": "A.B"
                   }
                 }
               }
             }
           ]
         }
       }
     ]
   }
 }
}

Где я ошибаюсь в запросе ES?

Ответы [ 2 ]

0 голосов
/ 20 февраля 2019

Используемый вами запрос даст вам желаемый результат.Это может быть лучше написано, как показано ниже, если вам не нужна оценка:

{
  "query": {
    "bool": {
      "filter": [
        {
          "nested": {
            "path": "fields",
            "query": {
              "match": {
                "fields.field": "A.B"
              }
            },
            "inner_hits": {
               "size": 10
            }           
          }
        }
      ]
    }
  },
  "_source": {
     "excludes": [
        "fields"
     ]
  }
}

Внутренние попадания - это то, что вы ищете.При совпадении эластик возвращает весь вложенный объект.Если вам нужны только совпадающие вложенные объекты, вы должны использовать inner_hits.

ОБНОВЛЕНИЕ : если никакие поля не требуются, кроме внутренних попаданий, вы можете установить "_source":false.Вы также можете использовать include и exclude до источника фильтра согласно вашему требованию

0 голосов
/ 20 февраля 2019

Если ваше поле не является типом ключевое слово , то вы должны добавить тип .keyword

, которое автоматически генерируется ES в полях "type": "text"

GET index1/_search
{
 "query": {
   "bool": {
     "must": [
       {
         "bool": {
           "should": [
             {
               "nested": {
                 "path": "fields",
                 "query": {
                   "match_phrase": {
                     "fields.field.keyword: "A.B"
                   }
                 }
               }
             }
           ]
         }
       }
     ]
   }
 }
}```
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...