वसंत लोचदार : सही तरीका क्या है का उपयोग करने के नेस्टेड फ़ील्ड?

0

सवाल

मैं कर रहा हूँ काफी नए ElasticSearch करने के लिए. मैं काम कर रहा हूँ एक परियोजना पर जहां हम खोज करने की जरूरत के लिए एक वस्तु (प्रस्ताव) में शामिल है कि एक सेट के दो (OfferTranslation). लक्ष्य बनाने के लिए है के आधार पर अनुसंधान के कुछ क्षेत्रों की पेशकश, लेकिन यह भी की एक बहुत कुछ OfferTranslation क्षेत्रों. यहाँ एक minified संस्करण के दोनों वर्गों :

Offer.class (ध्यान दें कि मैं एनोटेट सेट के साथ @क्षेत्र(प्रकार= FieldType.नेस्टेड) तो मैं कर सकते हैं बनाने के लिए नेस्टेड प्रश्नों के रूप में, mentionned में सरकारी डॉक्टर) :

@org.springframework.data.elasticsearch.annotations.Document(indexName = "offer")
@DynamicMapping(DynamicMappingValue.False)
public class Offer implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    @Field(type = FieldType.Long)
    private Long id;

    @OneToMany(mappedBy = "offer", targetEntity = OfferTranslation.class, cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    @Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
    @JsonIgnoreProperties(
        value = { "pictures", "videos", "owner", "contexts", "offer", "personOfInterests", "followers" },
        allowSetters = true
    )
    @Field(type = FieldType.Nested, store = true)
    private Set<OfferTranslation> offersTranslations = new HashSet<>();


}

OfferTranslation.class :

@DynamicMapping(DynamicMappingValue.False)
public class OfferTranslation implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    @Field(type = FieldType.Long)
    private Long id;

    @NotNull
    @Size(max = 100)
    @Column(name = "title", length = 100, nullable = false)
    @Field(type = FieldType.Text)
    private String title;

    @NotNull
    @Size(max = 2000)
    @Column(name = "summary", length = 2000, nullable = false)
    @Field(type = FieldType.Text)
    private String summary;

    @Size(max = 2000)
    @Column(name = "competitor_context", length = 2000)
    @Field(type = FieldType.Text)
    private String competitorContext;

    @NotNull
    @Size(max = 2000)
    @Column(name = "description", length = 2000, nullable = false)
    @Field(type = FieldType.Text)
    private String description;

    @NotNull
    @Enumerated(EnumType.STRING)
    @Column(name = "maturity", nullable = false)
    @Field(type = FieldType.Auto)
    private RefMaturity maturity;

    @ManyToOne
    @Field(type = FieldType.Object, store = true)
    private RefLanguage language;

    @NotNull
    @Column(name = "created_at", nullable = false)
    @Field(type = FieldType.Date)
    private Instant createdAt;
}

अपेक्षित व्यवहार होगा कि मैं कर सकते हैं nestedQueries के रूप में तो :

QueryBuilder qBuilder = nestedQuery("offersTranslations",boolQuery().must(termQuery("offersTranslations.language.code",language)), ScoreMode.None);

लेकिन क्या मैं एक अपवाद है : विफल करने के लिए क्वेरी बनाएँ: [नेस्ट] नेस्टेड ऑब्जेक्ट के तहत पथ [offersTranslations] नहीं है के नेस्टेड प्रकार"

संपादित करें : मैं का उपयोग कर सकते हैं offersTranslations.भाषा.कोड का उपयोग कर सामान्य प्रश्नों (जो नहीं है वास्तव में मुझे परेशान पल में). लेकिन मैं अभी भी नहीं सच में समझ में.

मेरे मानचित्रण कहते हैं क्षेत्र offersTranslations नहीं है की एक नेस्टेड प्रकार के रूप में आप ऊपर देख सकते हैं, लेकिन मैं के बाद से इस्तेमाल किया @क्षेत्र(प्रकार = FieldType.नेस्टेड) मैं सच में समझ नहीं है कि व्यवहार. सकता है किसी को समझाने के लिए?

{
  "offer" : {
    "mappings" : {
      "properties" : {
        "_class" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        },
        "categories" : {
          "properties" : {
            "id" : {
              "type" : "long"
            }
          }
        },
        "criteria" : {
          "properties" : {
            "id" : {
              "type" : "long"
            }
          }
        },
        "id" : {
          "type" : "long"
        },
        "keywords" : {
          "properties" : {
            "id" : {
              "type" : "long"
            }
          }
        },
        "offersTranslations" : {
          "properties" : {
            "competitorContext" : {
              "type" : "text",
              "fields" : {
                "keyword" : {
                  "type" : "keyword",
                  "ignore_above" : 256
                }
              }
            },
            "createdAt" : {
              "type" : "date"
            },
            "description" : {
              "type" : "text",
              "fields" : {
                "keyword" : {
                  "type" : "keyword",
                  "ignore_above" : 256
                }
              }
            },
            "id" : {
              "type" : "long"
            },
            "language" : {
              "properties" : {
                "code" : {
                  "type" : "text",
                  "fields" : {
                    "keyword" : {
                      "type" : "keyword",
                      "ignore_above" : 256
                    }
                  }
                },
                "id" : {
                  "type" : "long"
                },
                "name" : {
                  "type" : "text",
                  "fields" : {
                    "keyword" : {
                      "type" : "keyword",
                      "ignore_above" : 256
                    }
                  }
                }
              }
            },
            "maturity" : {
              "type" : "text",
              "fields" : {
                "keyword" : {
                  "type" : "keyword",
                  "ignore_above" : 256
                }
              }
            },
            "state" : {
              "type" : "text",
              "fields" : {
                "keyword" : {
                  "type" : "keyword",
                  "ignore_above" : 256
                }
              }
            },
            "summary" : {
              "type" : "text",
              "fields" : {
                "keyword" : {
                  "type" : "keyword",
                  "ignore_above" : 256
                }
              }
            },
            "title" : {
              "type" : "text",
              "fields" : {
                "keyword" : {
                  "type" : "keyword",
                  "ignore_above" : 256
                }
              }
            },
            "updatedAt" : {
              "type" : "date"
            }
          }
        },
        "units" : {
          "properties" : {
            "id" : {
              "type" : "long"
            }
          }
        }
      }
    }
  }
}
2

सबसे अच्छा जवाब

1

कैसे सूचकांक मानचित्रण बनाया? यह की तरह नहीं लगती वसंत डेटा Elasticsearch यह लिखा था मानचित्रण. नेस्टेड प्रकार के offerTranslations याद आ रही है के रूप में आप को देखा और पाठ क्षेत्रों के लिए एक .keyword subfield. यह की तरह लग रहा है डेटा में डाला गया था सूचकांक बिना एक मानचित्रण परिभाषित किया है और इसलिए Elasticsearch था एक स्वत: मानचित्रण. इस मामले में, मूल्यों के @Field एनोटेशन इस्तेमाल नहीं कर रहे हैं.

आप की जरूरत है करने के लिए वसंत डेटा Elasticsearch बनाने के लिए सूचकांक के साथ मानचित्रण. यह होगा स्वचालित रूप से अगर सूचकांक नहीं करता है, मौजूद है, और आप का उपयोग कर रहे हैं वसंत डेटा Elasticsearch खजाने, या आप की जरूरत है का उपयोग करने के लिए IndexOperations.createWithMapping समारोह में अपने आवेदन.

एक और बात मैंने देखा: यह लगता है आप का उपयोग कर रहे हैं एक ही इकाई वर्ग के लिए अलग अलग वसंत डेटा स्टोर मिश्रण, भारी एनोटेशन. आप का उपयोग करना चाहिए अलग अलग संस्थाओं के लिए अलग-अलग दुकानों.

2021-11-22 17:12:04

मैंने हटाने की कोशिश की मैपिंग का उपयोग कर kibana : हटाएँ प्रस्ताव/_mapping और reindexing मेरी प्रदान करता है. लेकिन हो सकता है का उपयोग कर एक स्पष्ट "createWithMapping" बेहतर काम हो सकता है, मैं दूँगा तुम्हें पता है अगर यह मदद करता है ! धन्यवाद वैसे भी
Aymane EL Jahrani

हैलो, तो मैं प्रयोग करने की कोशिश की createWithMapping, लेकिन यह करता है करने के लिए प्रतीत नहीं हो सकता है सरल है । आप पुष्टि कर सकते हैं कि यह सही तरीका है, का उपयोग करने के यह ? github.com/spring-projects/spring-data-elasticsearch/blob/main/...
Aymane EL Jahrani
0

चरणों को हल करने के लिए :

  • उपयोग Kibana करने के लिए सुनिश्चित करें कि आप हटाएँ <index_name>/_mapping
  • देखो में अपने इकाई वर्गों के लिए आप की जरूरत की वस्तुओं में हो सकता है कि एक @JsonIgnoreProperties
  • सुनिश्चित करें कि आप उत्सुकता से अपने toMany रिश्ते की विशेषताओं (अन्यथा लोचदार नहीं होंगे बनाने के लिए एक मानचित्रण के लिए एक डेटा आप कभी नहीं दिया)
  • इस छोटे से अनुभव में, मैं कह सकता हूँ का उपयोग कर से बचने नेस्टेड फ़ील्ड, मैं नहीं देख सकता किसी भी लाभ के लिए उन्हें का उपयोग कर. तो जाँच करें कि अगर मामला है आप के लिए भी !
2021-11-25 23:17:34

वसंत डेटा Elasticsearch dos कुछ भी नहीं के साथ @JsonIgnoreProperties एनोटेशन. Elasticsearch कोई संबंधपरक डेटाबेस और कोई धारणा के बीच संबंधों की संस्थाओं.
P.J.Meisch

यह सच है, लेकिन वसंत नहीं है कि जब serialising डेटा. कि कैसे मैं मेरे संस्थाओं ...
Aymane EL Jahrani

वसंत अपने आप नहीं करता है कि. वसंत डेटा जेपीए करता है कि उदाहरण के लिए. वसंत डेटा Elasticsearch यह नहीं करता है । इन अलग-अलग हैं वसंत डेटा मॉड्यूल.
P.J.Meisch

पुस्तकालय fasterxml.जैक्सन करता है कि ,और यह काम करता है का उपयोग एनोटेशन पर जेपीए/हाइबरनेट संस्थाओं. है कि क्या मैं का उपयोग इस परियोजना में के रूप में आप देख सकते हैं अपने कोड में...
Aymane EL Jahrani

अन्य भाषाओं में

यह पृष्ठ अन्य भाषाओं में है

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................

इस श्रेणी में लोकप्रिय

लोकप्रिय सवाल इस श्रेणी में