【问题标题】:Hibernate search ignore analyzer in query查询中的休眠搜索忽略分析器
【发布时间】:2013-03-04 16:04:02
【问题描述】:

我正在尝试使用聚合两个字段的自定义字段桥来查询字段。典型值如下所示:

myField:12345%FIELDSEPERATOR%4

这是 12345 和 4 的组合。索引正确,但是使用 hibernate 搜索查询 API,如何禁用分析器?

FullTextEntityManager em = getFTEM();
SearchFactory searchFactory = em.getSearchFactory();
QueryBuilder qb = searchFactory.buildQueryBuilder().forEntity(User.class).get();
Query q = qb.phrase()
            .onField("myField")
            .ignoreAnalyzer()
            .sentence("12345%SEPERATOR%4")
            .createQuery();

q 这里被解析为myField:"12345 seperator 4",这会破坏搜索,即使我指定了ignoreAnalyzer。为了比较,下面会生成一个有效的查询

TermQuery tq = new TermQuery(new Term("myField", "12345%SEPERATOR%4"));

结果查询:myField:"12345%SEPERATOR%4"

我知道我可以简单地使用 TermQuery,但我想享受 Hibernate 搜索的其他简单功能,例如 .boostedTo()。

使用内部使用 Lucene 3.1 的 Hibernate Search 3.4.2

【问题讨论】:

    标签: lucene hibernate-search


    【解决方案1】:

    问题是你定义了一个短语查询,你应该使用keyword

    Query q = qb.keyword()
        .onField( "myField" )
        .matching( "12345%SEPERATOR%4" )
        .createQuery();
    

    【讨论】:

    • 啊,我使用了短语查询,因为我看到了将字段组合在单个字符串中的示例,这些字段表明需要短语查询。谢谢!
    • 虽然引入了新问题......只是将短语替换为关键字会导致 org.hibernate.search.SearchException: Unable to find field myField in com.my.app.User,即使最明确存在这样的领域。有什么想法吗?
    • @RasmusFranke 我认为您可能需要发布一个新问题,在那里您可以显示 com.my.app.User 的相关部分,以获得一个体面的答案。
    • 很公平,虽然现在可能不使用纯 lucene api,因为它可以正常工作
    • 如果您使用的是在类桥中创建的字段,Hibernate Search 不会知道它。在这种情况下,您应该使用 ignoreFieldBridge 来防止异常
    猜你喜欢
    • 1970-01-01
    • 2015-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多