Hibernate-поиск по списку номеров - PullRequest
0 голосов
/ 04 октября 2019

Я работаю в приложении Hibernate-search, Java с сущностью, для которой индексированное числовое поле:

@Field
@NumericField
private Long orgId;

Я хочу получить список сущностей, которые соответствуют списку длинных значений дляэто свойство. Я использовал "simpleQueryString", потому что он позволяет использовать логику "ИЛИ" с char |для нескольких объективных ценностей. У меня есть что-то вроде этого:

queryBuilder.simpleQueryString().onField("orgId").matching("1|3|8").createQuery()

После запуска приложения mi я получаю:

Указанный запрос '+ (orgId: 1 orgId: 3 orgId: 8)' содержитСтроковый подзапрос, который нацелен на числовое кодированное поле (поля) orgId. Проверьте свой запрос или попробуйте ограничить целевые объекты.

Итак, может ли кто-нибудь сказать мне, что не так с этим кодом ?, Есть ли другой способ сделать то, что мне нужно?.

======================================== ОБНОВЛЕНИЕ 1:

yrodiere 'ответ решает проблему,но у меня есть еще одно сомнение, я хочу проверить, соответствуют ли сущности другим полям, я знаю, что могу использовать BooleanJuntion, но тогда мне нужно смешивать выражения «должен» и «должен», верно? то есть:

BooleanJunction<?> bool = queryBuilder.bool();
for (Integer orgId: orgIds) {
   bool.should( queryBuilder.keyword().onField("orgId").matching(orgId).createQuery() );
}
bool.must(queryBuilder.keyword().onField("name").matching("anyName").createQuery() );

Затем я проверяю, что сущности должны соответствовать «имени», а также они соответствуют одному из заданных orgIds, я прав?

1 Ответ

0 голосов
/ 04 октября 2019

Как говорится в сообщении об ошибке:

Указанный запрос [...] содержит подзапрос на основе строки, который нацелен на числовое кодированное поле (поля) 'orgId'.

simpleQueryString можно использовать только для таргетинга текстовых полей. Числовые поля не поддерживаются.

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

List<Integer> orgIds = Arrays.asList(1, 3, 8);

BooleanJunction<?> bool = queryBuilder.bool();
for (Integer orgId: orgIds) {
   bool.should( queryBuilder.keyword().onField("orgId").matching(orgId).createQuery() );
}
LuceneQuery query = bool.createQuery();

query willдокументы соответствия, в поле которых orgId содержится 1, 3 ИЛИ 8.

См. https://docs.jboss.org/hibernate/search/5.11/reference/en-US/html_single/#_combining_queries

РЕДАКТИРОВАТЬ: если вам нужны дополнительные пункты, я бы рекомендовал не смешиватьдолжны и должны в одном и том же логическом соединении, но вместо этого вложенные логические соединения.

Например:

BooleanJunction<?> boolForOrgIds = queryBuilder.bool();
for (Integer orgId: orgIds) {
   boolForOrgIds.should(queryBuilder.keyword().onField("orgId").matching(orgId).createQuery());
}


BooleanJunction<?> boolForWholeQuery = queryBuilder.bool();
boolForWholeQuery.must(boolForOrgIds.createQuery());
boolForWholeQuery.must(queryBuilder.keyword().onField("name").matching("anyName").createQuery());
// and add as many "must" as you need
LuceneQuery query = boolForWholeQuery.createQuery();

Технически вы можете смешивать 'must' и 'should', но эффект не будет таким, как вы ожидаете: пункты «следует» станут необязательными и увеличат количество документов только при их совпадении. Итак, не то, что вам нужно здесь.

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