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性质不应被编入索引?
默认情况下,_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_name或author.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索引并查看已编制索引的字段.