Hibernate Search java spring, поиск только сущностей, которые имеют идентификаторы как указано - PullRequest
0 голосов
/ 27 мая 2019

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

ТОЛЬКО ПОИСК В ЭТИХ ЛИЦАХ (Список предоставленных идентификаторов):

+(title:slovakia~2 leadText:slovakia~2 body:slovakia~2 software:slovakia~2) +verified:true +eid:(113 | 112 | 3)

enter image description here

Затем я получаю 0 результатов, эти объекты индексируются и сохраняются, все должно работать нормально, но результаты не возвращаются.

Здесь определено свойство объекта:

@Id
@GeneratedValue
@Field(name = "eid")
@FieldBridge(impl = LongBridge.class)
private long id;

Я пробовал, без полевого моста, с TermVector.YES, а также без каких-либо дополнительных аннотаций @Field .. Все результаты либо исключение, либо просто нет результатов.

Как правильно искать по определенным идентификаторам?

Например, вот рабочий запрос: enter image description here

Создание запроса выглядит так:

    return Optional.of(getQueryBuilder()
            .keyword()
            .onField("eid")
            .matching(stringBuilder.toString())
            .createQuery());

Ответы [ 2 ]

1 голос
/ 27 мая 2019

Синтаксис, который вы пытались использовать, (113 | 112 | 3), в этом контексте неверен.Параметры запроса keyword не интерпретируются, в частности, операторы не поддерживаются.

Вместо этого используйте булево соединение, которое соответствует любому из предоставленных идентификаторов:

List<String> eids = ...;

QueryBuilder qb = getQueryBuilder();

BooleanJunction<?> idJunction = qb.bool();

for (String eid : eids) {
    idJunction.should(
            qb.keyword()
                .onField("eid")
                .matching(eid)
                .createQuery()
    );
}

return idJunction.createQuery();

Обратите внимание, что еслиВы хотите добавить другие запросы, вы не должны использовать тот же переход.Используйте другой переход, включающий idJunction.createQuery() в качестве одного из его пунктов.

0 голосов
/ 27 мая 2019

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

QueryBuilder qb = getQueryBuilder();
BooleanJunction<?> idJunction = qb.bool();
 bool.must(NumericRangeQuery.newLongRange("eid", Long.valueOf(eid), Long.valueOf(eid), true, true).createQuery();

В этом случае в штучной упаковке Long.valueOf() является необязательным, если вводимые значения уже являются длинными значениями.

...