4

spring-data-elasticsearch を使用して、以下の json 構成と同等のタイプのマッピングを設定しようとしていますが、問題が発生しています。

{
    "_id" : {
        "type" : "string",
        "path" : "id"
    },

    "properties":{
        "addressName":{
            "type":"multi_field",
            "fields":{
                "addressName":{
                    "type":"string"
                },
                "edge":{
                    "analyzer":"edge_search_analyzer",
                    "type":"string"
                }
            }
        },
        "companyName":{
            "type":"multi_field",
            "fields":{
                "companyName":{
                    "type":"string"
                },
                "edge":{
                    "analyzer":"edge_search_analyzer",
                    "type":"string"
                }
            }
        }
    }
}

現在のエンティティ クラスは次のとおりです。

@Document(indexName = "test", type="address")
@Setting(settingPath="/config/elasticsearch/test.json") // Used to configure custom analyzer/filter
public class Address {

    @Id
    private Integer id;

    @MultiField(
        mainField = @Field(type = FieldType.String),
        otherFields = {
            @NestedField(dotSuffix = "edge", type = FieldType.String, indexAnalyzer = "edge_search_analyzer")
        }
    )        
    private String addressName;

    @MultiField(
        mainField = @Field(type = FieldType.String),
        otherFields = {
            @NestedField(dotSuffix = "edge", type = FieldType.String, indexAnalyzer = "edge_search_analyzer")
        }
    )        
    private String companyName;

    public Address() {}

    public Address(AddressDTO dto) {
        id = dto.getId();
        addressName = dto.getAddressName();
        companyName = dto.getCompanyName();
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        Preconditions.checkNotNull(id);
        this.id = id;
    }

    public String getAddressName() {
        return addressName;
    }

    public void setAddressName(String addressName) {
        this.addressName = addressName;
    }

    public String getCompanyName() {
        return companyName;
    }

    public void setCompanyName(String companyName) {
        this.companyName = companyName;
    }
}

私が見つけたのは、これにより次のようなマッピングが得られることです。

"address" : {
    "properties" : {
        "addressName" : {
            "type" : "string",
            "fields" : {
                "addressName.edge" : {
                    "type" : "string",
                    "index_analyzer" : "edge_search_analyzer"
                }
            }
        },
        "companyName" : {
            "type" : "string",
            "fields" : {
                "companyName.edge" : {
                    "type" : "string",
                    "index_analyzer" : "edge_search_analyzer"
                }
            }
        }
    }
}

これにより、次の 2 つの問題が発生します。

  1. ID マッピングは行われないため、Elasticsearch が ID を生成します
  2. カスタム アナライザーを使用したプロパティの検索が正しく機能しない

注釈の使用をオーバーライドするために次を追加すると、すべて正常に動作します。

@Mapping(mappingPath="/config/elasticsearch/address.json")

「address.json」には、この投稿の上部からのマッピング構成が含まれています。

それで、私が達成しようとしていることのどこで私が間違っている可能性があるかを誰かが指摘できますか? 利用可能な注釈を使用することは可能ですか、それとも json 構成に固執する必要がありますか?

また、spring-data-elasticsearch を介してインデックス レベルの構成をセットアップする「正しい」方法はありますか、それともサポートされていないアプローチですか? 現在、この目的のために @Setting アノテーションを使用しています

4

0 に答える 0