Elasticsearch 7:如何让字段不可搜索但保留索引
解决思路与方案
刚好碰到过类似的需求——既要保留字段索引方便后续过滤聚合,又要让搜索自动排除指定字段,给你几个实用的方案:
方案1:修改索引默认搜索字段(一劳永逸)
直接调整索引的全局配置,让所有不指定字段的搜索(比如URI查询、不带字段的match查询)自动排除created_at和updated_at。执行以下命令修改索引设置:
PUT /your_product_index/_settings { "index": { "query": { "default_field": ["*", "-created_at", "-updated_at"] } } }
这里的*会匹配所有字段,-前缀用来排除不需要的日期字段。修改后,你平时用q=t-shirt-small-red或者简单的match查询时,就只会在除了那两个日期字段之外的所有字段上匹配了。
方案2:搜索时明确指定字段集合(灵活可控)
如果不想改动索引全局设置,每次搜索时用multi_match查询,通过fields参数精准控制要包含的字段:
GET /your_product_index/_search { "query": { "multi_match": { "query": "t-shirt-small-red", "fields": ["*", "-created_at", "-updated_at"] } } }
这个方法的好处是可以根据不同搜索场景灵活调整排除的字段,不需要改动索引结构,适合临时需求或者多变的搜索场景。
方案3:创建专用搜索字段(性能最优)
如果你的产品字段比较多,追求更好的搜索性能,可以用copy_to把所有需要被搜索的字段内容复制到一个专用字段里,比如search_all,之后只针对这个字段搜索:
首先更新映射(记得重新索引现有数据,因为copy_to是在索引阶段生效的):
PUT /your_product_index/_mapping { "properties": { "sku": { "type": "text", "copy_to": "search_all" }, "product_name": { "type": "text", "copy_to": "search_all" }, // 把其他需要搜索的字段都加上copy_to配置 "created_at": { "type": "date", "format": "yyyy-MM-dd HH:mm:ss" }, "updated_at": { "type": "date", "format": "yyyy-MM-dd HH:mm:ss" }, "search_all": { "type": "text" } } }
然后搜索时就直接查这个专用字段:
GET /your_product_index/_search { "query": { "match": { "search_all": "t-shirt-small-red" } } }
这个方案的优势是搜索效率更高,尤其是字段数量多的时候,而且能精确控制哪些字段参与搜索,不会不小心把日期字段包含进去。
关键提醒
千万别用enabled: false来处理,那样会直接让字段无法被索引,后续想做过滤、聚合操作就完全没戏了,正好和你的需求冲突。
内容的提问来源于stack exchange,提问作者Adam Lambert
相关产品推荐
相关产品推荐

