首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Hibernate-search 5.0空间返回无结果

Hibernate-search 5.0空间返回无结果
EN

Stack Overflow用户
提问于 2014-12-25 09:11:06
回答 1查看 161关注 0票数 0

我正在创建一个函数,它将使用户能够搜索附近的停车场,这是用户的当前位置周围10公里。

我正在使用Spring Hibernate和MySQL5InnoDBDialect。我尝试使用hibernate search 5.0.Final库来实现此功能,并遵循本教程的https://docs.jboss.org/hibernate/search/5.0/reference/en-US/html/spatial.html#spatial-queries-distance

但是,在我触发查询后,没有返回任何结果。我使用的是hibernate-core 4.3.7

休眠设置

注意:文件系统提供者= filesystem,indexbase = lucene/

代码语言:javascript
运行
复制
<!-- Hibernate SessionFactory -->
<beans:bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
    <beans:property name="dataSource" ref="dataSource" />
    <beans:property name="packagesToScan" value="com.jinheng.fyp.bean" />
<!--  Naming strategy  -->
    <beans:property name="namingStrategy" ref="myNaming" />
    <beans:property name="hibernateProperties">
        <beans:props>
            <beans:prop key="hibernate.dialect">${hibernate.dialect}</beans:prop>
            <beans:prop key="hibernate.show_sql">${hibernate.show_sql}</beans:prop>
            <beans:prop key="hibernate.format_sql">${hibernate.show_sql}</beans:prop>
            <beans:prop key="hibernate.generate_statistics">${hibernate.generate_statistics}</beans:prop>
            <beans:prop key="hibernate.hbm2ddl.auto">${hibernate.hbm2ddl.auto}</beans:prop>
            <beans:prop key="cache.provider_class">org.hibernate.cache.NoCacheProvider</beans:prop>
            <beans:prop key="hibernate.default_batch_fetch_size">15</beans:prop>
            <beans:prop key="hibernate.use_sql_comments">true</beans:prop>
            <beans:prop key="hibernate.default-lazy">true</beans:prop>
            <beans:prop key="hibernate.order_updates">true</beans:prop>
            <beans:prop key="hibernate.connection.CharSet">utf8</beans:prop>
            <beans:prop key="hibernate.connection.characterEncoding">utf8</beans:prop>
            <beans:prop key="hibernate.connection.useUnicode">true</beans:prop>
            <beans:prop key="hibernate.query.substitutions">true 1, false 0, yes 'Y', no 'N'</beans:prop>
            <beans:prop key="hibernate.hbm2ddl.import_files_sql_extractor">org.hibernate.tool.hbm2ddl.MultipleLinesSqlCommandExtractor</beans:prop>
            <beans:prop key="hibernate.jdbc.use_streams_for_binary">false</beans:prop>
            <beans:prop key="hibernate.connection.isolation">4096</beans:prop>
            <beans:prop key="hibernate.search.default.directory_provider">${hibernate.search.default.directory_provider}</beans:prop>
            <beans:prop key="hibernate.search.default.indexBase">${hibernate.search.default.indexBase}</beans:prop>
            <beans:prop key="hibernate.search.lucene_version">4.1.0</beans:prop>
        </beans:props>
    </beans:property>
</beans:bean>

停车场级别

代码语言:javascript
运行
复制
@Entity
@Spatial(spatialMode = SpatialMode.HASH)
@Indexed
public class Lot extends BasicTable {

private static final long serialVersionUID = 1L;

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer lotID;

private String lotName;

private String lotType;

@Longitude
private Double longitude;

@Latitude
private Double latitude;

private String address;

private String operationHour;

private Integer capacity;

private String availability;

//getsetmethods

查询DAO类

代码语言:javascript
运行
复制
@Repository
@Transactional
public class MapDAOImpl extends GenericDAO implements MapDAO {

@SuppressWarnings("unchecked")
@Override
public List<Lot> getNearbyLot(Double latitude, Double longitude, Integer radius) {
    FullTextSession fullTextSession = Search.getFullTextSession(getSessionFactory());
    QueryBuilder builder = fullTextSession.getSearchFactory().buildQueryBuilder().forEntity(Lot.class).get();

    org.apache.lucene.search.Query luceneQuery = builder.spatial().within(radius, Unit.KM).ofLatitude(latitude).andLongitude(longitude).createQuery();

    org.hibernate.Query hibernateQuery = fullTextSession.createFullTextQuery(luceneQuery, Lot.class);
     //this code works
    // org.hibernate.Query hibernateQuery = getSessionFactory().createSQLQuery("SELECT * FROM LOT").addEntity(Lot.class);
    List<Lot> result = hibernateQuery.list();
    return result;
}
}
EN

回答 1

Stack Overflow用户

发布于 2015-10-25 18:27:25

它被埋藏在文档中

http://docs.jboss.org/hibernate/search/5.4/api/org/hibernate/search/query/dsl/SpatialContext.html#onField%28java.lang.String%29

SpatialContext.onField():基本上,如果您不提供onField(),它就不会工作,它不会为您找到要搜索的字段的名称。这是实现这一点的一种方法:

代码语言:javascript
运行
复制
org.apache.lucene.search.Query luceneQuery = spatialContext.onField("physical").within(100, Unit.KM).ofLatitude(centerLatitude).andLongitude(centerLongitude).createQuery();

"physical“这里是添加到@空间@纬度和@经度的属性'name‘的值(如https://docs.jboss.org/hibernate/search/5.0/reference/en-US/html/spatial.html#spatial-multiplecoordinates中所示)

我的例子:

代码语言:javascript
运行
复制
@javax.persistence.Entity @Indexed  @Spatial(name="physical")
public class Tutorial implements IBusiness {

@Latitude(of="physical") @Column
private Double latitude;
@Longitude(of="physical")  @Column
private Double longitude;
[... cut ...]

它对我很有效,我希望它能帮助未来的读者。Lucene是一个很棒的API,Hibernate也是,但是它们太广泛了……可能是时候重构一下文档了!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27643495

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档