Hibernate Search - поиск в заданной области - PullRequest
1 голос
/ 19 февраля 2010

Допустим, у меня есть следующие классы. (включены только самые важные вещи)

public class Client {
    /* Some Properties */
}

public class ClientDocumentAssociation {
    @ManyToOne
    private Client client;

    /* Some Properties */
}

@Indexed
public class Document {
    @OneToOne
    private ClientDocumentAssociation clientAssociation;

    @Field(name = "text")
    private String text;

    /* Some Properties */
} 

Мой основной поиск документов выглядит так:

public List<AbstractDocument> searchDocuments(String text) {
    if (text == null) {
        return newArrayList();
    }

    FullTextEntityManager ftem = Search.getFullTextEntityManager(entityManagerProvider.get());
    MultiFieldQueryParser parser = new MultiFieldQueryParser(DOCUMENT_FIELDS, new StandardAnalyzer());
    parser.setDefaultOperator(Operator.AND);
    FullTextQuery ftq;

    try {
        Query q = parser.parse(text + "*");

        ftq = ftem.createFullTextQuery(q, Document.class);

        ftq.setMaxResults(20);

        List<AbstractDocument> results = ftq.getResultList();
        return results;
    } catch (ParseException e) {
        e.printStackTrace();
    }

    return newArrayList();
}

Теперь я хочу иметь возможность искать документы, но не в рамках всего индекса, а просто находить документы, принадлежащие данному клиенту. Единственное, что приходит мне в голову - это добавить ассоциацию в индекс и добавить идентификатор клиента в соответствующее поле поиска. Но это не кажется правильным. Должен быть другой вариант, и это то, о чем я прошу.

Ответы [ 3 ]

2 голосов
/ 20 февраля 2010

Почему ваша первоначальная идея кажется неправильной? Фактически, индексирование всех данных, необходимых для поиска, является рекомендуемым способом сделать это. Для этого и существует @IndexedEmbedded. Индексирование данных также даст вам больше гибкости для изменений в запросе и / или новых запросов.

1 голос
/ 03 марта 2010

Другой способ сделать это - использовать фильтры.Фильтр может быть применен к поиску Lucene.Hibernate поддерживает добавление фильтров в качестве аннотаций и включение их во время выполнения

0 голосов
/ 19 февраля 2010

Хорошо, я действительно нашел решение. То, что мне (и всем, кто искал решение той же проблемы), требовалось настроить критерии для FullTextQuery.

    Session session = (Session) ftem.getDelegate();
    Criteria criteria = session.createCriteria(Document.class).createCriteria("clientAssociation").add(
            Restrictions.eq("client", owner));

    /* .... */

    ftq.setCriteriaQuery(criteria);

Кажется, работает нормально :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...