是否可以为类型选择性地启用弹性搜索字段的索引?
通过特定索引的映射设置,可以设置属性
{“index”:“not_analyzed”}
针对特定领域。由于我的文档包含太多字段,并且将来可能会更改结构,因此我需要一个映射,默认情况下不对字段进行分析,除非另有说明。
这可能吗?
答案 0 :(得分:32)
是的 - 看看dynamic templates
尝试以下方法:
PUT /my_index
{
"mappings": {
"my_type": {
"dynamic_templates": [
{ "notanalyzed": {
"match": "*",
"match_mapping_type": "string",
"mapping": {
"type": "string",
"index": "not_analyzed"
}
}
}
]
}
}
}
动态模板适用于您的地图未涵盖的新字段 - 来自文档:
使用dynamic_templates,您可以完全控制映射 为新检测到的字段生成的。
您还可以根据字段名称更改映射,例如使用"match": "*_data"
,为以" _data"结尾的字段名称设置不同的映射集。
答案 1 :(得分:2)
从elasticsearch 5.x string 类型被禁用。相反,elasticsearch引入了两种类型 text 和 keyword 。阅读此博客,了解迁移数据的原因https://www.elastic.co/blog/strings-are-dead-long-live-strings
因此,您可以简单地使用field.keyword进行精确搜索,而不是添加模板来禁用分析器。 例如如果字段名称为fullName,并且您有条目
然后,fullName:" John"将返回两个结果,而fullName.keyword:" John"将返回单个记录。
以防万一,你仍然想要禁用文本字段,你可以使用下面的动态模板,
PUT _template/disable_all_analyzer
{
"template": "*",
"mappings": {
"_default_": {
"dynamic_templates": [
{ "notanalyzed": {
"match": "*",
"match_mapping_type": "string",
"mapping": {
"type": "keyword"
}
}
}
]
}
}
}
干杯!!!
答案 2 :(得分:0)
Ashay代码可以正常工作,但是由于它不包含索引指令,因此文档将被存储但未被索引,因此您将无法进行搜索或汇总。
我建议以另一种方式添加它:
PUT _template/disable_all_analyzer
{
"template": "*",
"mappings": {
"_default_": {
"dynamic_templates": [
{ "notanalyzed": {
"match": "*",
"match_mapping_type": "string",
"mapping": {
"type": "keyword",
"index": "not_analyzed"
}
}
}
]
}
}
}