Spring Bootで組み込みElasticsearchを使用していて、設定とマッピングの構成に注釈を使用しようとしました。私はこれに従いました チュートリアル これは、複数のフィールドに対する検索を実装する方法を説明しています。とにかく、私は記述 here のように私のドキュメントエンティティにsettings.jsonとmappings.jsonを定義しましたが、curlingマッピングは、ファイルで定義されている対応する構成を返しません。
インデックス作成は、春のバッチプロセスによって実行されます。データベースからデータを読み取り、elasticsearchに書き込みます。これは完全に機能します。
POSTへのリクエスト http:// localhost:9200/profile/_search を実行すると、結果が返されません(7項目が返されるはずです)。
{
"size": 10,
"query": {
"match": {
"_all": {
"query": "user male",
"operator": "and"
}
}
}
}
クエリを「user5」に変更すると、このニックネームを持つユーザーが返されます。
誰かが私にヒントを与えることができれば私は感謝します。構成の何が問題になっていますか?
構成
@Configuration
@EnableElasticsearchRepositories(basePackages ="com.company.searchengine.repository")
public class ElasticSearchConfiguration {
@Value("${elasticsearch.clustername}")
private String esClusterName;
@Bean
public ElasticsearchOperations elasticsearchTemplate() throws IOException {
return new ElasticsearchTemplate(nodeBuilder().local(true).clusterName
(esClusterName).node()
.client());
}
}
ドキュメント
@EqualsAndHashCode(of = "uuid")
@ToString(exclude = "uuid")
@NoArgsConstructor(onConstructor = @__({@JsonCreator}))
@Getter
@Setter
@Document(indexName = "profiles", type = "profile", createIndex = false)
@Setting(settingPath = "/settings/settings.json")
@Mapping(mappingPath = "/mappings/mappings.json")
public class IndexedProfile {
@Id
@NonNull
private String uuid;
@NonNull
//@Field(index = FieldIndex.not_analyzed, type = FieldType.String)
private String nickname;
@NonNull
//@Field(index = FieldIndex.not_analyzed, type = FieldType.String)
private String gender;
//@Field(index = FieldIndex.not_analyzed, type = FieldType.String)
private String about;
private GeoPoint location;
@Field(type = FieldType.Date, format = DateFormat.year_month_day)
private Date birthdate;
}
バッチジョブ
@Override
public void write(List<? extends IndexedProfile> items) throws Exception {
List<IndexQuery> indexQueries = items.stream()
.map(item -> new IndexQueryBuilder().withObject(item).withId(String.valueOf(item.getUuid())))
.map(builder -> builder.withType(DOCUMENT_TYPE))
.map(builder -> builder.withIndexName(INDEX_NAME + runId))
.map(IndexQueryBuilder::build)
.collect(Collectors.toList());
this.elasticsearchTemplate.bulkIndex(indexQueries);
}
設定
{
"settings": {
"analysis": {
"filter": {
"nGram_filter": {
"type": "nGram",
"min_gram": 2,
"max_gram": 20,
"token_chars": [
"letter",
"digit",
"punctuation",
"symbol"
]
}
},
"analyzer": {
"nGram_analyzer": {
"type": "custom",
"tokenizer": "whitespace",
"filter": [
"lowercase",
"asciifolding",
"nGram_filter"
]
},
"whitespace_analyzer": {
"type": "custom",
"tokenizer": "whitespace",
"filter": [
"lowercase",
"asciifolding"
]
}
}
}
}
}
マッピング
{
"mappings": {
"profile": {
"_all": {
"index_analyzer": "nGram_analyzer",
"search_analyzer": "whitespace_analyzer"
},
"nickname": {
"type": "string",
"index": "not_analyzed"
},
....
}
}
による org.springframework.data.elasticsearch.core.mapping.SimpleElasticsearchPersistentEntity
、設定createIndex=false
を指定すると、フレームワークはインデックスとマッピングを作成しません。そのため、その設定を削除するか、trueに設定する必要があります。
設定とマッピングのJSON構造が正しくありません。次の参照例を使用して、それらを適合させてください。
マッピング: https://github.com/spring-projects/spring-data-elasticsearch/tree/master/src/test/resources/mappings
設定: https://github.com/spring-projects/spring-data-elasticsearch/tree/master/src/test/resources/settings
studentdoc_setting_index_mapping_type_overlayadjacency.json
{
"index": {
"mapping": {
"total_fields": {
"limit": "100000"
}
}
}
}
@Setting(settingPath = "studentdoc_setting_index_mapping_type_overlayadjacency.json")
public class StudentDoc {
}