Hibernate поиск слишком мало результатов - PullRequest
0 голосов
/ 27 ноября 2018

У меня есть отношение: Document2 ->* DocVersion означает, что документ имеет несколько версий, чтобы быть понятным.

Теперь я хочу получить все DocVersion s на основе уникального поля Document2 s.

Entities:

@Indexed
@Entity
public class DocVersion implements Serializable {

    ...
    @Id
    @Column(name = "version_id")
    @GeneratedValue(strategy = GenerationType.SEQUENCE)
    private long id;
    ...

    @IndexedEmbedded
    @ManyToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    @JoinColumn(name = "doc_uuid")
    private Document2 document2;

    @Field
    private String versionVed;

    private String versionOKM;

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        DocVersion version = (DocVersion) o;
        return id == version.id &&
            Objects.equals(versionVed, version.versionVed) &&
            Objects.equals(versionOKM, version.versionOKM);
    }

    @Override
    public int hashCode() {

        return Objects.hash(id, versionVed, versionOKM);
    }
}


@Indexed
@Entity
public class Document2 implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE)
    @Column(name = "doc_uuid")
    private long id;

    @Field
    @Analyzer(impl = WhitespaceAnalyzer.class)
    @Column(name = "uuid")
    private String UUID;

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Document2 document2 = (Document2) o;
        return Objects.equals(UUID, document2.UUID);
    }

    @Override
    public int hashCode() {

        return Objects.hash(UUID);
    }

}

Вот как я строю запрос:

        QueryBuilder b = fullTextEntityManager.getSearchFactory()
                .buildQueryBuilder()
                .forEntity(DocVersion.class)
                .get();

        BooleanQuery.Builder builder = new BooleanQuery.Builder();

builder.add(b.simpleQueryString().onField("document2.UUID").matching(val)
                        .createQuery(), MUST);

List<DocVersion> results = fullTextEntityManager.createFullTextQuery(builder.build(), DocVersion.class).getResultList();

и я получаю один результат.Я считаю эту ошибку, потому что у UUID документа, который я запрашиваю, есть больше (два) DocVersion s.Конечно, БД возвращает две строки.Так почему я получаю только один с Lucene?Как это исправить?

hibernate-search: 5.9.3.Final

Ответы [ 2 ]

0 голосов
/ 29 ноября 2018
* * * * * * Все ответы были верны и заслуживают внимания для тех, кто решает эту проблему, для меня причиной "неправильного поведения" были плохие данные в базе данных на одном из проиндексированных листьев с нулевым значением, которое не выполнял hibernate-searchпоэтому я упустил результаты.
0 голосов
/ 27 ноября 2018

Убедитесь, что:

  1. Вы правильно установили DocVersion.document2 всякий раз, когда сохраняете значение DocVersion.Распространенной ошибкой является забытие устанавливать обе стороны двунаправленной ассоциации (то есть, может быть, вы просто назвали что-то вроде document2.getVersions().add(version), но не version.setDocument2(document2)).
  2. Вы переиндексировали с момента последнего изменения сопоставления поиска Hibernate.Вы можете использовать массовый индексатор , если хотите переиндексировать из уже заполненной базы данных.

Кроме того, это плохая идея, которая может привести к неожиданному поведению:

@Field
@Analyzer(impl = WhitespaceAnalyzer.class)
@Column(name = "uuid")
private String UUID;

Поле UUID не является подходящим кандидатом для полнотекстового поиска, поскольку вам, вероятно, нужны точные совпадения.Просто отключите анализ:

@Field(analyze = Analyze.NO)
@Column(name = "uuid")
private String UUID;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...