弹性搜索映射参数:索引与启用



我一直在为两个弹性搜索映射参数而苦苦挣扎:indexenabled。我正在使用Elasticsearch 6.2.4。


这是我的情况。

映射

PUT my_index
{
"mappings": {
"_doc": {
"properties": {
"user_id": {
"type":  "keyword"
},
"last_updated": {
"type": "date"
},
"session_data_index_false": { 
"index" : false,
"type" : "keyword"
},
"session_data_enabled_false": { 
"enabled" : false
}
}
}
}
}

索引

PUT my_index/_doc/1
{
"user_id": "jpountz",
"session_data_index_false": "hello", 
"session_data_enabled_false": "hello", 
"last_updated": "2015-12-06T18:22:13"
}

搜索1

GET my_index/_search
{
"query": {
"match": {
"session_data_index_false": "hello"
}
}
}

我收到以下消息的400错误。

{
"error": {
"root_cause": [
{
"type": "query_shard_exception",
"reason": "failed to create query: {n  "match" : {n    "session_data_index_false" : {n      "query" : "hello",n      "operator" : "OR",n      "prefix_length" : 0,n      "max_expansions" : 50,n      "fuzzy_transpositions" : true,n      "lenient" : false,n      "zero_terms_query" : "NONE",n      "auto_generate_synonyms_phrase_query" : true,n      "boost" : 1.0n    }n  }n}",
"index_uuid": "6ByxNrjIRQmF23zcmKOvUA",
"index": "my_index"
}
],
"type": "search_phase_execution_exception",
"reason": "all shards failed",
"phase": "query",
"grouped": true,
"failed_shards": [
{
"shard": 0,
"index": "my_index",
"node": "DYPnEJWjTtm58oxZ9F-RSg",
"reason": {
"type": "query_shard_exception",
"reason": "failed to create query: {n  "match" : {n    "session_data_index_false" : {n      "query" : "hello",n      "operator" : "OR",n      "prefix_length" : 0,n      "max_expansions" : 50,n      "fuzzy_transpositions" : true,n      "lenient" : false,n      "zero_terms_query" : "NONE",n      "auto_generate_synonyms_phrase_query" : true,n      "boost" : 1.0n    }n  }n}",
"index_uuid": "6ByxNrjIRQmF23zcmKOvUA",
"index": "my_index",
"caused_by": {
"type": "illegal_argument_exception",
"reason": "Cannot search on field [session_data_index_false] since it is not indexed."
}
}
}
]
},
"status": 400

搜索2

GET my_index/_search
{
"query": {
"match": {
"session_data_enabled_false": "hello"
}
}
}

在这种情况下,我没有收到任何错误。相反,我得到了以下结果,这意味着没有找到任何文档。

{
"took": 1,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 0,
"max_score": null,
"hits": []
}
}

检索

GET my_index/_doc/1

当然,我可以检索原始数据。

{
"_index": "my_index",
"_type": "_doc",
"_id": "1",
"_version": 1,
"found": true,
"_source": {
"user_id": "jpountz",
"session_data_index_false": "hello",
"session_data_enabled_false": "hello",
"last_updated": "2015-12-06T18:22:13"
}
}

我阅读了有关上述选项的官方文件。

  • 已启用选项
  • 索引选项

而且,我读过这篇文章,但发现它与 elasticsearch 1.5 兼容。

这里有人知道这两种选择有何不同吗?

提前谢谢。

最好

当设置enabled为 false 时,你告诉 ES 完全忽略字段的解析,因此它既不会被分析,也不会被索引而不是存储(当然,除了 he_source字段中(。

因此,ES 甚至不知道该字段存在,因此,它会像查询任何其他不存在的字段一样处理这种情况,基本上就像源甚至不包含该字段一样。结果:ES 不返回任何文档。

index设置为 false 时,ES 知道该字段存在(通过映射(,但它知道不应对其进行索引。因此,当您查询它时,ES 会告诉您无法执行此操作,因为您决定不为该字段编制索引。这就是 ES 抛出错误的原因,因为您违反了在映射中声明的协定。

最新更新