IndexedEmbedded List - 在字段名称中添加元素索引

时间:2014-10-03 08:36:12

标签: java lucene hibernate-search

我有以下hibernate搜索映射:

public class Courrier  {

  @IndexedEmbedded(depth = 2)
  @OneToMany(mappedBy = "courrier", cascade = CascadeType.ALL)
  @OrderBy("id")
  private List<CourrierClassification> classifications;

索引是正常的,但列表的每个条目的字段名称都相同:

classifications.id 
classifications.id 
... 

有没有办法将元素索引附加到字段名称,以便我可以区分条目(顺序很重要)

classifications1.id 
classifications2.id 
....

2 个答案:

答案 0 :(得分:3)

不,你不能。您无法保持列表元素的顺序。此外,如果字段名称会根据您的建议而有所不同,您如何知道在查询中要定位哪些字段?

您可以编写自定义桥,在这种情况下,您可以添加任意字段名称。我只是提到这个是完整的。我不建议将列表顺序编码到字段名称中。也许您可以解释一下您的用例以及您想要查询的内容和方式?可能还有其他方法可以实现您的目标。

最后但并非最不重要的是,除非您的课程中存在循环引用,又称CourrierClassification引用Courrier,否则不需要depth属性。

答案 1 :(得分:0)

我使用FieldBridge将具有自定义名称的字段添加到文档中。它有效。

@Field
  @FieldBridge(impl = ClassificationFieldBridge.class)
  @OneToMany(mappedBy = "courrier", cascade = CascadeType.ALL)
  @OrderBy("id")
  private List<CourrierClassification> classifications;

田野桥Impl:

    public class ClassificationFieldBridge implements FieldBridge {

      @Override
      public void set(String name, Object value, Document luceneDocument, LuceneOptions luceneOptions) {
        ......
List<CourrierClassification> listClassifications = (List<CourrierClassification>) value;
        int i = 1;
        for (CourrierClassification courrierClassification : listClassifications) {
          ValeurGenerique valeurGenerique = courrierClassification.getValeur();

          Field field = new Field(name + i + ".valeur.rechercheLuceneNonTokenise", valeurGenerique.getRechercheLucene(), Field.Store.NO, Field.Index.NOT_ANALYZED);
          luceneDocument.add(field);
相关问题