2

其實我的問題很簡單:我想我的hashmap值not_analyzed!Spring Elasticsearch HashMap [String,String]映射值不能被分析

我現在有一個對象包含一個HashMap [字符串,字符串],看起來像:

class SomeObject{ 
    String id; 
    @Field(type=FieldType.Object, index=FieldIndex.not_analyzed) 
    Map<String, String> parameters; 
} 

然後elasticsearch在beggining生成這樣的映射彈簧數據:

{ 
    "id": { 
     "type": "string" 
    }, 
    "parameters": { 
     "type": "object" 
    } 
} 

在此之後我添加了一些對象的ES,它增加了更多像這樣的屬性:

{ 
    "id": { 
     "type": "string" 
    }, 
    "parameters": { 
     "properties": { 
      "shiduan": { 
       "type": "string" 
      }, 
      "季節": { 
       "type": "string" 
      } 
     } 
    } 
} 

現在,因爲的參數的價值進行了分析,所以不能通過es搜索,我的意思是不能搜索中文價值,我試過我可以在這個時候搜索英文。

隨後,在閱讀這篇文章https://stackoverflow.com/a/32044370/4148034,我手動更新映射這樣的:

{ 
    "id": { 
     "type": "string" 
    }, 
    "parameters": { 
     "properties": { 
      "shiduan": { 
       "type": "string", 
       "index": "not_analyzed" 
      }, 
      "季節": { 
       "type": "string", 
       "index": "not_analyzed" 
      } 
     } 
    } 
} 

我可以立即搜索中文,所以我知道問題是「not_analyzed」,像帖子裏說。

最後,任何人都可以告訴我如何使地圖值「not_analyzed」,我有谷歌和stackoverflow許多次仍然找不到答案,讓我知道如果有人可以幫助,非常感謝。

回答

5

實現此目的的一種方法是在構建路徑上創建mappings.json文件(例如yourproject/src/main/resources/mappings),然後在您的課程中使用@Mapping註釋引用該映射。

@Document(indexName = "your_index", type = "your_type") 
@Mapping(mappingPath = "/mappings/mappings.json") 
public class SomeObject{ 
    String id; 
    @Field(type=FieldType.Object, index=FieldIndex.not_analyzed) 
    Map<String, String> parameters; 
} 

在該映射文件中,我們要添加一個dynamic template將針對您的parameters的HashMap的子域,並宣佈他們是not_analyzed字符串。

{ 
    "mappings": { 
    "your_type": { 
     "dynamic_templates": [ 
     { 
      "strings": { 
      "match_mapping_type": "string", 
      "path_match": "parameters.*", 
      "mapping": { 
       "type": "string", 
       "index": "not_analyzed" 
      } 
      } 
     } 
     ] 
    } 
    } 
} 

你需要確保刪除your_index,然後再重新啓動應用程序,以便它可以與適當的映射重新創建。

+0

對不起,沒有按時接受你的答案,它的工作原理。再次感謝你的幫助 –

相關問題