Есть ли способ добавить поле в документ, но скрыть его от _source, также документ должен быть проанализирован и доступен для поиска - PullRequest
1 голос
/ 25 марта 2019

Я хочу добавить одно поле к документу, которое должно быть доступно для поиска, но когда мы получаем / ищем, оно не должно появляться в _source.

Я пробовал индексировать и хранить параметры, но через него это невозможно. Это больше похоже на _all или copy_to, но в моем случае значение предоставляется мной (не собирая из других полей документа.)

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

Когда я кладу документ:

PUT my_index/_doc/1
{
  "title":   "Some short title",
  "date":    "2015-01-01",
  "content": "A very long content field..."
}

и поискать

GET my_index / _search

вывод должен быть

{
    "hits" : {
    "total" : 1,
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "my_index",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 1.0,
        "_source" : {
          "title" : "Some short title",
          "date" : "2015-01-01"
        }
      }
    ]
  }
}

также, когда я делаю поиск ниже

GET my_index/_search
{
  "query": {
    "query_string": {
      "default_field": "content",
      "query": "long content"
    }
  }
}

это должно привести меня

"hits" : {
    "total" : 1,
    "max_score" : 0.5753642,
    "hits" : [
      {
        "_index" : "my_index",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 0.5753642,
        "_source" : {
          "title" : "Some short title",
          "date" : "2015-01-01"
        }
      }
    ]
  }

Ответы [ 2 ]

1 голос
/ 29 марта 2019

Мы можем добиться этого, используя приведенное ниже сопоставление:

PUT my_index
{
  "mappings": {

    "_doc": {
      "_source": {
        "excludes": [
          "content"
        ]
      },
      "properties": {
        "title": {
          "type": "text",
          "store": true 
        },
        "date": {
          "type": "date",
          "store": true 
        },
        "content": {
          "type": "text"
        }
      }
    }
  }
}

Добавить документ:

PUT my_index/_doc/1
{
  "title":   "Some short title",
  "date":    "2015-01-01",
  "content": "A very long content field..."
}

При запуске запроса для поиска контента в поле «контент»:

GET my_index/_search
{
  "query": {
    "query_string": {
      "default_field": "content",
      "query": "long content"
    }
  }
}

Вы получите результат с попаданиями, как показано ниже:

"hits" : {
    "total" : 1,
    "max_score" : 0.5753642,
    "hits" : [
      {
        "_index" : "my_index",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 0.5753642,
        "_source" : {
          "date" : "2015-01-01",
          "title" : "Some short title"
        }
      }
    ]
  }

Он скрывает поле «содержимое».:)

Следовательно достигнуто с помощью картирования.Вам не нужно исключать его из запроса при каждом вызове get / search.

Подробнее читайте в источнике: https://www.elastic.co/guide/en/elasticsearch/reference/6.6/mapping-source-field.html

1 голос
/ 25 марта 2019

Просто используйте фильтрацию источника , чтобы исключить поле content:

GET my_index/_search
{
  "_source": {
    "excludes": [ "content" ]
  },
  "query": {
    "query_string": {
      "default_field": "content",
      "query": "long content"
    }
  }
}
...