Jar elastická : Aký je správny spôsob, ako pomocou vnorených polí?

0

Otázka

Som celkom nový ElasticSearch. Pracujem na projekte, kde sme musieť hľadať objekt (Ponuka), ktorý obsahuje dve (OfferTranslation). Cieľom je, aby sa výskumu založeného na niektoré Ponúkajú polia, ale aj veľa OfferTranslation polia. Tu je minified verzia oboch tried :

Offer.class (všimnite si, že som anotované Súbor s @Oblasti(typ= FieldType.Vnorená), takže môžem urobiť Vnorené dotazy, ako mentionned v úradnom doc) :

@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;
}

Očakávané správanie by sa, že môžem robiť nestedQueries ako tak :

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

Ale to, čo som si výnimka : nepodarilo sa vytvoriť dotaz: [vnorené] vnorených objektov v rámci cesta [offersTranslations] nie je vnorených typ"

EDIT : mám prístup offersTranslations.jazyk.kód pomocou bežnej otázky (čo nie je naozaj trápi ma na chvíľu). Ale ja som stále nechápe.

Môj mapovanie hovorí oblasti offersTranslations nie je z vnorenej typ ako môžete vidieť vyššie, ale keďže som použil @Oblasti(typ = FieldType.Vnorené) nemám naozaj pochopili, že správanie. Mohol by niekto vysvetliť?

{
  "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

Najlepšiu odpoveď

1

Ako bolo index mapovanie vytvorili? To nevyzerá, Jar Údaje Elasticsearch napísal toto mapovanie. Vnorené typ offerTranslations chýba ako ste videli, a textové polia sa majú .keyword čiastkové pole. To vyzerá ako údaje boli vložené do indexu bez toho, mapovanie definovaný a tak Elasticsearch urobil automatické mapovanie. V tomto prípade, hodnoty @Field anotácie, ktoré nie sú používané.

Musíte mať na Jar Údaje Elasticsearch vytvoriť index s mapovanie. To sa stane automaticky, ak index neexistuje a používate Jar Údaje Elasticsearch úložísk, alebo budete musieť použiť IndexOperations.createWithMapping funkciu v aplikácii.

Ďalšia vec, ktorú som si všimol: zdá sa, že používate rovnaký subjekt trieda pre rôzne Jarné Dátové sklady, miešanie silne anotácií. Mali by ste používať rôzne subjekty, na rôznych obchodoch.

2021-11-22 17:12:04

Snažil som sa odstrániť a mapovanie pomocou kibana : ODSTRÁNIŤ ponuka/_mapping a reindexing moje ponuky. Ale možno pomocou explicitné "createWithMapping" by mohlo fungovať lepšie, dám vám vedieť, či to pomáha ! Ďakujeme, že ste aj tak
Aymane EL Jahrani

Ahoj, tak som sa snažil pomocou createWithMapping, ale nezdá sa to byť jednoduché. Môžete potvrdiť, že toto je správny spôsob, ako ho používať ? github.com/spring-projects/spring-data-elasticsearch/blob/main/...
Aymane EL Jahrani
0

KROKY NA RIEŠENIE :

  • Použitie Kibana uistite sa, že ODSTRÁNIŤ <index_name>/_mapping
  • Pozrite sa do účtovnej triedy pre objekty, ktoré potrebujete, ktoré by mohli byť v @JsonIgnoreProperties
  • Uistite sa, že ste NETRPEZLIVO zaťaženie vášho toMany vzťah atribúty (inak elastické nebude vytvoriť mapovanie pre dáta, ktoré si nikdy nedával)
  • Z tohto málo skúseností, by som povedal, vyhnite sa použitie Vnorených polí, nemohol som vidieť žiadne výhody ich používania. Tak sa pozrite, či to platí aj pre vás !
2021-11-25 23:17:34

Jar Údaje Elasticsearch dos nič robiť, s @JsonIgnoreProperties anotácia. Elasticsearch nie relačnej databázy a nemá pojem vzťahy medzi entitami.
P.J.Meisch

To je pravda, ale na jar sa, že keď serialising údajov. To je, ako mi subjekty ...
Aymane EL Jahrani

Jar sám nie je to, že. Jar Údaje JPA znamená to, že napríklad. Jar Údaje Elasticsearch nerobí to. Tieto sú rôzne Jarné Údaje moduly.
P.J.Meisch

Knižnica fasterxml.jackson to ,a funguje to pomocou anotácií na JPA/Hibernate subjektov. To je to, čo môžem použiť v tomto projekte ako môžete vidieť v mojom kód...
Aymane EL Jahrani

V iných jazykoch

Táto stránka je v iných jazykoch

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