2015-08-01 1 views
0

следующие два поля, определенные в объектеRangeQuery с полями Integer не дает ожидаемого результата

@Column(name = "min_price") 
@Field(index = Index.YES, analyze = Analyze.YES, store = Store.NO) 
@NumericField 
@FieldBridge(impl = IntegerBridge.class) 
private Integer minPrice; 

@Column(name = "max_price") 
@Field(index = Index.YES, analyze = Analyze.YES, store = Store.NO) 
@NumericField 
@FieldBridge(impl = IntegerBridge.class) 
private Integer maxPrice; 

полный текст запроса генерируется с использованием EntityManager следующим

BooleanJunction priceBooleanJunction = queryBuilder.bool(); 
    //Building range query for price 
    if (minPrice != null) { 
     Query rangeQueryMinPrice = queryBuilder.range().onField("minPrice").above(minPrice).createQuery(); 
     priceBooleanJunction.must(rangeQueryMinPrice); 
    } 
    if (maxPrice != null) { 
     Query rangeQueryMaxPrice = queryBuilder.range().onField("maxPrice").below(maxPrice).createQuery(); 
     priceBooleanJunction.must(rangeQueryMaxPrice); 
    } 

    BooleanJunction combainedBoolean = queryBuilder.bool(); 

    if (!priceBooleanJunction.isEmpty()) { 
     combainedBoolean.must(priceBooleanJunction.createQuery()); 
    } 

    Query searchQuery = combainedBoolean.createQuery(); 
    FullTextQuery query = fullTextEntityManager.createFullTextQuery(searchQuery, ServiceProvider.class); 

    LOGGER.info(query.toString()); 

последний журнал печатает следующую за 40 , 90 вход

FullTextQueryImpl(+minPrice:[40 TO *] +maxPrice:[* TO 90]) 
База данных

содержит значения (min, max) as (50, 80) и (80, 9 0)

по-прежнему результат пуст.

ответ

0

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

пытаются использовать IntegerNumericFieldBridge вместо IntegerBridge так:

@Field @FieldBridge(impl=IntegerNumericFieldBridge.class) 
private Integer price; 

После этого использования NumericRangeQuery вместо спящего режима запроса диапазона поиска. Как это:

NumericRangeQuery<Integer> integerQuery = NumericRangeQuery.newIntRange("price", minRangePrice, maxRangePrice, true, true); 

Если у вас есть много запросов, вы не сможете использовать спящий режим поиска BOOL() метод, используйте Lucene «BooleanQuery» вместо этого. Как это:

BooleanQuery luceneBooleanQuery = new BooleanQuery(); 
luceneBooleanQuery.add(integerQuery, BooleanClause.Occur.MUST); // MUST or SHOULD 
luceneBooleanQuery.add(anotherQuery, BooleanClause.Occur.MUST); 

Вы можете смешать Lucene запросы, как NumericRangeQuery и запросов, построенных QueryBuilder поиска гибернации.

Затем, вы можете сделать это:

FullTextQuery fullTextQuery = fullTextSession.createFullTextQuery(luceneBooleanQuery, YourClass.class); 

Он должен работать.

2

IntegerBridge, который вы используете, использует строковое кодирование, но вы хотите, чтобы использовать числовую кодировку при использовании запроса диапазона. В вашем случае нет необходимости добавлять @FieldBridge.

Также поведение будет зависеть от того, какую версию поиска вы используете. Предварительная версия 5 вам нужно было добавить @NumericField, но по состоянию на Hibernate Search 5 цифры будут автоматически индексироваться численно, и в этом случае @FieldBridge, а также @NumericField больше не требуется.