Запрос пространственного фасета Hibernate Search работает сначала 5 раз, затем возвращает только 5-й результат

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

Я написал код запроса, который, кажется, отлично работает для первых 5 попыток, а затем результаты "привязываются" к широте, долготе и радиусу 5-го запроса. Изменение элемента цены изменяет результаты, но только в местоположении и радиусе этого 5-го запроса.

Я не уверен, нужно ли что-либо "очищать", или это проблема конфигурации, но кажется странным, что запрос перестает работать после 5 попыток. Я смущен и не могу найти эту проблему в Интернете, поэтому любая помощь или понимание будут с благодарностью.

Вот запрос...

private List<VehicleManufacturer> getManufacturers( double valuation , double latitude , double longitude, int radius  ) throws Exception {

    long startTIme = new Date().getTime() ;

    List<VehicleManufacturer> returnedManufacturers = new ArrayList<VehicleManufacturer> () ;

    FullTextEntityManager manufacturerFullTextEntityManager = org.hibernate.search.jpa.Search.getFullTextEntityManager(em);     
    QueryBuilder manufacturerBuilder = manufacturerFullTextEntityManager.getSearchFactory().buildQueryBuilder().forEntity(AvailableVehicle.class).get() ;

    // CREATE SPATIAL AND TOP PRICE FULL TEXT QUERY
    org.apache.lucene.search.Query manufacturingSpatialQuery = manufacturerBuilder.spatial().within( radius , Unit.KM ).ofLatitude( latitude ).andLongitude( longitude ).createQuery();
    org.apache.lucene.search.Query manufacturingValuationRoof = NumericRangeQuery.newDoubleRange("valuation", 0d , valuation , true, true); 
    org.apache.lucene.search.Query manufacturingValuationAndSpatialQuery =  manufacturerBuilder.bool().must(manufacturingValuationRoof).must(manufacturingSpatialQuery).createQuery() ;         
    FullTextQuery manufacturingFullTextQuery = manufacturerFullTextEntityManager.createFullTextQuery(manufacturingValuationAndSpatialQuery,  AvailableVehicle.class);

    // FACET  REQUEST
    FacetingRequest manufacturingFacetingRequest = manufacturerBuilder.facet().name( "manufacturerFaceting"  ).onField("manufacturer").discrete().orderedBy( FacetSortOrder.FIELD_VALUE ).includeZeroCounts(false).createFacetingRequest(); 

    FacetManager facetManager = manufacturingFullTextQuery.getFacetManager();
    facetManager.enableFaceting(manufacturingFacetingRequest);       
    List<Facet> facets = facetManager.getFacets( "manufacturerFaceting" );

    for (Facet manuacturingFacet : facets) {
        VehicleManufacturer manufacturer = new VehicleManufacturer( manuacturingFacet.getValue() , manuacturingFacet.getCount() ) ;
        returnedManufacturers.add( manufacturer ) ;         
    }

    System.out.println( "MANUFACTURERS count: "  + returnedManufacturers.size() + "  time: " + ( new Date().getTime() - startTIme )  + "ms  latitude:" +  latitude + "  longitude: " + longitude  + "  radius: " + radius  ) ;

    return returnedManufacturers ;      
}

... а вот сокращенный индексированный объектный класс...

@Entity
@Indexed( index="AvailableVehicle"  )
@Spatial(spatialMode = SpatialMode.RANGE )
@Table(name = "car_available_vehicle")
public class AvailableVehicle  implements Coordinates {

@Id     
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name = "ID" )
private int id ;

@OneToOne()
@JoinColumn( name="VEHICLE_ID" )
private Vehicle vehicle ;

@Facet()
@Column(name = "MANUFACTURER" )
@Field(index=Index.YES, analyze=Analyze.NO, store=Store.NO)
private String manufacturer ;

@Facet()
@Column(name = "MODEL" )
@Field(index=Index.YES, analyze=Analyze.NO, store=Store.NO)
private String model ;

@Column(name = "LONGITUDE" )    
private Double longitude ;

@Column(name = "LATITUDE" )     
private Double latitude ;

@Column(name = "PRICE" )
@Field(index=Index.YES, analyze=Analyze.NO, store=Store.NO)
@NumericField( forField="price" )
private double price ;

@Column(name = "VALUATION" )
@Field(index=Index.YES, analyze=Analyze.NO, store=Store.NO)
@NumericField( forField="valuation" )
private double valuation ;

... и вот спящие maven зависимости...

    <dependency> 
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId> 
        <version>5.2.9.Final</version> 
    </dependency> 

    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-search-orm</artifactId>
        <version>5.7.0.Final</version>
    </dependency>

Спасибо за прочтение

1 ответ

Решение

Это всего лишь предположение, но вы можете нажать HSEARCH-2691. Ошибка была исправлена ​​в версии Hibernate Search 5.7.1.Final; может быть, вы могли бы попробовать эту версию?

Другие вопросы по тегам