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

pin*_*een 13 mapping elasticsearch

我只搜索几个字段,但我希望能够将整个文档存储在ES中,以免其他DB(MySQL)查询.

我试图加入index: no,store: no在整个映射对象/属性,但我仍然不知道,如果字段被索引并添加不必要的开销.

假设我有书,每个人都有作者.我想只按书名搜索,但我希望能够检索整个文档.

这个可以吗:

mappings:
properties:
    title:
        type: string
        index: analyzed
    author:
        type: object
        index: no
        store: no
        properties:
            first_name:
                type: string
            last_name:
                type: string
Run Code Online (Sandbox Code Playgroud)

或者我应该这样做:

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
Run Code Online (Sandbox Code Playgroud)

或者我可能完全错了?关于什么的nested性质不应被编入索引?

Dan*_*ery 8

默认情况下,_source无论您选择索引的字段如何,都会存储文档.将_source用于在搜索结果中返回文档,而被索引的字段用于搜索.

您无法设置index: no对象以防止对象中的所有字段都被编入索引,但您可以使用动态模板使用path_match属性将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"
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

索引文档:

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"
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

如果您title使用搜索字词搜索字段,book则会返回文档.如果您搜索author.first_nameauthor.last_name,则不会匹配,因为此字段未编入索引:

POST /shop/book/_search
{
    "query": {
        "match": {
            "author.first_name": "jon"
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

类别字段的嵌套查询也是如此:

POST /shop/book/_search
{
    "query": {
        "nested": {
            "path": "categories",
            "query": {
                "match": {
                    "categories.cat_name": "category"
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

此外,您可以使用Luke工具来期望Lucene索引并查看已编制索引的字段.