根据 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
{
"aliases": {},
"mappings": {
"employee": {
"properties": {
"email": {
请参阅 Linoy.M.K 的回答,因为他是正确的。
按 ID 检索记录时不会出现“原始”字段。它仅作为查询的一部分有用。
最佳答案
添加多个分析器不会修改您的源文档意味着您的源文档将始终只有用户名而不是 username.raw
添加的分析器在您进行搜索时很有用,这意味着您现在可以使用 username 和 username.raw 进行搜索以实现不同的行为,如下所示。
GET /person/employee/_search
{
"query": {
"match": {
"username": "Te"
}
}
}
GET /person/employee/_search
{
"query": {
"match": {
"username.raw": "Test Value"
}
}
}
关于未创建 'Raw' 值的 Elasticsearch 多字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40271980/