Как да търсите със заместващи знаци в множество полета?

Опитвам се да внедря търсене, базирано на хибернация-търсене. Успях да комбинирам полета за търсене въз основа на някакво условие, но в този случай не мога да търся със заместващи знаци.

    List<String> spalten = new ArrayList<String>();

    FullTextEntityManager fullTextEntityManager = org.hibernate.search.jpa.Search
            .getFullTextEntityManager(em);

    QueryBuilder qb = fullTextEntityManager.getSearchFactory()
            .buildQueryBuilder().forEntity(BeitragVO.class).get();

    List<BeitragVO> results;
        // add fields for search
        List<String> fields= new ArrayList<String>();

        if (student) {
            logger.info("hit student");
            spalten.add("user.surname");
            spalten.add("user.givenname");
        }
        if (company) {
            logger.info("hit company");
            spalten.add("company.name");
        }

        for (String string : fields) {
            logger.info(string);
        }
        logger.info("Searchterm:" + searchterm);
        org.apache.lucene.search.Query luceneQuery = qb.keyword()
                .onFields(fields.toArray(new String[fields.size()]))
                .matching(searchterm).createQuery();

        logger.info("Query: " + luceneQuery.toString());

        javax.persistence.Query jpaQuery = fullTextEntityManager
                .createFullTextQuery(luceneQuery, ArticleVO.class);

        results= jpaQuery.getResultList();

Под въведеното от мен търсене имам шест квадратчета за отметка, потребителят може да постави отметка или не. Ако потребителят отметне студент, търсенето се отнася само за таблицата за студенти. Това работи напълно добре!

Проблем: Въвеждане при търсене: Алексан (за Александър)

Няма резултат!

Опитах нещо подобно, за търсене със заместващи знаци:

    TermContext tc = qb.keyword();

    WildcardContext wcc = tc.wildcard();
       if (student) {

            TermMatchingContext tmc = wcc.onField("user.surname");
            tmc = tmc.andField("user.givenname");
            luceneQuery = tmc.matching(searchterm).createQuery();
        }

Това е правилен синтаксис и получавам правилната заявка (user.familia:alexander user.givenname: alexander). Но все още празен списък с резултати.

Много ми харесва опита без заместващи знаци. Има ли начин да добавите търсене със заместващ знак при този опит?


person alexander    schedule 15.02.2015    source източник


Отговори (2)


Със заместващия знак '*' трябва да работи. Ефективно трябва да изградите нещо като:

qb.keyword()
  .wildcard()
  .onField( "user.givenname" )
  .matching( "Alex*" )
  .createQuery(); 

Очевидно трябва да разложите DSL, за да добавите някаква условна логика, но трябва да работи. Сигурни ли сте, че „търсена дума“ във вашия пример има добавен заместващ знак?

Алтернатива на декомпозирането на DSL може да бъде създаването на множество независими заявки и комбинирането им чрез BooleanQuery. Мисля, че ще бъде по-четливо.

Проблемът/бъгът/функцията е коригиран! Можете да го видите тук:

https://hibernate.atlassian.net/browse/HSEARCH-1811

person Hardy    schedule 16.02.2015
comment
Е, моята гледна точка е: работи с едно поле (с wildcard()), но методът onFields() не е наличен за wildcard(). Тази „търсена дума“ НЕ съдържа заместващия знак. Дори не, ако добавя * в този термин! Мислех за BooleanQuery, но не можах да разбера как могат да бъдат полезни в моя случай. - person alexander; 16.02.2015
comment
Относно ...wildcard().onFields()... - Мисля, че това наистина е грешка/липсваща функция. Можете да създадете проблем с JIRA тук - hibernate.atlassian.net/browse/HSEARCH. Относно булевата заявка. Вижте този пример docs.jboss.org/hibernate/ stable/search/reference/en-US/. Всичко, което трябва да направите, е да създадете заявка за поле и да ги комбинирате. Не на последно място, '*' се премахва във вашия случай, защото без заместващ знак () анализаторът ще го премахне. - person Hardy; 17.02.2015
comment
Има ли някакъв шанс функцията да бъде внедрена или грешката да бъде коригирана в рамките на следващите два или три месеца? - person alexander; 17.02.2015
comment
не знам Създайте проблема и го вземете оттам. Ако искате да увеличите шансовете за интегриране, осигурете корекция. Все пак това е с отворен код и приносите винаги са добре дошли :-) - person Hardy; 17.02.2015
comment
Току-що създадох проблема, но не съм много добър в това. :D hibernate.atlassian.net/browse/HSEARCH-1811 Знаеш ли какво ми важното е, че може би можете да го редактирате малко, ако не е правилно. :-) Благодаря ти, досега! - person alexander; 17.02.2015

само Alexan ще се приеме за точно съвпадение, опитайте с Alexan*

person Atul Kumar    schedule 16.02.2015
comment
Имам много Александър и Алекс в моята база данни. Ще бъдат намерени само точни съвпадения. Дори и с . Пример: Al = няма резултат Al = няма резултат Alex = резултати - person alexander; 16.02.2015
comment
да заместващ знак lucene заявка очаквам * или ? символ като регулярен израз - person Atul Kumar; 16.02.2015