Spring-Data-Elasticsearch settings: Spring can't find config file?

匿名 (未验证) 提交于 2019-12-03 02:16:02

问题:

With Spring-Data-Elasticsearch, I am trying to use analyzers and mappings defined in elasticsearch_config.json.
This JSON file is in /src/main/resources folder.

My JAVA model looks like:

@Document(indexName = "test", type="Tweet") @Setting(settingPath = "/elasticsearch_config.json") public class Tweet {         @Id     private String idStr;      /** other fields, getters and setters are omitted **/  }

elasticsearch_config.json contains both settings and mappings:

{     "settings": { /* some filters */},     "mappings": { /* some types' mappings*/ } }

I tried with curl, I get no problem indexing/searching.

My problem:

I want to use @Setting to configure my mappings (not curl), but @Setting annotation doesn't seem to work. With @Setting, when I use curl to check my mapping, I don't get all the mappings I defined in elasticsearch_config.json :

curl -X GET "localhost:9200/test/_mapping?pretty=true"

My guess is that Spring can't find the elasticsearch_config.json properly. However I have already checked that myproject/src/main/resources is in my project's build path...

I appreciate any help, thank you!

Notes: I have found this solution that may work, but:
1. I don't understand where nodeBuilder comes from
2. I may be wrong but, isn't there a solution only using @Setting?

UPDATES: My mappings I separeted analyzers from mappings. mappings.json looks like this:

{   "mappings": {     "Tweet": {       "_id": {         "path":"idStr",         "properties": {           "idStr": {             "type":"string",             "index":"not_analyzed",             "store":true           }         }       },       "numeric_detection" : true,       "dynamic_templates": [        {           "id_fields": {           "match":"userId*",             "match_mapping_type": "string",             "mapping": {               "type":"string",               "index":"no",               "store":true             }           }         },         {           "name_fields": {             "match":"*Name",             "match_mapping_type": "string",             "mapping": {               "type":"string",               "index":"no",               "store":true             }           }         }       ],       "properties": {         "text": {           "type": "string",           "index":"analyzed",           "analyzer":"custom_analyzer",           "store": true         },         "createdAt": {           "type": "date",           "format": "yyyy-MM-dd",           "index":"analyzed",           "store": true         },         "testVersion": {           "type": "integer",           "index":"not_analyzed",           "store":false         }       }      }    } }

回答1:

The @Setting annotation should point to a file containing only the settings part. If you also want to specify your custom mapping, you need to use the @Mapping annotation and give it the path to your mapping file. It goes like this:

@Document(indexName = "test", type="Tweet") @Setting(settingPath = "/settings/settings.json") @Mapping(mappingPath = "/mappings/mappings.json") public class Tweet {         @Id     private String idStr;      /** other fields, getters and setters are omitted **/  }

Then you need to store settings.json in myproject/src/main/resources/settings/ and mappings.json in myproject/src/main/resources/mappings/.

That should work.



回答2:

Finally found out why it was not working!!

Like Val said, I decomposed my elasticsearch_config.json file into settings.json and mappings.json.

My project/src/main/ressources architecture:

- mappings     + mappings.json - settings     + settings.json

And

@Document(indexName = "test", type="SentimentTweet") @Setting(settingPath = "/settings/settings.json") @Mapping(mappingPath = "/mappings/mappings.json")

However, in mappings.json, I should omit the field mappings and DIRECTLY put the content of the mapping.

INSTEAD OF:

{     "mappings": {         "Tweet": {              /* MAPPINGS CONFIGURATION ARE OMITTED */          }     } }

Only writes in mappings.json:

{     "Tweet": {          /* MAPPINGS CONFIGURATION ARE OMITTED */      } }

The same should be done for settings.json



易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!