如何在 elasticsearch _source 中存储数据但不对其进行索引?
How to store data in elasticsearch _source but not index it?
我仅通过几个字段进行搜索,但我希望能够将整个文档存储在 ES 中,以免进行额外的 DB (MySQL) 查询。
我尝试在映射中将 index: no
、store: no
添加到整个 objects/properties,但我仍然不确定这些字段是否被索引并增加了不必要的开销。
假设我有书,每本书都有作者。我只想按书名搜索,但我希望能够检索到整个文档。
这样可以吗:
mappings:
properties:
title:
type: string
index: analyzed
author:
type: object
index: no
store: no
properties:
first_name:
type: string
last_name:
type: string
或者我应该这样做:
mappings:
properties:
title:
type: string
index: analyzed
author:
type: object
properties:
first_name:
index: no
store: no
type: string
last_name:
index: no
store: no
type: string
或者我做的完全错了?
nested
不应被索引的属性呢?
默认情况下,无论您选择索引哪些字段,都会存储文档的 _source
。 _source
用于 return 搜索结果中的文档,而索引的字段用于搜索。
您不能在对象上设置 index: no
以防止对象中的所有字段都被索引,但是您可以使用 Dynamic Templates 使用 path_match
[=42] 来做您想做的事=] 将 index: no
设置应用于对象中的每个字段。这是一个简单的例子。
使用包含 author
对象和嵌套 categories
对象的动态模板的映射创建索引:
POST /shop
{
"mappings": {
"book": {
"dynamic_templates": [
{
"author_object_template": {
"path_match": "author.*",
"mapping": {
"index": "no"
}
}
},
{
"categories_object_template": {
"path_match": "categories.*",
"mapping": {
"index": "no"
}
}
}
],
"properties": {
"categories": {
"type": "nested"
}
}
}
}
}
索引文档:
POST /shop/book/1
{
"title": "book one",
"author": {
"first_name": "jon",
"last_name": "doe"
},
"categories": [
{
"cat_id": 1,
"cat_name": "category one"
},
{
"cat_id": 2,
"cat_name": "category two"
}
]
}
如果您在 title
字段中使用搜索词 book
进行搜索,文档将被 return 编辑。如果您在 author.first_name
或 author.last_name
上搜索,则不会有匹配项,因为此字段未编入索引:
POST /shop/book/_search
{
"query": {
"match": {
"author.first_name": "jon"
}
}
}
类别字段的嵌套查询也是如此:
POST /shop/book/_search
{
"query": {
"nested": {
"path": "categories",
"query": {
"match": {
"categories.cat_name": "category"
}
}
}
}
}
您还可以使用 Luke 工具来期待 Lucene 索引并查看哪些字段已被索引。
您可以简单地在映射定义中设置 "enabled": false。
The enabled setting, which can be applied only to the top-level mapping definition and to object fields, causes Elasticsearch to skip parsing of the contents of the field entirely. The JSON can still be retrieved from the _source
field, but it is not searchable or stored in any other way.
"mappings": {
"properties": {
"title": { "type": "text" },
"author": { "type": "object", "enabled": false }
}
}
但请注意 enabled
不适用于核心类型,但是 index
选项可以通过设置 "index": false 应用于核心类型相反。
The index option controls whether field values are indexed. It accepts true or false and defaults to true. Fields that are not indexed are not queryable.
我仅通过几个字段进行搜索,但我希望能够将整个文档存储在 ES 中,以免进行额外的 DB (MySQL) 查询。
我尝试在映射中将 index: no
、store: no
添加到整个 objects/properties,但我仍然不确定这些字段是否被索引并增加了不必要的开销。
假设我有书,每本书都有作者。我只想按书名搜索,但我希望能够检索到整个文档。
这样可以吗:
mappings:
properties:
title:
type: string
index: analyzed
author:
type: object
index: no
store: no
properties:
first_name:
type: string
last_name:
type: string
或者我应该这样做:
mappings:
properties:
title:
type: string
index: analyzed
author:
type: object
properties:
first_name:
index: no
store: no
type: string
last_name:
index: no
store: no
type: string
或者我做的完全错了?
nested
不应被索引的属性呢?
默认情况下,无论您选择索引哪些字段,都会存储文档的 _source
。 _source
用于 return 搜索结果中的文档,而索引的字段用于搜索。
您不能在对象上设置 index: no
以防止对象中的所有字段都被索引,但是您可以使用 Dynamic Templates 使用 path_match
[=42] 来做您想做的事=] 将 index: no
设置应用于对象中的每个字段。这是一个简单的例子。
使用包含 author
对象和嵌套 categories
对象的动态模板的映射创建索引:
POST /shop
{
"mappings": {
"book": {
"dynamic_templates": [
{
"author_object_template": {
"path_match": "author.*",
"mapping": {
"index": "no"
}
}
},
{
"categories_object_template": {
"path_match": "categories.*",
"mapping": {
"index": "no"
}
}
}
],
"properties": {
"categories": {
"type": "nested"
}
}
}
}
}
索引文档:
POST /shop/book/1
{
"title": "book one",
"author": {
"first_name": "jon",
"last_name": "doe"
},
"categories": [
{
"cat_id": 1,
"cat_name": "category one"
},
{
"cat_id": 2,
"cat_name": "category two"
}
]
}
如果您在 title
字段中使用搜索词 book
进行搜索,文档将被 return 编辑。如果您在 author.first_name
或 author.last_name
上搜索,则不会有匹配项,因为此字段未编入索引:
POST /shop/book/_search
{
"query": {
"match": {
"author.first_name": "jon"
}
}
}
类别字段的嵌套查询也是如此:
POST /shop/book/_search
{
"query": {
"nested": {
"path": "categories",
"query": {
"match": {
"categories.cat_name": "category"
}
}
}
}
}
您还可以使用 Luke 工具来期待 Lucene 索引并查看哪些字段已被索引。
您可以简单地在映射定义中设置 "enabled": false。
The enabled setting, which can be applied only to the top-level mapping definition and to object fields, causes Elasticsearch to skip parsing of the contents of the field entirely. The JSON can still be retrieved from the
_source
field, but it is not searchable or stored in any other way.
"mappings": {
"properties": {
"title": { "type": "text" },
"author": { "type": "object", "enabled": false }
}
}
但请注意 enabled
不适用于核心类型,但是 index
选项可以通过设置 "index": false 应用于核心类型相反。
The index option controls whether field values are indexed. It accepts true or false and defaults to true. Fields that are not indexed are not queryable.