需求:如何讓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") })
Spring-data-elasticsearch的API文檔見:https://docs.spring.io/spring-data/elasticsearch/docs/3.1.5.RELEASE/api/
二、使用@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
}
}
}
}
}
刪除原有的mapping後再次運行程序,新生成的mapping就是json文件中定義的配置,這種方式自由度較高,但對mapping的掌握要求也較高。