我试图添加未经分析的分析字段版本,作为' raw'多字段,根据ElasticSearch文档: https://www.elastic.co/guide/en/elasticsearch/reference/2.4/multi-fields.html
这似乎是一种常见的,受到良好支持的模式。
我创建了以下索引/字段:
{
"person": {
"aliases": {},
"mappings": {
"employee": {
"properties": {
"userName": {
"type": "string",
"analyzer": "autocomplete",
"fields": {
"raw": {
"type": "string",
"index": "not_analyzed"
}
}
}
}
}
}
如果我直接查询索引,即GET / person,我会看到上面发布的映射,所以我确信没有语法错误等等。
但是,当我们将数据推送到索引中时,没有创建userName.raw字段。
{
"_index": "person",
"_type": "employee",
"_id": "2",
"_version": 1,
"found": true,
"_source": {
"username": "Test Value"
}
}
任何人都会看到我失踪的东西?
谢谢!
编辑: 创建索引时这是一个新手错误。
PUT person
{
"person": {
"aliases": {},
"mappings": {
"employee": {
"properties": {
"email": {
注意人员密钥正在“人”中进行PUT。指数。这创造了一个嵌套的人。
正确的语法是删除额外的" person"
PUT person
{
"aliases": {},
"mappings": {
"employee": {
"properties": {
"email": {
请参阅Linoy.M.K的回答,因为他是对的。 ' raw'按ID检索记录时,不会显示该字段。它仅作为查询的一部分有用。
答案 0 :(得分:1)
添加多个分析器不会修改您的源文档意味着您的源文档将始终只有用户名而不是username.raw
添加分析器在您进行搜索时很有用,这意味着您现在可以使用username和username.raw进行搜索,以实现如下所示的不同行为。
GET /person/employee/_search
{
"query": {
"match": {
"username": "Te"
}
}
}
GET /person/employee/_search
{
"query": {
"match": {
"username.raw": "Test Value"
}
}
}