Вложенные поля «точка» в подсказке завершения

#elasticsearch

#elasticsearch

Вопрос:

Я хотел бы использовать вложенное поле «точка» в качестве ключа для подсказки завершения (используя ElasticSearch 6.4). Это работает нормально:

 PUT music/_doc/1?refresh
{
    "suggest.music" : {
        "input": [ "Nevermind", "Nirvana" ],
        "weight" : 34
    }
}
  

…но этот запрос с предложением не работает:

 POST music/_search?pretty
{
    "suggest": {
        "song-suggest" : {
            "prefix" : "nir", 
            "completion" : { 
                "field" : "suggest.music" 
            }
        }
    }
}
  

В нем говорится, что «для поля [suggest.music] не найдено сопоставление». Вот мое отображение:

 {
  "music" : {
    "aliases" : { },
    "mappings" : {
      "_doc" : {
        "properties" : {
          "es_suggest" : {
            "type" : "completion",
            "analyzer" : "simple",
            "preserve_separators" : true,
            "preserve_position_increments" : true,
            "max_input_length" : 50
          },
          "suggest" : {
            "properties" : {
              "music" : {
                "properties" : {
                  "input" : {
                    "type" : "text",
                    "fields" : {
                      "keyword" : {
                        "type" : "keyword",
                        "ignore_above" : 256
                      }
                    }
                  },
                  "weight" : {
                    "type" : "long"
                  }
                }
              }
            }
          },
          "title" : {
            "type" : "keyword"
          }
        }
      }
    },
    "settings" : {
      "index" : {
        "creation_date" : "1550842862212",
        "number_of_shards" : "5",
        "number_of_replicas" : "1",
        "uuid" : "Dqr3XQJWTqC5YRvJjEvh5w",
        "version" : {
          "created" : "6060099"
        },
        "provided_name" : "music"
      }
    }
  }
}
  

Есть ли какой-либо способ запросить предложение о завершении с помощью вложенного поля «точка»?

Ответ №1:

Вы пытаетесь выполнить из поля, suggest.music , которое не является полем завершения. В вашем сопоставлении es_suggest является полем завершения.

Вы можете изменить свое сопоставление, чтобы во вложенном объекте было поле завершения, если хотите:

 PUT music
{
  "aliases" : { },
  "mappings" : {
    "_doc" : {
      "properties" : {
        "suggest" : {
          "properties" : {
            "music" : {
              "properties" : {
                "input" : {
                  "type" : "text",
                  "fields" : {
                    "keyword" : {
                      "type" : "keyword",
                      "ignore_above" : 256
                    },
                    "completion": {
                      "type": "completion",
                      "analyzer" : "simple",
                      "preserve_separators" : true,
                      "preserve_position_increments" : true,
                      "max_input_length" : 50
                    }
                  }
                }
              }
            }
          }
        },
        "title" : {
          "type" : "keyword"
        }
      }
    }
  }
}
  

Затем вы можете использовать поле для завершения:

 POST music/_search
{
  "suggest": {
    "song-suggest" : {
      "prefix" : "nir", 
      "completion" : { 
        "field" : "suggest.music.input.completion" 
      }
    }
  }
}