Elasticsearch如何让一个字段同时支持精确匹配和模糊检索

需求:如何让ES的某个字段既能支持精确匹配查找,也能支持模糊检索?
方法:将字段的mapping设置为如下这种即可:

            "properties": {
               "name": {
                  "type": "text",
                  "fields": {
                     "keyword": {
                        "type": "keyword",
                        "ignore_above": 256
                     }
                  }
               }

解释:
ElasticSearch 5.0以后,string字段被拆分成两种新的数据类型:
Text:会分词,然后根据分词后的内容建立倒排索引(反向索引)
不支持聚合
keyword:不进行分词,直接直接根据字符串内容建立倒排索引(反向索引)
支持聚合

ElasticSearch字符串将默认被同时映射成text和keyword类型,将会自动创建上面的动态映射(dynamic mappings),比如上面的name字段,不做任何配置ES就会默认给他映射成两个类型。

但是如果要对text类型做其他配置,比如加入中文分词器,该如何做呢?若你是使用Spring-data-Elasticsearch,那么有两种办法可以实现这个需求:

一、对改字段使用@MultiField注释

 @MultiField(mainField = @Field(type = FieldType.Text, analyzer = "ik_max_word", searchAnalyzer = "ik_smart"), otherFields = {
            @InnerField(type = FieldType.Keyword, suffix = "keyword") })

本人试过第二步,可以不需要,当mapping·没成功时可以用第二步试试

二、使用@Mapping注解为Document自定义生成mapping

@Document(indexName = "student", type = "student")
@Mapping(mappingPath = "elasticSearch_mapping.json")
public class Student {
	@Id
	private String id;
	private String name;
}

在resource目录下,新建elasticSearch_mapping.json。内容如下:

{
	"student": {
		"properties": {
			"id": {
				"type": "keyword"
			},
			"name": {
				"type": "text",
				"analyzer": "ik_max_word",
				"search_analyzer": "ik_smart",
				"fields": {
					"keyword": {
						"type": "keyword",
						"ignore_above": 256
					}
				}
			}
		}
}	

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值