详解Elasticsearch中 ‘store‘, ‘index‘ 属性和 ‘_all‘, ‘_source‘字段
本文介绍Elasticsearch中容易混淆的几个属性和字段。理解ES需要理解反向索引,即内存中的数据结构(如hash或map),其中存储所有分词和文档引用(不是整个文档,仅是包含该分词的文档引用)。之所以称为反向索引,是因为分词作为key,文档ID是值。正常索引(非反向索引)使用文档ID作为key,分词作为它包含的值。
设置mapping中store选项
它用于控制是否单独往索引中增加每个字段。上面示例展示每个字段设置store属性。store默认被禁用,启用的字段存储在stored_fields
字段中。
需要提醒的是,设置store
为false(或其他任何值)不会改变事实————ES仍然存储整个原始文档至磁盘上,即能从_source
字段中返回每个字段。
如果你确定仅需要返回一个字段,而不是整个文档,可以考虑禁用_source
字段。
mapping中设置index选项
缺省情况下每个字段都需要分析,这意味着进行分析过程的每一步(如,字符过滤、分词、分词过滤),最后结果分词被加入至索引中。
对于字段是索引字段,则定义mapping时,可以设置index选项使得字段不被搜索(“false”),缺省是true。analyzer
参数指定使用分析器,缺省为"analyzed"。即意味着使用默认分析器进行分析并生成反向索引。
对于index设置为false字段进行检索会报错:"Cannot search on field [content] since it is not indexed."
。字符串类型不需要分词可以直接设置为keyword
类型,相当于设置了"index": "not_analyzed"
。
_source
字段
通常字段在ES中存储了则能被返回(即作为搜索结果的一部分)。也就是说,如果字段被包括在_source
,或store
被显示设置为true
。
当在ES中插入文档时,原始文档(没有被分析或分词)被存储中特定字段_source
中。我们可以禁用该功能(是否需要禁用是另一个问题)。
因为这涉及到整个文档,需要在索引级别进行配置。举例,如果有event
索引,设置mapping禁用_source
字段,即不让ES存储这个文档):
PUT my-index-000001
{
"mappings": {
"_source": {"enabled": false},
"properties": {
"title": {
"type": "text",
"store": true
},
"date": {
"type": "date",
"store": true
},
"content": {
"type": "text",
"store": true
}
}
}
}
设置后你需要手动设置每个字段store
选项为true,否则不能被返回。下面介绍store选项。需要提醒的是,禁用_source
字段,则 update, update_by_query, reindex APIs,highlighting
等功能不能使用。
字段 _all
字段 _all
是一个特殊字段,包括文档中每个其他字段。对于想同时搜索所有字段非常方便。实际上,当你不指定字段时即搜索 _all
字段。我们也可以禁用字段 _all
。
PUT my-index-000001
{
"mappings": {
"_source": {"enabled": false},
"_all": {"enabled": true},
"properties": {
"title": {
"type": "text",
"store": true
}
}
}
我们也可以指定字段是否被包括在_all
字段中:
PUT my-index-000001
{
"mappings": {
"_source": {"enabled": false},
"_all": {"enabled": true},
"properties": {
"title": {
"type": "text",
"store": true ,
"include_in_all": false
}
}
}
}
_all
不包括该字段,对其查询需要使用match指明字段才能检索。
上一篇: elasticsearch使用说明