我只搜索几个字段,但我希望能够将整个文档存储在ES中,以免其他数据库(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
或者我应该这样做:
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
属性呢?
答案 0 :(得分:7)
默认情况下,无论您选择索引哪个字段,都会存储文档的_source
。 _source
用于在搜索结果中返回文档,而索引的字段用于搜索。
您无法在对象上设置index: no
以防止对象中的所有字段都被编入索引,但您可以使用path_match
属性来Dynamic Templates执行您想要的操作对象中每个字段的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
,则会返回该文档。如果您在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索引并查看已编制索引的字段。