如何在 elasticsearch _source 中存储数据但不对其进行索引?

How to store data in elasticsearch _source but not index it?

我仅通过几个字段进行搜索,但我希望能够将整个文档存储在 ES 中,以免进行额外的 DB (MySQL) 查询。

我尝试在映射中将 index: nostore: 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_nameauthor.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.