【问题标题】:Lucene search returns no resultLucene 搜索没有返回结果
【发布时间】:2013-08-21 14:28:22
【问题描述】:

我正在尝试使用 hibernate-search-4.3.0.Final.jar 创建一个休眠全文搜索 此应用程序没有错误,但我的 Lucene 查询取消查询 DSL 不会返回任何结果。 我的意思是它不会返回表中的任何行。谁能帮帮我。

这是我的功能:

OgmConfiguration cfgogm=new OgmConfiguration();
        cfgogm.configure("hibernate.cfg.xml");
        serviceregistry=new ServiceRegistryBuilder().applySettings(cfgogm.getProperties()).buildServiceRegistry();
        sessionfactory=cfgogm.buildSessionFactory(serviceregistry);         
        Session session= sessionfactory.openSession(); 


        FullTextSession fulltextsession= Search.getFullTextSession(session);
        QueryBuilder querybuilder=fulltextsession.getSearchFactory().buildQueryBuilder().forEntity(User.class).get();
        org.apache.lucene.search.Query lucenequery=querybuilder.keyword().onField("IdU").matching("96645").createQuery();
        org.hibernate.search.FullTextQuery fulltextquery=fulltextsession.createFullTextQuery(lucenequery, User.class);
        List result=fulltextquery.list();
        System.out.println(result.toString());

这是我的 POJO 类:

@Entity
@Table(name="Users")
@Indexed
public class User {
    @Id
    @GeneratedValue(generator="mongodb_uuidgg")
    @Field(index = Index.YES,analyze = Analyze.NO,store = Store.NO)
    private String  _id;
    @Column(name="City")
    @Field(index = Index.YES,analyze = Analyze.NO,store = Store.NO)
    private String city;
    @Column(name="UserID")
    @Field(index = Index.YES,analyze = Analyze.NO,store = Store.NO)
    private int IdU;
...

【问题讨论】:

    标签: java hibernate lucene hibernate-search


    【解决方案1】:

    我会使用 Luke 来验证您的查询是否确实从索引中返回了您想要的内容。

    [编辑...] 如果 Luke 显示索引为空,则需要查看索引设置。

    【讨论】:

    • 谢谢。 zou 可以解释一下,我如何使用 Luke 来验证我的查询是否从索引中返回了我想要的内容
    • 我尝试使用 Luke,但是当我导航到索引文件夹时,我没有得到任何结果,它显示(字段数:0,文档数:0,术语数:0)
    【解决方案2】:

    很可能是 id 字段的配置不正确。应该是:

    @Id
    @GeneratedValue(generator="mongodb_uuidgg")
    @DocumentId
    private String  _id;
    

    (即@DocumentId 而不是@Field)。

    【讨论】:

    • 感谢您的回答,我已经更改了代码,但问题仍然存在
    【解决方案3】:

    您是否真的为数据编制了索引?如果您从现有数据库开始,则需要创建初始索引。您可以使用程序化索引 API 和海量索引器来创建初始索引。一旦你有了初始索引并且你正在使用增量索引,索引将与数据库更改保持同步(假设更改是通过 Hibernate/JPA API 进行的)。

    除此之外,请查看 lg 文件。里面有东西吗?如果您仍有问题,请发布您用于索引数据的代码。

    【讨论】:

    • 嗨哈迪,谢谢你的回答 :) 我对索引所做的唯一事情是:在课堂顶部写 @indexed 并为我写的每个字段 @Field(index = Index.YES,analyze = Analyze.NO,store = Store.NO) 我正在使用 MongoDB我想实现一个非常简单的查询,例如“SELECT City FROM Users WHERE UserID=***”。我应该控制哪个日志文件?对于 lucene,我有一个目录,它们看起来都像 this
    • 我又写了一个Post,也许你能找到更多信息
    • 卢克截图显示没有文档,所以你需要先索引。如果您想索引现有数据库中的数据,请查看docs.jboss.org/hibernate/stable/search/reference/en-US/…。如果您从一个空数据库开始,您将需要通过 JPA/Hibernate API 插入数据并依赖自动索引更新。您不能将 Hibernate Search 指向现有数据库并期望一切正常。在某个阶段,需要先构建索引。