Запросы членов кооператива с использованием любого поискового термина и идентификатора кооператива в спящем поиске - PullRequest
0 голосов
/ 03 июля 2019

Я новичок в поиске hibernate и имею эту проблему, я хочу искать членов в определенном кооперативе, используя любое из имени, среднего имени, фамилии, имени пользователя вместе с идентификатором кооператива в поиске hibernate, поиск возвращает участников, которые соответствуют любой из условий поиска без учета кооперативного идентификатора.

Ваша помощь по вышеуказанной проблеме высоко ценится, я все еще новичок в поиске в режиме гибернации, и это действительно занимает мое время.

См. Пример кода ниже:

public List<MemberProfile> searchForMember(String memberSearchTerm, int cooperativeId, int pageNumber, int pageSize) throws Exception {
        HibernateDataAccess dao = new HibernateDataAccess();
        List<MemberProfile> members = new ArrayList<>();
        try {
            dao.startOperation();

            Cooperative cooperative = (Cooperative) dao.searchObject(Cooperative.class, cooperativeId);

            FullTextSession fullTextSession = Search.getFullTextSession(dao.getSession());
            QueryBuilder qb = fullTextSession.getSearchFactory()
                    .buildQueryBuilder().forEntity(MemberProfile.class).get();

            org.apache.lucene.search.Query cooperativeQuery = qb
                    .keyword()
                    .onField("cooperative.cooperativeName")
                    .matching(cooperative.getCooperativeName())
                    .createQuery();

            org.apache.lucene.search.Query memberQuery = qb
                    .keyword()
                    .onFields("username", "firstName", "middleName",
                            "lastName", "phoneNumber", "emailAddress")
                    .matching(memberSearchTerm)
                    .createQuery();

            org.apache.lucene.search.Query luceneQuery = qb.bool()
                    .must(cooperativeQuery)
                    .must(memberQuery)
                    .createQuery();

            Query query = fullTextSession.createFullTextQuery(luceneQuery, MemberProfile.class)
                    .setFirstResult((pageNumber - 1) * pageSize)
                    .setMaxResults(pageSize);
            members = query.getResultList();

            dao.commit();
        } catch (Exception ex) {
            dao.rollback();
            logger.error("error thrown - ", ex);
            throw new Exception(ex);
        } finally {
            dao.closeSession();
        }
        return members;
    }

Ответы [ 2 ]

1 голос
/ 04 июля 2019

Запрос кажется правильным.Мое предположение состоит в том, что в названии кооператива есть какое-то общее слово (например, «кооператив» или «кооператив»), и запрос на имя кооператива заканчивается совпадением множества различных кооперативов.

Поскольку у вас естьID в качестве ввода, вам лучше будет выполнить запрос непосредственно по кооперативному идентификатору.

Сначала убедитесь, что код кооператива включен в ваш @IndexedEmbedded:

public class MemberProfile {

   // ...

   @ManyToOne
   @IndexedEmbedded(includeEmbeddedObjectId = true) // Change this
   private Cooperative cooperative;

   // ...

}

Затемпереиндексировать ваши данные.

Затем измените эту часть кода:

            Cooperative cooperative = (Cooperative) dao.searchObject(Cooperative.class, cooperativeId);

            FullTextSession fullTextSession = Search.getFullTextSession(dao.getSession());
            QueryBuilder qb = fullTextSession.getSearchFactory()
                    .buildQueryBuilder().forEntity(MemberProfile.class).get();

            org.apache.lucene.search.Query cooperativeQuery = qb
                    .keyword()
                    .onField("cooperative.cooperativeName")
                    .matching(cooperative.getCooperativeName())
                    .createQuery();

на эту:

            FullTextSession fullTextSession = Search.getFullTextSession(dao.getSession());
            QueryBuilder qb = fullTextSession.getSearchFactory()
                    .buildQueryBuilder().forEntity(MemberProfile.class).get();

            org.apache.lucene.search.Query cooperativeQuery = qb
                    .keyword()
                    .onField("cooperative.id")
                    .matching(cooperativeId)
                    .createQuery();
0 голосов
/ 06 июля 2019

Я наконец-то нашел решение, мне пришлось установить Analyze.YES для Analyze.NO на кооперативном объекте и переиндексировать мой объект, как показано ниже: Большое спасибо @yrodiere, я очень благодарен за вашу помощь.

@ индексируются Открытый класс Кооператив реализует java.io.Serializable {

 @DocumentId
 private int id;
 private Long version;
 private CooperativeIndustry cooperativeIndustry;
 private CurrencyType currencyType;
 private FrequencyOfContribution frequencyOfContribution;
 private State state;
 private String cooperativeCode;
 @Field(index = Index.YES, analyze = Analyze.NO, store = Store.NO)
...