Spring Elasticsearch HashMap[String, String] 映射值不能是not_analyzed

Spring Elasticsearch HashMap[String, String] mapping value cannot be not_analyzed

其实我的问题很简单:我想要我的hashmap值not_analyzed!

现在我有一个对象包含一个 hashmap[string, string],看起来像:

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

然后 Spring 数据 elasticsearch 在开始时生成这样的映射:

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

然后在我向 es 添加一些对象后,它会添加更多属性,如下所示:

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

现在因为解析了参数的值,所以不能用es搜索,我是说不能搜索中文值,我试过这时候可以搜索英文了。

然后,在阅读此 POST 之后,我将映射手动更新为:

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

我现在可以搜索中文了,所以我知道问题出在"not_analyzed",就像POST所说的那样。

最后,谁能告诉我如何制作地图值"not_analyzed",我用了google和Whosebug很多次仍然找不到答案,如果有人能帮忙请告诉我,谢谢非常喜欢。

实现此目的的一种方法是在构建路径上创建一个 mappings.json 文件(例如 yourproject/src/main/resources/mappings),然后在 [=25] 中使用 @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 哈希映射的子字段为目标,并将它们声明为 not_analyzed 字符串。

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

您需要确保先删除 your_index,然后重新启动您的应用程序,以便使用正确的映射重新创建它。