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") })

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的掌握要求也較高。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章