web-dev-qa-db-ja.com

春のデータelasticsearch:アノテーションが機能しない設定とマッピング構成

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"
           },
           ....
       }
  }
9
Rubén

による org.springframework.data.elasticsearch.core.mapping.SimpleElasticsearchPersistentEntity、設定createIndex=falseを指定すると、フレームワークはインデックスとマッピングを作成しません。そのため、その設定を削除するか、trueに設定する必要があります。

2
evanwoods

設定とマッピングの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

1
matteo.cajani
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 {
}