Фильтр Hibernate не работает при индексации через поиск Hibernate - PullRequest
1 голос
/ 25 августа 2011

Я пытаюсь проиндексировать встроенную коллекцию (Set), имеющую связь «один ко многим», с помощью @ IndexedEmbedded. Проблема в том, что мы просто удаляем записи в нашем приложении, и я хочу применить фильтр гибернации к индексированной коллекции. чтобы исключить логически удаленные записи при индексации.

@Index
Class A {

@IndexedEmbedded
@OneToMany(targetEntity = B.class, fetch = FetchType.EAGER)
@Filter(name = "deletedRecordsFilter")
Set<B> setOfBs;

 }

Для индексации:

            FullTextSession fts = getFullTextSession();
            fts.createIndexer(entityClass)
            .purgeAllOnStart(true)
            .optimizeAfterPurge(true) 
            .optimizeOnFinish(true)
            .batchSizeToLoadObjects(30)
            .threadsForSubsequentFetching(8)
            .threadsToLoadObjects(4)
            .threadsForIndexWriter(3)
            .startAndWait();

Я включил фильтр, используя session.enableFilter ("Удаленный_фильтр"). Данные проиндексированы, но фильтр не работает должным образом. Встроенные коллекции по-прежнему содержат удаленные записи.

Это фильтры гибернации не работают при индексации через поиск в спящем режиме или я что-то упустил? Если при индексации фильтры не работают, то есть ли способ не индексировать логически удаленные записи?

1 Ответ

1 голос
/ 27 августа 2011

Вы должны использовать FullTextFilter, а не стандартный фильтр Hibernate. Я использовал один в проекте, над которым я сейчас работаю. Вы добавляете аннотацию, подобную приведенной ниже, над определением вашего индексированного класса:

@Indexed
@Entity
@FullTextFilterDefs( {
    @FullTextFilterDef(name = "includeInSearchFilter", impl = IncludeInSearchFilterFactory.class,
            cache = FilterCacheModeType.INSTANCE_AND_DOCIDSETRESULTS)
})
public class SomeEntity ...

Затем вам также нужно указать указанный класс фабрики, что-то вроде этого:

public class IncludeInSearchFilterFactory {

    private String includeInSearchResults;

    public void setIncludeInSearchResults(String includeInSearchResults) {
        this.includeInSearchResults = includeInSearchResults;
    }

    @Key
    public FilterKey getKey() {
        StandardFilterKey key = new StandardFilterKey();
        key.addParameter(includeInSearchResults);
        return key;
    }

    @Factory
    public Filter getFilter() {
        Query query = new TermQuery(new Term("includeInSearchResults", includeInSearchResults));
        return new QueryWrapperFilter(query);
    }
}

В моем случае элемент includeInSearchResults был индексированным полем для сущности, для которого было установлено значение true, если я хотел, чтобы объект был возвращен в результате поиска, в противном случае было установлено значение false.

Чтобы включить полнотекстовый фильтр:

fullTextQuery.enableFullTextFilter("includeInSearchFilter").setParameter("includeInSearchResults", "true");
...